Почему маска сети в Net :: IP установлена неправильно?

#perl #net-library

#perl #net-библиотека

Вопрос:

Я пытаюсь получить небольшой скрипт для распознавания данных SNMP из запроса, чтобы сохранить его в базе данных. Но я застрял при обработке данных с помощью модуля Net :: IP CPAN. Если я определяю сетевую строку, проблем нет, но у меня есть IP и маска в отдельных строках, и независимо от того, как я их соединяю, модуль всегда устанавливает маску /32 сети.

Я попробовал это так:

 my $net = "${$query_snmp->{$tablekey}}{'ipRouteMask'}/${$query_snmp->{$tablekey}}{'ipRouteDest'}";
my $IP = new Net::IP ($net) or die (Net::IP::Error());
  

Но все объекты IP всегда создаются /32 независимо от того, на что я установил маску сети. Если я определяю строку типа 192.168.0.0/20 или что-либо в той же строке, я не нахожу проблем.

Чего мне не хватает?

 Network -> 192.168.65.64/255.255.255.248

IP  : 192.168.65.64
LASTIP  : 192.168.65.64
Sho : 192.168.65.64
Bin : 11000000101010000100000101000000
Int : 3232252224
*** Mask: 255.255.255.255 *** wtf ??
Last: 192.168.65.64
Len : 32
Size: 1
Type: PRIVATE
Rev:  64.65.168.192.in-addr.arpa.
  

Ответ №1:

Из руководства: объект Net :: IP может быть создан из одного IP-адреса или из бесклассового префикса…

Я думаю, вы решили указать бесклассовую сеть, при условии, что вы вставляете действительный сетевой спецификатор, это работает для меня.

 #!/usr/bin/perl -w    
use Net::IP;
my $ip = new Net::IP('112.198.64.0/18') or die (Net::IP::Error());
print ("IP  : ".$ip->ip()."n");
print ("Sho : ".$ip->short()."n");
print ("Bin : ".$ip->binip()."n");
print ("Int : ".$ip->intip()."n");
print ("Mask: ".$ip->mask()."n");
print ("Last: ".$ip->last_ip()."n");
print ("Len : ".$ip->prefixlen()."n");
print ("Size: ".$ip->size()."n");
print ("Type: ".$ip->iptype()."n");
print ("Rev:  ".$ip->reverse_ip()."n");
  

выведет:

 IP  : 112.198.64.0
Sho : 112.198.64
Bin : 01110000110001100100000000000000
Int : 1892040704
Mask: 255.255.192.0
Last: 112.198.127.255
Len : 18
Size: 16384
Type: PUBLIC
Rev:  64.198.112.in-addr.arpa.
  

Однако, если вы ввели «192.168.65.64 / 255.255.255.248», это не формат, принятый Net ::IP, вы должны использовать вместо этого «192.68.65.64 / 29», см. Эту таблицу. В этом случае он будет работать правильно:

 IP  : 192.168.65.64
Sho : 192.168.65.64
Bin : 11000000101010000100000101000000
Int : 3232252224
Mask: 255.255.255.248
Last: 192.168.65.71
Len : 29
Size: 8
Type: PRIVATE
Rev:  64.65.168.192.in-addr.arpa.
  

Когда вы используете формат с полной маской сети, поскольку он не распознается, он получает только IP и выдает вам маску сети 255.255.255.255

Ответ №2:

Спасибо! Я, наконец, использовал аналогичный модуль, который требует преобразования ip-маски в запись dec.

Net::Netmask -> https://metacpan.org/pod/Net::Netmask

ПОСТРОЕНИЕ

 Net::Netmask objects are created with an IP address and optionally a mask. There are     many forms that are recognized:

'216.240.32.0/24' The preferred form.

'216.240.32.0:255.255.255.0'
'216.240.32.0-255.255.255.0'
'216.240.32.0', '255.255.255.0'
'216.240.32.0', '0xffffff00'
'216.240.32.0 - 216.240.32.255'
'216.240.32.4'
A /32 block.

'216.240.32'
Always a /24 block.

'216.240'
Always a /16 block.

'140'
Always a /8 block.

'216.240.32/24'
'216.240/16'
'default' or 'any'
0.0.0.0/0 (the default route)
'216.240.32.0#0.0.31.255'
  

Спасибо.