iptables(3)规则管理(新增、插入、修改、删除、保存)

简介

        上一篇文章中,我们已经介绍了怎样使用iptables命令查看规则,那么这篇文章我们就来介绍一下,怎样管理规则,即对iptables进行”增、删、改”操作。

注意:在进行iptables实验时,请务必在个人的测试机上进行,不要在有任何业务的机器上进行测试。

在进行测试前,为保障我们环境的纯粹性,我们需要将iptables清空,以便进行后续的各项实验测试。

可以通过一下命令清空防火墙规则

iptables -F  # 清空所有的防火墙规则
iptables -X  # 删除用户自定义的空链
iptables -Z  # 清空计数
da8d8bf2bf794a4ba25016ea7d325639.png

此时所有iptalbes的规则都为空

 增加规则

我测试机器的IP地址是192.168.140.250/24,接口为ens33,我自己另一台可以访问该电脑的地址为192.168.140.248。

61864eb1b95148d9a0a30e16ca46012e.png

那么此时,我就在250上配置一条规则,拒绝192.168.140.248上的所有报文访问当前机器,之前一直在说,规则由匹配条件与动作组成,那么”拒绝192.168.140.248上的所有报文访问当前机器”这条规则中,报文的”源地址为192.168.140.248″则属于匹配条件,如果报文来自”192.168.140.248″,则表示满足匹配条件,而”拒绝”这个报文,就属于对应的动作。那么怎样用命令去定义这条规则,使用如下命令即可。

48e2a500ed464c779f63e0e4a9eb45ff.png

配置策略之前,是可以访问140.250这台机器的

6a0d8490f4bb423cbe1a3667d7d18a46.png

     使用 -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

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

bfe2fb77662b4d47b38f5f7079d6e173.png

通过-v参数可以看到详细信息,此时可以看到已经阻止了60个数据包一共5040Bytes。

匹配顺序测试

        此时INPUT链已经存在了一条规则,它拒绝了所有来自192.168.140.248主机中的报文,如果此时,我们在这条规则之后再配置一条规则,后面这条规则接受所有来自192.168.140.248主机中的报文,那么iptables是否会匹配这条规则呢?

        

dc729efc100542c095550a8054b00c6c.png

再次查看INPUT链,发现规则已经成功”追加”至INPUT链的末尾

使用-A选项,表示在对应的链中”追加规则”,-A为append之意,所以,-A INPUT则表示在INPUT链中追加规则,-I表示在链的首部插入规则

使用-j选项,指定当前规则对应的动作为ACCEPT

此时可以到看第二条匹配规则的数据包为0,根本没有任何报文被第二条规则匹配到。即规则的顺序很重要,如果报文已经被前面的规则匹配到,iptables则会对报文执行对应的动作,即使后面的规则也能匹配到当前报文,很有可能也没有机会再对报文执行相应的动作了。如上图所示,我们前面规则已经丢掉了所有来自149.248的数据包,那么即使后面有规则能匹配这些数据包,但是这些数据包已经被丢弃了,所以无法再进入下面的规则进行进一步匹配了。

那么顺序既然很重要,规则插入的位置就更为重要,要将规则插入特定的位置,我们就需要知道不同规则的编号,然后插入到对应的编号位置,就可以了。

3da77129f4e34953a5ecf8371ff840f4.png

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

af75a774fd3e4533bce309228ca379e9.png

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

ca85d391fcc64e5cabd1b0d4d26f8521.png

因为按照顺序匹配规则,所以我们添加了ACCEPT这个规则后,248就可以立即和250进行通信了。

删除规则

前面我们介绍了如何添加规则,那么如何删除规则呢?

方法一:根据规则的编号去删除规则

方法二:根据具体的匹配条件与动作删除规则

34eda2f734b84a1a954793d810e834ed.png

此时我们iptables中INPUT链有3条规则,现在想要删除第3条规则,则使用如下方法:

方法一:

9c61928aa7a54451b5fa33e2de26a15f.png

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

方法二:

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 *是一样的,除非你知道你为什么这么做。

修改规则

5da5506bba12431f82ce670decd16c55.png

如上图所示,我想把DROP修改为REJECT该如何操作呢

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

DROP表示丢弃,REJECT表示拒绝,当在140.248上ping 140.250时,就会提示unreachable,而不是DROP,不提示任何信息。

 修改链默认策略

3da4e4adadcb4e04a9a09e9b63c3dade.png

 在我的iptables中INPUT链的默认策略是ACCEPT,即接受所有。所以此时我通过其他机器,去ping140.250这台机器是可以通的。

3b66c5b6ecb2425c9312bf43c0a08f2c.png

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

修改INPUT默认策略

9ca3989a61364f2ba5d011deb919b3fe.png

注意:此命令我只展示,不要回车,不要回车、不要回车

使用-t指定要操作的表,使用-P选项指定要修改的链,上例中,-P INPUT DROP表示将表中INPUT链的默认策略改为DROP。不要回车!不要回车!不要回车!

如果输入该命令,并且我恰面没有允许其他ACCEPT的动作,那么该主机将会拒绝所有的INPUT的数据包,那么也就无法登录该主机

198c690faade4ca395dcae6725a79601.png

这里我用FORWARD链做一个演示,该方式即为白名单方式,默认拒绝所有,然后需要方形什么,添加对应的方形规则。

保存规则

 在默认的情况下,我们对”防火墙”所做出的修改都是”临时的”,当重启iptables服务或者重启服务器以后,我们平常添加的规则或者对规则所做出的修改都将消失,为了防止这种情况的发生,我们需要将规则”保存”

我用的是debian系统,我先按照debian系统的方式保存iptables规则。

在 Debian 系统上,可以使用 iptables-persistent 包来保存和恢复 iptables 规则

安装 iptables-persistent

通过apt install iptables-persisten

b1931cd3cb36423a81af35069a575efb.png

e6cca1870d1443dc9151cef8af2527d4.png

安装完成后,会在/etc/iptables/目录下生成两个文件rules.v4和rules.v6,分别对应ipv4和ipv6的规则

091586b6e0d1499b8bd71de01b34bb16.png

保存当前 iptables 规则

sudo iptables-save > /etc/iptables/rules.v4  # IPv4 规则
sudo ip6tables-save > /etc/iptables/rules.v6  # IPv6 规则
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

重新启动后防火墙规则依然存在

通用的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

当然还可以设置自定义脚本等等方式,可以根据自己的需求和环境灵活设置。

  • 27
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Monster✺◟(∗❛ัᴗ❛ั∗)◞✺

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值