1.1.1.1 255.255.255.252 => 1.1.1.1/30:
my ($ip,$mask)= @_;
$mask = sprintf("%b%b%b%b",(split /\./, $mask));
my $temp = $mask =~ s/1/1/g;
$temp = 0 if(!defined $temp || $temp eq '');
my $maskip = $ip."/".$temp;
return ($maskip);
1.1.1.1/30 => 1.1.1.1 255.255.255.252:
my ($maskip) = @_;
my ($ip, $mask) = split m{/}xms, $maskip;
$maskip = $ip.' '.join '.', unpack 'C*', pack 'B32', 1 x $mask;
return ($maskip);
根据掩码获取起始和终止ip地址(网络和广播):
my ($ip,$mask) = @_;
my $bin_ip;
my $bin_mask;
map { $bin_ip .= substr(unpack("B32",pack("N",$_)) , -8);} split (/\./,$ip);
map { $bin_mask .= substr(unpack("B32",pack("N",$_)) , -8);} split (/\./,$mask);
my $hostipbbit = 32 - index($bin_mask,"0");
return 0 if($hostipbbit >= 32);
my $network = $bin_ip & $bin_mask;
my $convnetwork=oct('0b'.$network);
my $startconvip = $convnetwork;
my $endconvip = $convnetwork+2**$hostipbbit-1;
my $bin_startip = unpack("B32",pack("N",$startconvip));
$startip = sprintf ("%d.%d.%d.%d",oct('0b'.substr($bin_startip,0,8)),oct('0b'.substr($bin_startip,8,8)),oct('0b'.substr($bin_startip,16,8)),oct('0b'.substr($bin_startip,24)));
my $bin_endip = unpack("B32",pack("N",$endconvip));
$endip = sprintf ("%d.%d.%d.%d",oct('0b'.substr($bin_endip,0,8)),oct('0b'.substr($bin_endip,8,8)),oct('0b'.substr($bin_endip,16,8)),oct('0b'.substr($bin_endip,24)));
return ($startip,$endip);
设备ACl转换ip映射:
1、
acl extend number 100
rule 2 permit ip any 18.8.2.92 0.0.0.3
rule 3 permit ip any 18.8.2.48 0.0.0.7
rule 4 permit ip any 18.8.2.08 0.0.0.7
rule 5 permit ip any 18.8.2.16 0.0.0.7
2、
access-list 121 permit ip 60.3.9.1 0.0.0.7 any
sub Ip_ACL
{
my ($aclno,$ip,$any,$Ref,$rule) = @_; #rule可有可无
my $any_bin = sprintf("%08b%08b%08b%08b", ( split /\./, $any));
my $ip_bin = sprintf("%08b%08b%08b%08b", ( split /\./, $ip));
my $Tmp_bin = sprintf("%32b", (oct("0b".$any_bin) ^ (2**32)));
my $hostipbbit = 32 - index($Tmp_bin,"0");
if($hostipbbit >= 32)
{
if($rule ne '')
{
$Ref->{$ip}{'Role'} = $rule;
&Debug("$ip Role: $Ref->{$ip}{'Role'} \n", 0);
}
$Ref->{$ip}{'AclSeq'} = $aclno;
&Debug("$ip AclSeq: $Ref->{$ip}{'AclSeq'} \n", 0);
return 0;
}
my $network = $ip_bin & $Tmp_bin;
my $convnetwork=oct('0b'.$network);
my $i = 0;
for ($i; $i < 2**$hostipbbit; $i ++)
{
my $convip = $convnetwork+$i;
my $bin_startip = unpack("B32",pack("N",$convip));
$ip = sprintf ("%d.%d.%d.%d",oct('0b'.substr($bin_startip,0,8)),oct('0b'.substr($bin_startip,8,8)),oct('0b'.substr($bin_startip,16,8)),oct('0b'.substr($bin_startip,24)));
if($rule ne '')
{
$Ref->{$ip}{'Role'} = $rule;
&Debug("$ip Role: $Ref->{$ip}{'Role'} \n", 0);
}
$Ref->{$ip}{'AclSeq'} = $aclno;
&Debug("$ip AclSeq: $Ref->{$ip}{'AclSeq'} \n", 0);
}
return 0;
}
获取全部ip:
sub Ip_ANY
{
my ($ip,$mask,$Ref,$para2) = @_;
my ($bin_ip,$bin_mask);
map {$bin_ip .= substr(unpack("B32",pack("N",$_)) , -8);} split (/\./,$ip);
map {$bin_mask .= substr(unpack("B32",pack("N",$_)) , -8);} split (/\./,$mask);
my $binwork = $bin_ip & $bin_mask;
my $convnetwork=oct('0b'.$binwork);
my $hostipbbit = 32 - index($bin_mask,"0");
return 0 if($hostipbbit > 10);
my $i = 0;
for ($i; $i < 2**$hostipbbit; $i ++)
{
my $convip = $convnetwork+$i;
my $bin_startip = unpack("B32",pack("N",$convip));
$ip = sprintf ("%d.%d.%d.%d",oct('0b'.substr($bin_startip,0,8)),oct('0b'.substr($bin_startip,8,8)),oct('0b'.substr($bin_startip,16,8)),oct('0b'.substr($bin_startip,24)));
$Ref->{$ip} = $para2;
&Debug("$ip IP: $Ref->{$ip} \n", 0);
}
return 0;
}