特别说明:此系列博文根据 朱双印博客-iptables系列博文,个人实践后总结,此为个人笔记精简版,更通俗易懂请参考 朱双印博客-iptables系列博文 原文内容,诸君必能有所收获
03 Iptables规则管理
-
清空INPUT链的原有规则
iptables -F INPUT
增加规则
例如,我们想增加一条规则,规则策略是拒绝192.168.200.115的所有报文访问本机,我们输入以下命令
iptables -t filter -I INPUT -s 192.168.200.115 -j DROP
查看一下规则是否添加成功,iptables -t filter -nvl INPUT
上图中,使用 -t 选项指定了我们要操作的表filter,不指定时,默认为filter;使用 -I 选项,指明规则插入到哪条链中,-I 表示insert,即插入,由此选项才能添加规则,并且,默认插入到链的头部(序号为1);使用 -s 选项,指明匹配条件中的源地址,匹配时,当报文中的IP地址和源地址相同,就会触发规则匹配成功后的动作,-s 表示source,即源;使用 -j 选项,指明当匹配条件成功后,所对应的动作(target),此处是DROP,即动作为丢弃,规则成功匹配192.168.200.115后,就直接丢弃来自此IP的报文;
创建成功,我们试试看能不能从192.168.200.115 ping通本机(192.168.200.221)
可以看到,ping不通,看来filter表中 INPUT 链的规则成功匹配并执行了DROP动作
我们再来看下,如果有规则相悖会怎样,比如,我们有规则动作是接受192.168.200.115的报文,有规则为直接丢弃,最终结果会怎样,首先在之前有一条丢弃报文的基础上,添加一个接受的规则,即
iptables -t filter -A INPUT -s 192.168.200.115 -j ACCEPT
使用了 -A 选项,表示 append,追加规则到链尾部(序号最大),与 -I 选项刚好相反;并且,动作更改为了ACCEPT
添加成功后,查看一下,iptables -nvL INPUT
不指明表则默认查看filter表,现在再从192.168.200.115 ping 本机(192.168.200.221),结果如下
可以看到,ping不通,并且第二条规则连报文都没有接收到,没有匹配一个报文,pkts和bytes字段都是为0,根本没有起任何作用,看来报文都被第一条规则全部拦下并丢弃了
如果顺序变一下呢?会不会就直接ping通了呢,我们试着添加一套ACCEPT动作的规则,并且使用 -I 选项,添加到链的头部,让这条规则作为第一条来匹配报文
iptables -t filter -I INPUT -s 192.168.200.115 -j ACCEPT
确保添加成功可以查看一下,没有问题,再来看看192.168.200.115能ping通本机吧,结果如下
可以看到,ping通了,并且第一条规则也接受到了我们的3条报文;由此,我们必须注意规则的顺序,如果你的规则很多,顺序便可能是一个坑,如果想在增加规则的时候就指定规则的序号,我们可以 -I INPUT 2,表示在INPUT链的序号2的位置插入此条规则,即
iptables -t filter -I INPUT 2 -s 192.168.200.115 -j ACCEPT
查看INPUT链的规则序号,使用 iptables --line-number -nvL INPUT
删除规则
如果我们不小心写错了规则,那应该怎么办?
方法一:根据规则的序号,删除指定序号的规则
方法二:根据具体的匹配条件与动作删除规则
使用方法一,我们需要知道规则的序号,使用 --line-number 选项查询,我们查询下之前增加的规则,并试着删除一条
上图中,我们在查看了序号后,使用了带有 -D 选项的命令删除了序号3的规则,-D 表示delete,删除,INPUT 3指定了INPUT链的序号为3的规则
使用方法二,根据具体的匹配条件和动作去删除规则,如删除源地址为192.168.200.115,动作为DROP的规则
iptables -t filter -D INPUT -s 192.168.200.115 -j ACCEPT
,结果如下
如果我们想删除整条链,整个表的规则呢,一般情况下并不会这样,但是如果想,也是可以做到的,具体是使用
-F 选项;清除链的所有规则,使用 iptables -t 表名 -F 链名
,如 iptables -t filter -F INPUT
表示清除filter表上INPUT链的所有规则;清除表的所有规则,使用 iptables -t 表名 -F
,即不指定链名,删除所有链的规则,也就删除了表的所有规则;需要注意的是,使用 -F 选项清除规则,在没有保存规则的情况下,想要恢复原有状态将不可能
修改规则
同样的,我们可以增加、删除规则,我们也可以修改规则,修改规则需要使用到 -R 选项,类似以下格式
iptables -t 表名 -R 链名 序号 匹配条件 动作
,比如,如果我们想把ACCEPT更改为DROP,使用以下命令
iptables -t filter -R INPUT 1 -s 192.168.200.115 -j DROP
,执行成功,来查看一下是否变化
可以看到,之前的ACCEPT变成了DROP,需要注意的是,修改命令需要序号,并且匹配条件必须和原条件相同才能更改动作成功,如果 -s 选项没有指定对应的源地址,修改后的源地址将变为0.0.0.0/0,即所有IP,如果此时恰巧你修改了规则动作不为ACCEPT(即DROP ,REJECT),那么所有IP的报文到会被拒绝或丢弃,此时你的远程ssh也会断开连接,想要恢复,则必须到主机实地的更改,云主机也只能在控制台登录更改;
这样想来,如果想要更改动作,需要在更改时把匹配条件都加上才能成功,并且需要注意一定要指定源地址,如果想更改匹配条件,就只能删除重新创建一条新的规则了
如果我们想更改一条链的默认策略呢?这样就可以一次全部拒绝、丢弃,接受报文了,此时我们会用到 -P 选项
即 iptables -t 表名 -P 链名 动作
,如更改INPUT链为全部丢弃,首先,我们先为ssh的端口定义一条接受的规则,以免等下更改INPUT链的默认策略后断开连接,匹配条件可以更加需要定义,这里我接受所有IP 对ssh端口的访问,iptables -t filter -I INPUT -s 0.0.0.0/0 -j ACCEPT
,然后就可以更改链的默认策略了,你可以更改INPUT链,但保险起见,最后使用FORWARD链作为实验,即使使用INPUT链也没关系,前提是你已经给ssh端口添加了一条动作为ACCEPT,匹配条件为相应IP的规则
我们更改一下,iptables -t filter -P INPUT DROP
,该命令将INPUT链的默认策略更改成了DROP,查看一下
保存规则
在默认情况下,我们对iptables进行的修改都是暂时的,一旦重启iptables或者主机,所有的规则都将会清空,当然,我们不想看到这样的情况,所有需要保存iptables的规则
在CentOS6中保存规则,使用 service iptables save
命令,规则默认保存在/etc/sysconfig/iptables文件中,如果我们误操作了规则,但是没有保存,可以重启iptables服务,这样又会回到上次规则保存时,iptables 文件那个状态
在CentOS7中,由于不再使用init风格的脚本启动服务,而是使用unit风格文件,所以CentOS7不再默认使用service 启动相关的服务,在CentOS7中,使用firewall替代了原来的iptables service ,如果想使用service启动iptables服务,需要yum源安装iptables与iptables-service;安装后,规则保存同CentOS6的文件路径
默认情况下,启动,停止,重启iptables服务使用systemctl start/stop/restart firewalld,但是如果想使用service来保存iptables规则,需要systemctl 来停止firewalld,并且systemctl disable firewalld将其禁止自启动
此后,启动,停止,重启iptables服务可以使用systemctl start/stop/restart iptables,然后将iptables加入自启动,systemctl enable iptables,这样,就能使用service iptables save
保存iptables规则了
在Ubuntu中保存规则,可以使用iptables-persistent工具 ,下载工具
sudo apt-get install iptables-persistent
执行命令,进行保存,持久化
sudo netfilter-persistent save # 保存
sudo netfilter-persistent reload # 重新加载
通用的保存方案:即使用iptables-save命令,iptables-save命令并不能保存规则,但是会把规则打印到屏幕,使用iptables-save命令保存规则,就是将此命令的输出重定向到文件中,必要时重新加载该文件即可完成iptables规则的创建,但需要注意的是,文件是进行覆盖的,现有规则可能会消失
在网卡中加入以下内容,实现iptables规则随网卡状态保存加载
pre-up iptables-restore < /home/user/iptables.rules # 网卡开启,iptables加载iptables.rules文件规则
post-down iptables-save > /home/user/iptables.rules # 网卡停止,iptables规则保存到iptables.rules
重定向到文件 iptables-save > /home/user/iptables.rules
加载规则文件 iptables-restore < /home/user/iptables.rules
用的的一些参数:
pre-up: 网卡启用前的动作
up: 启用时候的动作
post-up: 启用后的动作
pre-down: 关闭前的动作
down: 关闭时动作
post-down: 关闭后动作