还是从我们最常用的"源地址"说起吧,我们知道,使用-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端口,