简介
上一篇文章中,我们已经介绍了怎样使用iptables命令查看规则,那么这篇文章我们就来介绍一下,怎样管理规则,即对iptables进行”增、删、改”操作。
注意:在进行iptables实验时,请务必在个人的测试机上进行,不要在有任何业务的机器上进行测试。
在进行测试前,为保障我们环境的纯粹性,我们需要将iptables清空,以便进行后续的各项实验测试。
可以通过一下命令清空防火墙规则
iptables -F # 清空所有的防火墙规则
iptables -X # 删除用户自定义的空链
iptables -Z # 清空计数
![da8d8bf2bf794a4ba25016ea7d325639.png](https://img-blog.csdnimg.cn/direct/da8d8bf2bf794a4ba25016ea7d325639.png)
此时所有iptalbes的规则都为空
增加规则
我测试机器的IP地址是192.168.140.250/24,接口为ens33,我自己另一台可以访问该电脑的地址为192.168.140.248。
那么此时,我就在250上配置一条规则,拒绝192.168.140.248上的所有报文访问当前机器,之前一直在说,规则由匹配条件与动作组成,那么”拒绝192.168.140.248上的所有报文访问当前机器”这条规则中,报文的”源地址为192.168.140.248″则属于匹配条件,如果报文来自”192.168.140.248″,则表示满足匹配条件,而”拒绝”这个报文,就属于对应的动作。那么怎样用命令去定义这条规则,使用如下命令即可。
![48e2a500ed464c779f63e0e4a9eb45ff.png](https://img-blog.csdnimg.cn/direct/48e2a500ed464c779f63e0e4a9eb45ff.png)
配置策略之前,是可以访问140.250这台机器的
使用 -t选项指定了要操作的表,此处指定了操作filter表,与之前的查看命令一样,不使用-t选项指定表时,默认为操作filter表。
使用-I选项,指明将”规则”插入至哪个链中,-I表示insert,即插入的意思,所以-I INPUT表示将规则插入于INPUT链中,即添加规则,-I参数是在首部添加规则后面我们会提到还有个-A参数。
使用-s选项,指明”匹配条件”中的”源地址”,即如果报文的源地址属于-s对应的地址,那么报文则满足匹配条件,-s为source之意,表示源地址。
使用-j选项,指明当”匹配条件”被满足时,所对应的动作,上例中指定的动作为DROP,在上例中,当报文的源地址为192.168.140.248时,报文则被DROP(丢弃)。
再次查看filter表中的INPUT链,发现规则已经被添加了,在iptables中,动作被称之为”target”,所以,上图中taget字段对应的动作为DROP。
配置完成后,在140.248上面对250进行ping操作,查看结果
![c491b373ba584eda9e912761928ca2ee.png](https://img-blog.csdnimg.cn/direct/c491b373ba584eda9e912761928ca2ee.png)
没有任何回应,因为数据包到达250主机后,直接被丢弃了。
![bfe2fb77662b4d47b38f5f7079d6e173.png](https://img-blog.csdnimg.cn/direct/bfe2fb77662b4d47b38f5f7079d6e173.png)
通过-v参数可以看到详细信息,此时可以看到已经阻止了60个数据包一共5040Bytes。
匹配顺序测试
此时INPUT链已经存在了一条规则,它拒绝了所有来自192.168.140.248主机中的报文,如果此时,我们在这条规则之后再配置一条规则,后面这条规则接受所有来自192.168.140.248主机中的报文,那么iptables是否会匹配这条规则呢?
![dc729efc100542c095550a8054b00c6c.png](https://img-blog.csdnimg.cn/direct/dc729efc100542c095550a8054b00c6c.png)
再次查看INPUT链,发现规则已经成功”追加”至INPUT链的末尾
使用-A选项,表示在对应的链中”追加规则”,-A为append之意,所以,-A INPUT则表示在INPUT链中追加规则,-I表示在链的首部插入规则
使用-j选项,指定当前规则对应的动作为ACCEPT
此时可以到看第二条匹配规则的数据包为0,根本没有任何报文被第二条规则匹配到。即规则的顺序很重要,如果报文已经被前面的规则匹配到,iptables则会对报文执行对应的动作,即使后面的规则也能匹配到当前报文,很有可能也没有机会再对报文执行相应的动作了。如上图所示,我们前面规则已经丢掉了所有来自149.248的数据包,那么即使后面有规则能匹配这些数据包,但是这些数据包已经被丢弃了,所以无法再进入下面的规则进行进一步匹配了。
那么顺序既然很重要,规则插入的位置就更为重要,要将规则插入特定的位置,我们就需要知道不同规则的编号,然后插入到对应的编号位置,就可以了。
![3da77129f4e34953a5ecf8371ff840f4.png](https://img-blog.csdnimg.cn/direct/3da77129f4e34953a5ecf8371ff840f4.png)
前面文章我们也提到过,查看规则编号需要使用--line-number参数,也可以简化成--line参数。此时就可以看到前面num编号位置的编号。那么如何将规则插入到具体的位置呢?
![af75a774fd3e4533bce309228ca379e9.png](https://img-blog.csdnimg.cn/direct/af75a774fd3e4533bce309228ca379e9.png)
我们使用-I参数,在INPUT后面跟上具体的编号数字,图中为1,则将规则添加到编号为1的位置。注意,此时立刻就有数据包匹配,因为该规则在DROP的前面。
![ca85d391fcc64e5cabd1b0d4d26f8521.png](https://img-blog.csdnimg.cn/direct/ca85d391fcc64e5cabd1b0d4d26f8521.png)
因为按照顺序匹配规则,所以我们添加了ACCEPT这个规则后,248就可以立即和250进行通信了。
删除规则
前面我们介绍了如何添加规则,那么如何删除规则呢?
方法一:根据规则的编号去删除规则
方法二:根据具体的匹配条件与动作删除规则
此时我们iptables中INPUT链有3条规则,现在想要删除第3条规则,则使用如下方法:
方法一:
![9c61928aa7a54451b5fa33e2de26a15f.png](https://img-blog.csdnimg.cn/direct/9c61928aa7a54451b5fa33e2de26a15f.png)
-t选项指定了要操作的表(省略-t默认表示操作filter表),使用-D选项表示删除指定链中的某条规则,-D INPUT 3表示删除INPUT链中的第3条规则
方法二:
![d6ee646423d4431eaba620c8b232273e.png](https://img-blog.csdnimg.cn/direct/d6ee646423d4431eaba620c8b232273e.png)
根据具体的匹配条件与动作去删除规则,仍然使用-D选项,-D INPUT表示删除INPUT链中的规则,剩下的选项与我们添加规则时一模一样,-s表示以对应的源地址作为匹配条件,-j ACCEPT表示对应的动作为接受,所以,上述命令表示删除INPUT链中源地址为192.168.140.248,动作为ACCEPT的规则
删除指定表中某条链中的所有规则的命令
iptables -t 表名 -F 链名
-F选项为flush之意,即冲刷指定的链,即删除指定链中的所有规则。-F选项不仅仅能清空指定链上的规则,其实它还能清空整个表中所有链上的规则,不指定链名,只指定表名即可删除表中的所有规则,命令如下
iptables -t 表名 -F
注意:在没有保存iptables规则时,请勿随便清空链或者表中的规则,类似于不要轻易尝试rm -rf *是一样的,除非你知道你为什么这么做。
修改规则
如上图所示,我想把DROP修改为REJECT该如何操作呢
![32593fa6438e432880cd4ce1701ac760.png](https://img-blog.csdnimg.cn/direct/32593fa6438e432880cd4ce1701ac760.png)
注意使用REJECT后,后面出现了 reject-with icmp-port-unreachable,及icmp不可达
使用-R参数,加上INPUT 1即可以修改INPUT链的第一条规则,使用-j REJECT表示将INPUT链中的第一条规则的动作修改为REJECT。
但是,在修改规则时,必须指定规则对应的原本的所有匹配条件,即不能只写INPUT 1后面就-j REJECT了,因为修改规则如果直接使用-j参数,就会默认前面所有都是空的。那么所有的数据包都会被REJECT了。
![06e28dbc88be41fe90ea3446c8c954c6.png](https://img-blog.csdnimg.cn/direct/06e28dbc88be41fe90ea3446c8c954c6.png)
DROP表示丢弃,REJECT表示拒绝,当在140.248上ping 140.250时,就会提示unreachable,而不是DROP,不提示任何信息。
修改链默认策略
在我的iptables中INPUT链的默认策略是ACCEPT,即接受所有。所以此时我通过其他机器,去ping140.250这台机器是可以通的。
![3b66c5b6ecb2425c9312bf43c0a08f2c.png](https://img-blog.csdnimg.cn/direct/3b66c5b6ecb2425c9312bf43c0a08f2c.png)
此时可以通,因为默认策略是ACCEPT
修改INPUT默认策略
![9ca3989a61364f2ba5d011deb919b3fe.png](https://img-blog.csdnimg.cn/direct/9ca3989a61364f2ba5d011deb919b3fe.png)
注意:此命令我只展示,不要回车,不要回车、不要回车
使用-t指定要操作的表,使用-P选项指定要修改的链,上例中,-P INPUT DROP表示将表中INPUT链的默认策略改为DROP。不要回车!不要回车!不要回车!
如果输入该命令,并且我恰面没有允许其他ACCEPT的动作,那么该主机将会拒绝所有的INPUT的数据包,那么也就无法登录该主机
![198c690faade4ca395dcae6725a79601.png](https://img-blog.csdnimg.cn/direct/198c690faade4ca395dcae6725a79601.png)
这里我用FORWARD链做一个演示,该方式即为白名单方式,默认拒绝所有,然后需要方形什么,添加对应的方形规则。
保存规则
在默认的情况下,我们对”防火墙”所做出的修改都是”临时的”,当重启iptables服务或者重启服务器以后,我们平常添加的规则或者对规则所做出的修改都将消失,为了防止这种情况的发生,我们需要将规则”保存”
我用的是debian系统,我先按照debian系统的方式保存iptables规则。
在 Debian 系统上,可以使用 iptables-persistent
包来保存和恢复 iptables 规则
安装 iptables-persistent
通过apt install iptables-persisten
安装完成后,会在/etc/iptables/目录下生成两个文件rules.v4和rules.v6,分别对应ipv4和ipv6的规则
保存当前 iptables 规则
sudo iptables-save > /etc/iptables/rules.v4 # IPv4 规则
sudo ip6tables-save > /etc/iptables/rules.v6 # IPv6 规则
![fe7589ce39f7485db6ffecb6a82cd308.png](https://img-blog.csdnimg.cn/direct/fe7589ce39f7485db6ffecb6a82cd308.png)
我这里只有ipv4所以只保存了ipv4的iptables,保存完成后查看rules.v4文件,可以看到对应的数据信息。
恢复已保存的规则
当系统重新启动后,iptables-persistent
将自动加载保存的规则
手动保存规则
上面的恢复是自动的,也就是系统重新启动后,会重新应用这个规则,那如果需要将特定时间的防火墙规则进行恢复,比如我想恢复上周保存的规则,该如何操作呢?使用iptables-restore操作。
sudo iptables-restore < /etc/iptables/rules.v4 # IPv4 规则
sudo ip6tables-restore < /etc/iptables/rules.v6 # IPv6 规则
重启主机进行测试
![6187839441ba4b2d92522cf985e5b2ef.png](https://img-blog.csdnimg.cn/direct/6187839441ba4b2d92522cf985e5b2ef.png)
重新启动后防火墙规则依然存在
通用的iptables保存方式
上面是我现在用的debian系统的方式,那么如果用其他系统呢比如centos/almalinux/ubuntu等等,其实iptables自带了一种保存方式,即iptables-save
保存规则:使用 iptables-save
将当前 iptables 规则保存到文件中
sudo iptables-save > /path/to/save/file
恢复规则:使用 iptables-restore
从文件中加载保存的规则
sudo iptables-restore < /path/to/save/file
当然还可以设置自定义脚本等等方式,可以根据自己的需求和环境灵活设置。