跳转至

03 iptables规则管理

iptables 规则管理

之前打过一个比方,每条”链”都是一个”关卡”,每个通过这个”关卡”的报文都要匹配这个关卡上的规则,如果匹配,则对报文进行对应的处理,比如说,你我二人此刻就好像两个”报文”,你我二人此刻都要入关,可是城主有命,只有器宇轩昂之人才能入关,不符合此条件的人不能入关,于是守关将士按照城主制定的”规则”,开始打量你我二人,最终,你顺利入关了,而我已被拒之门外,因为你符合”器宇轩昂”的标准,所以把你”放行”了,而我不符合标准,所以没有被放行,其实,”器宇轩昂”就是一种”匹配条件”,”放行”就是一种”动作”,”匹配条件”与”动作”组成了规则。

iptables 匹配方式分为 “ 源地址 ”, “ 目的地址 ”, “ 源端口 ”, “ 目的端口 ”等方式, 匹配完成后对常用的动作有 ACCEPT (接受), DROP(丢弃), REJECT(拒绝); ACCEPT 类似于放行; 这里并不是全部的匹配条件,只是日常维护中常用的条件.

实验: 研究iptables 对规则匹配和规则动作的验证;

实验基于 INPUT 链在filter 表中的实现 规则;

1、 首先查看INPUT 链

iptables -t filter -nvL INPUT
[root@cmzhu1 ~]# iptables -nL INPUT
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
INPUT_direct  all  --  0.0.0.0/0            0.0.0.0/0
INPUT_ZONES_SOURCE  all  --  0.0.0.0/0            0.0.0.0/0
INPUT_ZONES  all  --  0.0.0.0/0            0.0.0.0/0
DROP       all  --  0.0.0.0/0            0.0.0.0/0            ctstate INVALID
REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited

2、 清空iptables 规则, 好开始本次实验

iptables -F -t filter INPUT

3、 准备一台新的机器(192.168.122.108), 用来ping 前一台 测试机器, 可以发现目前是可通的;

[root@cmzhu2 ~]# ping 192.168.122.215
PING 192.168.122.215 (192.168.122.215) 56(84) bytes of data.
64 bytes from 192.168.122.215: icmp_seq=1 ttl=64 time=0.169 ms
64 bytes from 192.168.122.215: icmp_seq=2 ttl=64 time=0.171 ms
64 bytes from 192.168.122.215: icmp_seq=3 ttl=64 time=0.173 ms
64 bytes from 192.168.122.215: icmp_seq=4 ttl=64 time=0.180 ms
--- 192.168.122.215 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3000ms
rtt min/avg/max/mdev = 0.169/0.173/0.180/0.010 ms
[root@cmzhu2 ~]#

4、 加入一条置顶 DROP ping 机器的规则

iptables -t filter -I INPUT -s 192.168.122.108 -j DROP

查看一下INPUT 表

[root@cmzhu1 ~]# iptables -t filter -nvL INPUT
Chain INPUT (policy ACCEPT 139 packets, 10016 bytes)
 pkts bytes target     prot opt in     out     source               destination
   50  4200 DROP       all  --  *      *       192.168.122.108      0.0.0.0/0

5、 在新机器(192.168.122.108) 对旧机器进行ping 测试; 可以发现 ping 包已经全部被丢弃了;

[root@cmzhu2 ~]# ping 192.168.122.215
PING 192.168.122.215 (192.168.122.215) 56(84) bytes of data.

实验到这里,基本完成了, 在INPUT链里面 添加DROP 规则, 是可以对所有包进行丢弃的;

6、 但是再深入一下, 我传入多条规则是怎么匹配的呢; 从上述文档中说是顺序匹配的, 这个下面就开始验证一下.

在上面的基础上, 再插入一条相同的ACCEPT规则

iptables -t filter -A INPUT  -s 192.168.122.108 -j ACCEPT

得出的防火墙结果为

[root@cmzhu1 ~]# iptables -t filter -nvL INPUT
Chain INPUT (policy ACCEPT 7 packets, 504 bytes)
 pkts bytes target     prot opt in     out     source               destination
  376 31584 DROP       all  --  *      *       192.168.122.108      0.0.0.0/0
    0     0 ACCEPT     all  --  *      *       192.168.122.108      0.0.0.0/0

从上图中很难看出顺序, 上文学过; 可以使用 --line 获得非常详细的信息.

[root@cmzhu1 ~]# iptables -t filter --line -nvL INPUT
Chain INPUT (policy ACCEPT 47 packets, 3508 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1      534 44856 DROP       all  --  *      *       192.168.122.108      0.0.0.0/0
2        0     0 ACCEPT     all  --  *      *       192.168.122.108      0.0.0.0/0

这样添加链的结果如此, 并且在 规则1 的pkts 在不断增加, 有理由怀疑,数据包在匹配到第一条规则时被处理了,就没有进行下一步去匹配.

为此可以做以下验证,

7、在规则的头部添加一个ACCEPT 的规则, 理论上结果应该是 能够ping 通,验证一下

添加规则

iptables -t filter -I INPUT -s 192.168.122.108 -j ACCEPT

添加后规则如下, 为此可以发现, 规则2 的pkts 没有变化, 并且ping 功能恢复正常

[root@cmzhu1 ~]# iptables -t filter --line -nvL INPUT
Chain INPUT (policy ACCEPT 7 packets, 504 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1        3   252 ACCEPT     all  --  *      *       192.168.122.108      0.0.0.0/0
2      750 63000 DROP       all  --  *      *       192.168.122.108      0.0.0.0/0
3        0     0 ACCEPT     all  --  *      *       192.168.122.108      0.0.0.0/0
[root@cmzhu1 ~]# iptables -t filter --line -nvL INPUT
Chain INPUT (policy ACCEPT 13 packets, 904 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1      379 31836 ACCEPT     all  --  *      *       192.168.122.108      0.0.0.0/0
2      750 63000 DROP       all  --  *      *       192.168.122.108      0.0.0.0/0
3        0     0 ACCEPT     all  --  *      *       192.168.122.108      0.0.0.0/0
[root@cmzhu2 ~]# ping 192.168.122.215
PING 192.168.122.215 (192.168.122.215) 56(84) bytes of data.
64 bytes from 192.168.122.215: icmp_seq=1 ttl=64 time=0.117 ms
64 bytes from 192.168.122.215: icmp_seq=2 ttl=64 time=0.177 ms
64 bytes from 192.168.122.215: icmp_seq=3 ttl=64 time=0.157 ms
--- 192.168.122.215 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1999ms
rtt min/avg/max/mdev = 0.117/0.150/0.177/0.026 ms

由此可以推断, 规则链式匹配是正确的;

8、 在学习之后,应该如何删除规则呢? 下面指令表示删除第一条规则

iptables -t filter -D INPUT 1

9、修改规则危险, 勿用

iptables -t filter -R INPUT 1 -s 192.168.122.108 -j REJECT