今天发现一台测试服务器的防火墙规则很乱,使用firewall-cmd --list-all 出现如下输出:

[root@vultr ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0 eth1
  sources:
  services: cockpit dhcpv6-client http https ssh
  ports: 55698/tcp 58407/tcp 37463/tcp 40161/tcp 40161/udp 52124/tcp 52124/udp 21064/tcp 21064/udp 26579/tcp 
26579/udp 21568/tcp 21568/udp 62373/tcp 8153/tcp 8153/udp 31481/tcp 31481/udp 42223/tcp 42223/udp 48409/tcp 
48409/udp 16342/tcp 16342/udp 4621/tcp 4621/udp 59920/tcp 59920/udp 36181/tcp 36181/udp 63850/tcp 63850/udp 
19177/tcp 15603/tcp 10216/tcp 44644/tcp 44644/udp 3784/tcp 3784/udp 39575/tcp 39575/udp 53245/tcp 53245/udp
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

其中许多规则都是临时添加,之后再没用到过。

遗憾的是firewall-cmd没能提供和iptables -F一样清空规则的功能,因此需要使用其他办法清空防火墙端口规则。

本人使用的清空规则命令如下:

[root@vultr ~]# firewall-cmd --permanent --list-all | grep ports | head -n 1 | \
cut -d: -f2 | tr ' ' '\n' | xargs -I {} firewall-cmd --permanent --remove-port={}
success
success
success
....

需要注意的是,我们使用 --permanent 参数删除,防止给现有业务带来影响。

清空规则后,再添加必要的端口:

[root@vultr ~]# firewall-cmd --permanent --add-port=xxx/tcp

然后,就可以放心的重新加载防火墙规则:

[root@vultr ~]# firewall-cmd --reload

再次查看防火墙规则列表,无用的规则都移除了,又回到了清爽的状态:

[root@vultr ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0 eth1
  sources:
  services: cockpit dhcpv6-client http https ssh
  ports: 55698/tcp
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

参考

CentOS 8的firewalld已经与iptables解绑

Linux查看网络流量