还是从我们最常用的"源地址"说起吧,我们知道,使用-s选项作为匹配条件,可以匹配报文的源地址,但是之前的示例中,我们每次指定源地址,都只是指定单个IP,其实,我们也可以在指定源地址时,一次指定多个,用"逗号"隔开即可,
1)匹配地址之源地址
test1指定多个ip地址。
[root@bogon /]# iptables -t filter -I INPUT -s 192.168.56.130,192.168.56.133 -j ACCEPT [root@bogon /]# iptables -t filter -nvL INPUT Chain INPUT (policy ACCEPT 6 packets, 364 bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT all -- * * 192.168.56.133 0.0.0.0/0 0 0 ACCEPT all -- * * 192.168.56.130 0.0.0.0/0 0 0 ACCEPT all -- * * 192.168.56.130 0.0.0.0/0 [root@bogon /]#
可以看出,上例中,一次添加了两条规则,两条规则只是源地址对应的IP不同,注意,上例中的"逗号"两侧均不能包含空格,多个IP之间必须与逗号相连。
除了能指定具体的IP地址,还能指定某个网段
test2指定网段:
[root@bogon /]# iptables -t filter -I INPUT -s 192.168.56.0/24 -j ACCEPT [root@bogon /]# iptables -t filter -nvL INPUT Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 6 364 ACCEPT all -- * * 192.168.56.0/24 0.0.0.0/0 0 0 ACCEPT all -- * * 192.168.56.133 0.0.0.0/0 0 0 ACCEPT all -- * * 192.168.56.130 0.0.0.0/0 0 0 ACCEPT all -- * * 192.168.56.130 0.0.0.0/0 [root@bogon /]#
test3匹配条件取反
[root@bogon /]# iptables -t filter -I INPUT ! -s 192.168.56.0/24 -j ACCEPT [root@bogon /]# iptables -t filter -nvL INPUT Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT all -- * * !192.168.56.0/24 0.0.0.0/0 122 8724 ACCEPT all -- * * 192.168.56.0/24 0.0.0.0/0 0 0 ACCEPT all -- * * 192.168.56.133 0.0.0.0/0 0 0 ACCEPT all -- * * 192.168.56.130 0.0.0.0/0 0 0 ACCEPT all -- * * 192.168.56.130 0.0.0.0/0 [root@bogon /]#
2)匹配地址之目的地址
[root@bogon /]# iptables -t filter -I INPUT -d 192.168.50.0/24 -j ACCEPT [root@bogon /]# iptables -t filter -nvL INPUT Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT all -- * * 0.0.0.0/0 192.168.50.0/24 1 76 ACCEPT all -- * * !192.168.56.0/24 0.0.0.0/0 250 18260 ACCEPT all -- * * 192.168.56.0/24 0.0.0.0/0 0 0 ACCEPT all -- * * 192.168.56.133 0.0.0.0/0 0 0 ACCEPT all -- * * 192.168.56.130 0.0.0.0/0 0 0 ACCEPT all -- * * 192.168.56.130 0.0.0.0/0 [root@bogon /]#
-d 参数指定目的地址
背景:比如一台主机有多个IP地址,分别是192.168.56.111和192.168.56.112,还有一台测试机器192.168.56.114,防火墙主机111网卡能接受114的数据报文,但是不让112接受114的数据报文,就可以用上面的目标地址加以区分
iptables -t filter -I INPUT -s 192.168.56.114 -d 192.168.56.111 -j ACCEPT iptables -t filter -I INPUT -s 192.168.56.114 -d 192.168.56.112 -j DROP
3)协议类型匹配
[root@bogon /]# iptables -t filter -I INPUT -s 192.168.56.130 -p TCP -j REJECT [root@bogon /]# iptables -t filter --line -nvL INPUT Chain INPUT (policy ACCEPT 18 packets, 1108 bytes) num pkts bytes target prot opt in out source destination 1 0 0 REJECT tcp -- * * 192.168.56.130 0.0.0.0/0 reject-with icmp-port-unreachable 2 0 0 ACCEPT all -- * * 192.168.56.130 0.0.0.0/0
拒绝130机器的tcp协议的数据报文
进入130机器,看看测试结果:
[root@bogon /]# ping 192.168.56.131 PING 192.168.56.131 (192.168.56.131) 56(84) bytes of data. 64 bytes from 192.168.56.131: icmp_seq=1 ttl=64 time=1.52 ms 64 bytes from 192.168.56.131: icmp_seq=2 ttl=64 time=1.90 ms 64 bytes from 192.168.56.131: icmp_seq=3 ttl=64 time=2.63 ms 64 bytes from 192.168.56.131: icmp_seq=4 ttl=64 time=1.30 ms
可以ping同,ping 数据icmp协议
[root@bogon /]# ssh root@192.168.56.131 ssh: connect to host 192.168.56.131 port 22: Connection refused [root@bogon /]#
ssh不能登录到131,ssh用的是tcp建立的连接,所以不通。
4)网口匹配
我们的防火墙主机在局域网用的是enp0s8这个网口,我们来禁止测试机通过这个网口去ping他
[root@bogon /]# iptables -t filter -I INPUT -i enp0s8 -p icmp -j REJECT [root@bogon /]# iptables -t filter --line -nvL INPUT Chain INPUT (policy ACCEPT 6 packets, 364 bytes) num pkts bytes target prot opt in out source destination 1 0 0 REJECT icmp -- enp0s8 * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable 2 2 120 REJECT tcp -- * * 192.168.56.130 0.0.0.0/0 reject-with icmp-port-unreachable 3 7 588 ACCEPT all -- * * 192.168.56.130 0.0.0.0/0
结果:
[root@bogon /]# ping 192.168.56.131 PING 192.168.56.131 (192.168.56.131) 56(84) bytes of data. From 192.168.56.131 icmp_seq=1 Destination Port Unreachable From 192.168.56.131 icmp_seq=2 Destination Port Unreachable From 192.168.56.131 icmp_seq=3 Destination Port Unreachable From 192.168.56.131 icmp_seq=4 Destination Port Unreachable
-i选项是用于判断报文是从哪个网卡流入的,那么,-i选项只能用于上图中的PREROUTING链、INPUT链、FORWARD链,这是-i选项的特殊性,因为它只是用于判断报文是从哪个网卡流入的,所以只能在上图中"数据流入流向"的链中与FORWARD链中存在,而上图中的"数据发出流向"经过的链中,是不可能使用-i选项的,比如上图中的OUTPUT链与POSTROUTING链,他们都不能使用-i选项。
当主机有多块网卡时,可以使用-o选项,匹配报文将由哪块网卡流出,没错,-o选项与-i选项是相对的,-i选项用于匹配报文从哪个网卡流入,-o选项用于匹配报文将从哪个网卡流出。
聪明如你,一定想到了,-i选项只能用于PREROUTING链、INPUT链、FORWARD链,那么-o选项只能用于FORWARD链、OUTPUT链、POSTROUTING链。
因为-o选项是用于匹配报文将由哪个网卡"流出"的,所以与上图中的"数据进入流向"中的链没有任何缘分,所以,-o选项只能用于FORWARD链、OUTPUT链、POSTROUTING链中。
看来,FORWARD链属于"中立国",它能同时使用-i选项与-o选项。
5)扩展匹配条件
不是基本匹配条件的就是扩展匹配条件,这样说好像是句废话,我们可以这样理解,基本匹配条件我们可以直接使用,而如果想要使用扩展匹配条件,则需要依赖一些扩展模块,或者说,在使用扩展匹配条件之前,需要指定相应的扩展模块才行,这样说不容易明白,我们做个例子,就能够明白。
我们先将之前的测试数据中的禁止tcp的规则删除掉
[root@bogon /]# iptables -t filter --line -nvL INPUT Chain INPUT (policy ACCEPT 23 packets, 2556 bytes) num pkts bytes target prot opt in out source destination 1 4 336 REJECT icmp -- enp0s8 * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable 2 2 120 REJECT tcp -- * * 192.168.56.130 0.0.0.0/0 reject-with icmp-port-unreachable 3 7 588 ACCEPT all -- * * 192.168.56.130 0.0.0.0/0 [root@bogon /]# iptables -t filter -D INPUT 2 [root@bogon /]# iptables -t filter --line -nvL INPUT Chain INPUT (policy ACCEPT 6 packets, 364 bytes) num pkts bytes target prot opt in out source destination 1 4 336 REJECT icmp -- enp0s8 * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable 2 7 588 ACCEPT all -- * * 192.168.56.130 0.0.0.0/0 [root@bogon /]#
1,目标端口匹配条件
现在可以用130ssh到131了,现在我们来通过扩展匹配条件禁止131的22端口被访问
[root@bogon /]# iptables -t filter -I INPUT -s 192.168.56.130 -p tcp -m tcp --dport 22 -j REJECT [root@bogon /]# iptables -t filter --line -nvL INPUT Chain INPUT (policy ACCEPT 6 packets, 364 bytes) num pkts bytes target prot opt in out source destination 1 0 0 REJECT tcp -- * * 192.168.56.130 0.0.0.0/0 tcp dpt:22 reject-with icmp-port-unreachable 2 4 336 REJECT icmp -- enp0s8 * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable 3 27 3961 ACCEPT all -- * * 192.168.56.130 0.0.0.0/0 [root@bogon /]#
现在我们尝试用130机器再去ssh131机器,看是否可以ssh通
[root@nat2 ~]# ssh root@192.168.56.131 ssh: connect to host 192.168.56.131 port 22: Connection refused [root@nat2 ~]#
可以看到已经不行了
扩展匹配条件被使用时,则需要依赖一些扩展模块,或者说,在使用扩展匹配条件之前,需要指定相应的扩展模块才行。
现在你明白了吗? -m tcp表示使用tcp扩展模块,--dport表示tcp扩展模块中的一个扩展匹配条件,可用于匹配报文的目标端口。
注意,-p tcp与 -m tcp并不冲突,-p用于匹配报文的协议,-m 用于指定扩展模块的名称,正好,这个扩展模块也叫tcp。
2,源端口匹配条件
源端口匹配条件的使用和目标端口的使用类似,只是将--dport改为--sport即可
3,端口范围匹配条件
不管是--sport还是--dsport,都能够指定一个端口范围,比如,--dport 22:25表示目标端口为22到25之间的所有端口,即22端口、23端口、24端口、25端口,