Linux-在linux中如何将IP/掩码换算成IP段?

Linux-在linux中如何将IP/掩码换算成IP段?

夜无邪 发布于 2017-05-17 字数 864 浏览 1331 回复 3

我们在项目开发和防火墙等配置的时候,经常需要对一个IP网段进行开通或屏蔽。请问像
192.168.0.1/24 , 192.168.0.1/16 等这样的掩码表示方法,如何换算成IP段。

分享一段PHP用来判断请求IP是否在允许IP段内的函数

/**
* 判断请求IP是否在允许IP段内的函数
*
* @param string $ip IP地址
* @param string $net_addr IP地址(段)
* @param string $net_mask 掩码 0 - 32
* @return boolean
* @example ip_in_network('218.213.90.93','218.213.90.64',26) true
*/
function ip_in_network($ip, $net_addr, $net_mask){
if(empty($net_mask)){
if($ip==$net_addr)
return true;
else return false;
}
$ip_binary_string = sprintf("%032b",ip2long($ip));
$net_binary_string = sprintf("%032b",ip2long($net_addr));
return (substr_compare($ip_binary_string,$net_binary_string,0,$net_mask) === 0);
}

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

泛泛之交 2017-09-07 3 楼

先把ip转成整数, 然后使用下面的函数

// returns true if the ip hits the mask, otherwise false

bool ParseCIDRBan(unsigned int IP, unsigned int Mask, unsigned int MaskBits)
{
// CIDR bans are a compacted form of IP / Submask
// So 192.168.1.0/255.255.255.0 would be 192.168.1.0/24
// IP's in the 192.168l.1.x range would be hit, others not.
unsigned char * source_ip = (unsigned char*)&IP;
unsigned char * mask = (unsigned char*)&Mask;
int full_bytes = MaskBits / 8;
int leftover_bits = MaskBits % 8;
//int byte;

// sanity checks for the data first
if( MaskBits > 32 )
return false;

// this is the table for comparing leftover bits
static const unsigned char leftover_bits_compare[9] = {
0x00, // 00000000
0x80, // 10000000
0xC0, // 11000000
0xE0, // 11100000
0xF0, // 11110000
0xF8, // 11111000
0xFC, // 11111100
0xFE, // 11111110
0xFF, // 11111111 - This one isn't used
};

// if we have any full bytes, compare them with memcpy
if( full_bytes > 0 )
{
if( memcmp( source_ip, mask, full_bytes ) != 0 )
return false;
}

// compare the left over bits
if( leftover_bits > 0 )
{
if( ( source_ip[full_bytes] & leftover_bits_compare[leftover_bits] ) !=
( mask[full_bytes] & leftover_bits_compare[leftover_bits] ) )
{
// one of the bits does not match
return false;
}
}

// all of the bits match that were testable
return true;
}

想挽留 2017-07-12 2 楼

可以使用linux下的工具ipcalc

 ipcalc -m 192.168.0.1/28

结果:NETMASK=255.255.255.240

瑾兮 2017-06-19 1 楼

掩码的话,用2进制的位运算更合适吧,看看这个函数是否满足你的需求?

 function ip_in_network($ip, $net_addr, $net_mask) {
return (ip2long($ip) >> (32 - $net_mask) == ip2long($net_addr) >> (32 - $net_mask));
}