本帖最后由 yeslab官方 于 2017-6-30 20:45 编辑
源地址匹配 前面的基本使用中我们所用到的匹配条件只有原地址,其实 iptables 的匹配条件还是挺多的,下面我们就来看看。 拿源地址匹配来说,iptables 也可以一次指定多个地址,每个地址之间用“逗号”隔开: 「iptables -I INPUT -s 10.254.1.1,10.254.1.2 -j DROP」 
除了能指定地址还能指定网段: 「iptables -I INPUT -s 10.254.0.0/16 -j DROP」 
还可以使用“!”做条件取反,“!”要放在 -s 的前面: 「iptables -I INPUT ! -s 192.168.1.1 -j DROP」 
简单解释一下这条取反的命令,它的意思是只要发往本机的包围源地址不是 192.168.1.1 那就接受这个报文。 如果现在从 192.168.1.1 ping 我们设置规则的这台主机能不能 ping 通?(考虑下) 目标地址匹配 能用源地址匹配那当然可以想到目标地址也一定可以作为匹配条件,iptables 中可以使用 -d 跟指定目标地址来作目标匹配。 在 iptables 被当做主机防火墙的时,目标地址匹配一般被应用在 OUTPUT 链上: 「iptables -A OUTPUT -d 10.254.1.2 -j DROP」 
这句命令的意思是,所有本机发往 10.254.1.2 这台主机的报文都做丢弃操作。 其实在 INPUT 链上设置目标地址的情况也很多,比如我们的主机有多张网卡也就是有多个IP 地址,而我们只想拒绝某台主机发往其中个别网卡 IP 的报文,那我们可以这样写: 「iptables -I INPUT -s 10.254.1.11 -d 10.254.1.2 -j DROP」 
上面这条命令中 -s 源地址是发出报文的地址,-d 目标地址是本机的某个网卡地址。 -d 选项同样可以使用“逗号”来匹配多个地址,也可以匹配网段,和用“感叹号”来取反。 
协议类型 在 iptables 中可以使用 -p 选项,指定需要匹配的报文协议类型: 「iptables -I INPUT -s 10.254.1.100 -p tcp -j REJECT」 
iptables 拒绝来自 10.254.1.100 主机发往本机的所有 tcp 报文。 通过 iptables -nvL INPUT,我们会发现当我们没有指定 -p 协议类型的时候 port 项都是 all,那就说明当不使用 -p 选项时,默认表示所有类型的协议都会被匹配到。 网卡匹配 前面提到了点有关多个网卡的情况,其实我们可以使用 -i 选项来匹配报文通过哪块网卡流入本机: 「iptables -I INPUT -i eth1 -p icmp -j DROP」 
使用-i匹配指定网卡的名称,-p匹配指定报文的协议类型,那上面这条命令的意思就是丢弃从 eth1 网卡流入的 icmp 类型报文。 由于数据报文在内核中的流向原因,所以-i选项只能用在 INPUT 链、PREROUTING 链和 FORWARD 链上的。 
有选项匹配流入的网卡,那一定会有选项匹配流出的网卡啦。 当主机有多块网卡是,可以使用-o选项匹配报文将由哪块网卡流出: 「iptables -I OUTPUT -o eth1 -p icmp -j DROP」 
因为 -o 选项是用于匹配报文由哪个网卡流出的,所以 -o 选项只能用户 FORWARD 链、OUTPUT 链和 POSTROUTING 链。 扩展匹配条件 我们刚才用的都是基本的匹配条件,而扩展匹配条件和基本匹配条件有什么区别呢?简单的说就是基本匹配条件我们可以直接使用是 iptables 原生的,而如果想要使用扩展的匹配条件,则需要依赖一些扩展模块,在具体的使用过程中这表现为我们需要在命令中指定想要使用的匹配条件所以依赖的模块(呵呵,有点绕)。 举个例子,我们想拒绝来自 10.254.1.100 的 ssh 请求,大家知道 ssh 使用的是 tcp 的22 号端口,那么我们就可以使用 --dport 来匹配报文的目标端口: 「iptables -I INPUT -s 10.254.1.100 -p tcp -m tcp --dport 22 -j REJECT」 
解释下这个条命令 -s指定源地址,-p指定协议类型,-m指定对应的扩展模块为 tcp(这个模块的名字),如果想用 --dport 这个扩展匹配条件,则必须依赖这个叫 tcp 的扩展模块,换句话说,我们使用的是 tcp 这个扩展模块中的 --dport 选项来匹配目标端口的。 『注意:-p tcp 与 -m tcp 并不冲突,-p 用户匹配协议类型,-m 是用于指定扩展模块名称的,只是我们用的这个模块名字叫做 tcp 而已。』 有目标端口就有源端口,我们可以使用 --sport 来匹配源端口。 --sport 可以判断报文是否是从指定的端口发出,即匹配报文的源端口是否与指定端口一致: 「iptables -I INPUT -s 10.254.1.100 -p tcp -m tcp --sport 22 -j ACCEPT」 (不截图了) 扩展匹配条件是可以取反的,同样是使用“!”: 「iptables -I INPUT -s 10.254.1.100 -p tcp -m tcp ! --dport 22 -j ACCEPT」 
表示目标端口不是 22 的报文都会被匹配放行。 无论是 --sport 还 --dport 都可以指定一个连续的端口范围。 
tcp 模块中的 --sport 和 --dport 可以指定连续的端口。 Multiport扩展模块 那要指定离散的、不连续的端口我们就需要使用另一个模块—— multiport 模块。 multiport 模块使用 --sports 和 --dports 选项,指定不连续的端口(看清楚这个两个是带 s 的): 「iptables -I INPUT -s 192.168.1.100 -p tcp -m multiport --dports 22,36,80 -j ACCEPT」 
当来自 10.254.1.100 的 tcp 报文访问当前主机的 22、36 和 80 端口时放行。 不过要注意的是 multiport 扩展只能用于 tcp 和 udp 协议,即只能和 -p 选项的 -p tcp 和 -p udp 一起使用。 好了,这次说了关于匹配条件的内容,初步认识了两个扩展匹配模块和其中的一些常用扩展条件。还有要说的一点是当规则中同时存在多个匹配条件时,多个匹配条件之间默认存在“与”的关系,即报文必须同时满足所有条件才能被匹配到。 相关阅读:
联系我们
电话:400-004-8626
QQ:800064282
|