跳转至

规则管理

规则管理

清空 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″,则表示满足匹配条件,而”拒绝”这个报文,就属于对应的动作

使用如下命令

iptables -t filter -I INPUT -s 172.16.151.1 -j DROP
  • -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 的发往本机的报文:

iptables -t filter -A INPUT -s 172.16.151.1 -j ACCEPT
  • -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 -t filter -I INPUT -s 172.16.151.1 -j ACCEPT

主机上已经可以正常的收到响应报文

如果报文已经被前面的规则匹配到,iptables则会对报文执行对应的动作,即使后面的规则也能匹配到当前报文,很有可能也没有机会再对报文执行相应的动作

之前在查看命令时提到过,使用 --line-number 选项可以列出规则的序号

iptables -t filter -L INPUT -v -n --line-numbers

也可以在添加规则时,指定新增规则的编号,这样就能在任意位置插入规则

iptables -t filter -I INPUT 2 -s 172.16.151.1 -j ACCEPT
  • 仍然使用 -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 条规则,则可以使用如下命令

iptables -t filter -D INPUT 2
  • -D 选项表示删除指定链中的某条规则,-D INPUT 2 表示删除 INPUT 链中的第 2 条规则

也可以根据具体的匹配条件与动作去删除规则,比如,删除下图中源地址为 172.16.151.9,动作为ACCEPT的规则

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

删除指定表中某条链中的所有规则的命令

iptables -t filter -F INPUT
  • -F 选项为 flush 之意,即冲刷指定的链,即删除指定链中的所有规则,但是注意,此操作相当于删除操作,在没有保存 iptables 规则的情况下,请慎用

-F 选项不仅仅能清空指定链上的规则,其实它还能清空整个表中所有链上的规则,不指定链名,只指定表名即可删除表中的所有规则

iptables -t 表名 -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 -R INPUT 1 -s 172.16.151.9 -j 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 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

每张表的每条链中,都有自己的默认策略,也可以理解为默认”动作”,还可以修改指定链的”默认策略”

当报文没有被链中的任何规则匹配到时,或者,当链中没有任何规则时,防火墙会按照默认动作处理报文,可以修改指定链的默认策略

iptables -t filter -P FORWARD DROP
  • 使用 -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-save > /etc/sysconfig/iptables

使用 iptables-restore 命令可以从指定文件中重载规则,示例如下

iptables-restore < /etc/sysconfig/iptables