规则管理
规则管理
清空 INPUT 的规则
``` iptables -t filter -F INPUT
清空 INPUT 链以后,filter 表中的 INPUT 链已经不存在任何的规则,但是可以看出,INPUT 链的默认策略是 ACCEPT,也就是说,INPUT 链默认” 放行” 所有发往本机的报文,当没有任何规则时,会接受所有报文,当报文没有被任何规则匹配到时,也会默认放行报文
```bash
> iptables -t filter -L INPUT -v
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
就在另外一台机器上,使用 ping 命令,向当前机器发送报文,ping 命令可以得到回应,证明 ping 命令发送的报文已经正常的发送到了防火墙所在的主机
> ping -c 4 172.16.151.129
PING 172.16.151.129 (172.16.151.129): 56 data bytes
64 bytes from 172.16.151.129: icmp_seq=0 ttl=64 time=0.275 ms
64 bytes from 172.16.151.129: icmp_seq=1 ttl=64 time=0.286 ms
64 bytes from 172.16.151.129: icmp_seq=2 ttl=64 time=0.383 ms
64 bytes from 172.16.151.129: icmp_seq=3 ttl=64 time=0.667 ms
--- 172.16.151.129 ping statistics ---
4 packets transmitted, 4 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.275/0.403/0.667/0.158 ms
增加规则
在测试机上配置一条规则,拒绝 172.16.151.1 上的所有报文访问当前机器
规则由匹配条件与动作组成,那么 ”拒绝 172.16.151.1 上的所有报文访问当前机器” 这条规则中,报文的 ”源地址为 172.16.151.1″则属于匹配条件,如果报文来自”1172.16.151.1″,则表示满足匹配条件,而”拒绝”这个报文,就属于对应的动作
使用如下命令
-
-I选项,指明将”规则”插入至哪个链中,
-I
表示 insert,即插入的意思,所以-I INPUT
表示将规则插入于 INPUT 链中,即添加规则之意 -
-s
选项,指明”匹配条件”中的”源地址”,即如果报文的源地址属于-s
对应的地址,那么报文则满足匹配条件,-s
为 source 之意,表示源地址 -j
选项,指明当”匹配条件”被满足时,所对应的动作,上例中指定的动作为 DROP,当报文的源地址为 172.16.151.1 时,报文则被 DROP(丢弃)
查看建立的规则
> iptables -t filter -L INPUT -v -n
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 DROP all -- * * 172.16.151.1 0.0.0.0/0
再次尝试 ping 主机,PING 命令一直没有得到回应,说明 iptables 规则已经生效了,ping 发送的报文压根没有被主机接受,而是被丢弃了
> ping -c 4 172.16.151.129
PING 172.16.151.129 (172.16.151.129): 56 data bytes
Request timeout for icmp_seq 0
Request timeout for icmp_seq 1
Request timeout for icmp_seq 2
--- 172.16.151.129 ping statistics ---
4 packets transmitted, 0 packets received, 100.0% packet loss
此时,再次查看 iptables 中的规则,可以看到,已经有包被对应的规则匹配到
现在 INPUT 链中已经存在了一条规则,它拒绝了所有来自 1172.16.151.1 主机中的报文,如果此时,我们在这条规则之后再配置一条规则,后面这条规则规定,接受所有来自 172.16.151.1 主机中的报文
使用如下命令在 filter 表的 INPUT 链中追加一条规则,这条规则表示接受所有来自 172.16.151.1 的发往本机的报文:
-A
选项,表示在对应的链中”追加规则”,-A
为 append 之意,所以,-A INPUT
则表示在 INPUT 链中追加规则-A
表示在链的尾部追加规则,-I
表示在链的首部插入规则
插入后的规则
> iptables -t filter -L INPUT -v -n
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 DROP all -- * * 172.16.151.1 0.0.0.0/0
0 0 ACCEPT all -- * * 172.16.151.1 0.0.0.0/0
执行完添加规则的命令后,再次查看INPUT链,发现规则已经成功”追加”至 INPUT 链的末尾,那么现在,第一条规则指明了丢弃所有来自 172.16.151.1 的报文,第二条规则指明了接受所有来自 172.16.151.1 的报文
再次使用 ping 命令向主机发送报文,发现仍然是 ping 不通的,第二条规则并没有生效
再添加一条规则,新规则仍然规定接受所有来自 172.16.151.1 主机中的报文,只是这一次,将新规则添加至 INPUT 链的最前面
主机上已经可以正常的收到响应报文
如果报文已经被前面的规则匹配到,iptables则会对报文执行对应的动作,即使后面的规则也能匹配到当前报文,很有可能也没有机会再对报文执行相应的动作
之前在查看命令时提到过,使用 --line-number
选项可以列出规则的序号
也可以在添加规则时,指定新增规则的编号,这样就能在任意位置插入规则
- 仍然使用
-I
选项进行插入规则操作,-I INPUT 2
表示在 INPUT 链中新增规则,新增的规则的编号为 2
删除规则
删除的方式:
- 根据规则的编号去删除规则
- 根据具体的匹配条件与动作删除规则
例如现在有如下规则
> iptables -t filter -L INPUT -v -n --line-numbers
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 ACCEPT all -- * * 172.16.151.9 0.0.0.0/0
2 0 0 DROP all -- * * 172.16.151.9 0.0.0.0/0
3 0 0 DROP all -- * * 172.16.151.9 0.0.0.0/0
4 0 0 ACCEPT all -- * * 172.16.151.9 0.0.0.0/0
想要删除上面第 2 条规则,则可以使用如下命令
-D
选项表示删除指定链中的某条规则,-D INPUT 2
表示删除 INPUT 链中的第 2 条规则
也可以根据具体的匹配条件与动作去删除规则,比如,删除下图中源地址为 172.16.151.9,动作为ACCEPT的规则
注意该命令只删除第一个命中的
[root@virt ~]# iptables -t filter -L INPUT -v -n --line-numbers
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 ACCEPT all -- * * 172.16.151.9 0.0.0.0/0
2 0 0 DROP all -- * * 172.16.151.9 0.0.0.0/0
3 0 0 ACCEPT all -- * * 172.16.151.9 0.0.0.0/0
[root@virt ~]# iptables -t filter -D INPUT -s 172.16.151.9 -j ACCEPT
[root@virt ~]# iptables -t filter -L INPUT -v -n --line-numbers
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 DROP all -- * * 172.16.151.9 0.0.0.0/0
2 0 0 ACCEPT all -- * * 172.16.151.9 0.0.0.0/0
删除指定表中某条链中的所有规则的命令
-F
选项为 flush 之意,即冲刷指定的链,即删除指定链中的所有规则,但是注意,此操作相当于删除操作,在没有保存 iptables 规则的情况下,请慎用
-F
选项不仅仅能清空指定链上的规则,其实它还能清空整个表中所有链上的规则,不指定链名,只指定表名即可删除表中的所有规则
修改规则
现有如下规则,想把如下规则中的动作从 DROP 改为 REJECT
> iptables -t filter -L INPUT -v -n --line-numbers
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 DROP all -- * * 172.16.151.9 0.0.0.0/0
可以使用 -R
选项修改指定的链中的规则,在修改规则时指定规则对应的编号即可
-s
选项以及对应的源地址不可省略,即使我们已经指定了规则对应的编号,但是在使用 -R
选项修改某个规则时,必须指定规则对应的原本的匹配条件(如果有多个匹配条件,都需要指定)
修改后
> iptables -t filter -L INPUT -v -n --line-numbers
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 REJECT all -- * * 172.16.151.9 0.0.0.0/0 reject-with icmp-port-unreachable
上例中的命令没有使用 -s
指定对应规则中原本的源地址,那么在修改完成后,你修改的规则中的源地址会自动变为 0.0.0.0/0(此 IP 表示匹配所有网段的 IP 地址),而此时,-j
对应的动作又为 REJECT,所以在执行上述命令时如果没有指明规则原本的源地址,那么所有 IP 的请求都被拒绝
iptables -t filter -R INPUT 1 -j REJECT
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
每张表的每条链中,都有自己的默认策略,也可以理解为默认”动作”,还可以修改指定链的”默认策略”
当报文没有被链中的任何规则匹配到时,或者,当链中没有任何规则时,防火墙会按照默认动作处理报文,可以修改指定链的默认策略
- 使用
-P
选项指定要修改的链,上例中,-P FORWARD DROP
表示将表中 FORWRD 链的默认策略改为 DROP
保存规则
- iptables-services
# 配置好 yum 源以后安装 iptables-service
# yum install -y iptables-services
# 停止 firewalld
systemctl disable --now firewalld
# 将 iptables 设置为开机自动启动,以后即可通过 iptables-service 控制 iptables 服务
systemctl enable --now iptables
- iptables-save 和 iptables-restore
还可以使用另一种方法保存 iptables 规则,就是使用 iptables-save 命令,使用 iptables-save 并不能保存当前的 iptables 规则,但是可以将当前的 iptables 规则以” 保存后的格式” 输出到屏幕上,需要手动重定向
使用 iptables-restore 命令可以从指定文件中重载规则,示例如下