简介
上一篇文章中,我们已经介绍了怎样使用iptables命令查看规则,那么这篇文章我们就来介绍一下,怎样管理规则,即对iptables进行”增、删、改”操作。
注意:在进行iptables实验时,请务必在个人的测试机上进行,不要在有任何业务的机器上进行测试。
在进行测试前,为保障我们环境的纯粹性,我们需要将iptables清空,以便进行后续的各项实验测试。
可以通过一下命令清空防火墙规则
iptables -F # 清空所有的防火墙规则
iptables -X # 删除用户自定义的空链
iptables -Z # 清空计数

此时所有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″,则表示满足匹配条件,而”拒绝”这个报文,就属于对应的动作。那么怎样用命令去定义这条规则,使用如下命令即可。

配置策略之前,是可以访问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操作,查看结果

没有任何回应,因为数据包到达250主机后,直接被丢弃了。

通过-v参数可以看到详细信息,此时可以看到已经阻止了60个数据包一共5040Bytes。
匹配顺序测试
此时INPUT链已经存在了一条规则,它拒绝了所有来自192.168.140.248主机中的报文,如果此时,我们在这条规则之后再配置一条规则,后面这条规则接受所有来自192.168.140.248主机中的报文,那么iptables是否会匹配这条规则呢?

再次查看INPUT链,发现规则已经成功”追加”至INPUT链的末尾
使用-A选项,表示在对应的链中”追加规则”,-A为append之意,所以,-A INPUT则表示在INPUT链中追加规则,-I表示在链的首部插入规则
使用-j选项,指定当前规则对应的动作为ACCEPT
此时可以到看第二条匹配规则的数据包为0,根本没有任何报文被第二条规则匹配到。即规则的顺序很重要,如果报文已经被前面的规则匹配到,iptables则会对报文执行对应的动作,即使后面的规则也能匹配到当前报文,很有可能也没有机会再对报文执行相应的动作了。如上图所示,我们前面规则已经丢掉了所有来自149.248的数据包,那么即使后面有规则能匹配这些数据包,但是这些数据包已经被丢弃了,所以无法再进入下面的规则进行进一步匹配了。
那么顺序既然很重要,规则插入的位置就更为重要,要将规则插入特定的位置,我们就需要知道不同规则的编号,然后插入到对应的编号位置,就可以了。

前面文章我们也提到过,查看规则编号需要使用--line-number参数,也可以简化成--line参数。此时就可以看到前面num编号位置的编号。那么如何将规则插入到具体的位置呢?

我们使用-I参数,在INPUT后面跟上具体的编号数字,图中为1,则将规则添加到编号为1的位置。注意,此时立刻就有数据包匹配,因为该规则在DROP的前面。

因为按照顺序匹配规则,所以我们添加了ACCEPT这个规则后,248就可以立即和250进行通信了。
删除规则
前面我们介绍了如何添加规则,那么如何删除规则呢?
方法一:根据规则的编号去删除规则
方法二:根据具体的匹配条件与动作删除规则
此时我们iptables中INPUT链有3条规则,现在想要删除第3条规则,则使用如下方法:
方法一:

-t选项指定了要操作的表(省略-t默认表示操作filter表),使用-D选项表示删除指定链中的某条规则,-D INPUT 3表示删除INPUT链中的第3条规则
方法二:

根据具体的匹配条件与动作去删除规则,仍然使用-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该如何操作呢

注意使用REJECT后,后面出现了 reject-with icmp-port-unreachable,及icmp不可达
使用-R参数,加上INPUT 1即可以修改INPUT链的第一条规则,使用-j REJECT表示将INPUT链中的第一条规则的动作修改为REJECT。
但是,在修改规则时,必须指定规则对应的原本的所有匹配条件,即不能只写INPUT 1后面就-j REJECT了,因为修改规则如果直接使用-j参数,就会默认前面所有都是空的。那么所有的数据包都会被REJECT了。

DROP表示丢弃,REJECT表示拒绝,当在140.248上ping 140.250时,就会提示unreachable,而不是DROP,不提示任何信息。
修改链默认策略
在我的iptables中INPUT链的默认策略是ACCEPT,即接受所有。所以此时我通过其他机器,去ping140.250这台机器是可以通的。

此时可以通,因为默认策略是ACCEPT
修改INPUT默认策略

注意:此命令我只展示,不要回车,不要回车、不要回车
使用-t指定要操作的表,使用-P选项指定要修改的链,上例中,-P INPUT DROP表示将表中INPUT链的默认策略改为DROP。不要回车!不要回车!不要回车!
如果输入该命令,并且我恰面没有允许其他ACCEPT的动作,那么该主机将会拒绝所有的INPUT的数据包,那么也就无法登录该主机

这里我用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 规则

我这里只有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 规则
重启主机进行测试

重新启动后防火墙规则依然存在
通用的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
当然还可以设置自定义脚本等等方式,可以根据自己的需求和环境灵活设置。