假设有一个情况,我们要将某一个网段内的IP“一段IP”封锁起来,如192.168.0.2-192.168.0.61,请问该如何来设定这个规则?因为这个网段并没有符合任何一个CIDR网段,因此我们不能使用如“-s 192.168.0.0/28”的网段来匹配这个范围,难道真的要一行一行写吗?其实不用,早期的做法是将192.168.0.0/24切成多个小网段,再去匹配哪一个小网段与被封锁的区段比较接近,然后再将遗漏的部分补足。上边例子中的IP段中IP的数量为59个,其中最接近的方法是我们将192.168.0.0/24切成四个段,每个网段所含的IP数量为64个。
我们可以写规则如下:
iptables -A INPUT -p all -s 192.168.0.0/26 -j DROP
不过这样会有几个IP会遭到我们的错杀,可以更改写法如下:
iptables -A INPUT -p all -s 192.168.0.1 -j ACCEPTiptables -A INPUT -p all -s 192.168.0.2 -j ACCEPTiptables -A INPUT -p all -s 192.168.0.61 -j ACCEPTiptables -A INPUT -p all -s 192.168.0.62 -j ACCEPTiptables -A INPUT -p all -s 192.168.0.0/26 -j DROP
通过网段划分,我们可以将原本需要写50行的规则以短短的5行来取代,但计算过程真的很麻烦;不过有了ipt_iprange.ko模块,我们可以将上边的规则改写为:
iptables -A INPUT -m iprange --src-range 192.168.0.2-192.168.0.61 -j DROP
iprange模块提供了两个匹配参数:
--src-range: 匹配来源地址的范围,例如,iptables -A INPUT -m iprange --src-range 192.168.0.2-192.168.0.61 -j DROP
--dst-range: 匹配目的地址的范围,例如,iptables -A OUTPUT -m iprange --dst-range 192.168.0.2-192.168.0.61 -j DROP