为什么 firewall-cmd 会抛出错误“ALREADY_ENABLED”,但调用 firewall-cmd --list-ports 时未列出端口?

use*_*007 5 ssl https iptables port firewall-cmd

使用 CentOS 7,我尝试使用firewall-cmd --zone=public --add-port=443/tcp --permanent将 443 添加到我允许的端口。不幸的是,这会引发错误ALREADY_ENABLED: 443:tcp。但是当我使用firewall-cmd --list-ports它时并没有显示在列表中(“80/tcp 3000/tcp 26900/tcp 26900/udp”)。

我想这个问题是由 firewall-cmd 和 iptables 之间的冲突引起的。但我不知道如何调试它,以及这是否可能。

调用firewall-cmd --list-all结果如下表:

public
  target: default
  icmp-block-inversion: no
  interfaces:
  sources:
  services: ssh dhcpv6-client
  ports: 80/tcp 3000/tcp 26900/tcp 26900/udp
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
Run Code Online (Sandbox Code Playgroud)

Mic*_*ton 6

您所说的运行的命令会影响永久配置,而不是运行配置。但您正在列出正在运行的配置。这就是为什么你看不到它们。

您可以列出永久配置以确认规则已成功添加。

firewall-cmd --list-all --permanent
Run Code Online (Sandbox Code Playgroud)

您可以将规则添加到正在运行的配置中:

firewall-cmd --zone=public --add-port=443/tcp
Run Code Online (Sandbox Code Playgroud)

或者您可以从永久配置重新加载运行配置:

firewall-cmd --reload
Run Code Online (Sandbox Code Playgroud)

另请记住,firewalld 已为常见端口定义了服务,因此通常不需要按编号打开它们。例如,您可以不打开端口 80/tcp 和 443/tcp,而是说:

firewall-cmd --zone=public --add-service=http
firewall-cmd --zone=public --add-service=https
Run Code Online (Sandbox Code Playgroud)

最后,如果可能的话,最好更改正在运行的配置中的规则,验证它们是否正常工作,然后保存配置,而不是相反。如果出现问题并且您不小心将自己锁定在系统之外,这使您可以通过一种方式进行恢复。

您可以通过运行以下命令将运行配置保存到永久配置:

firewall-cmd --runtime-to-permanent
Run Code Online (Sandbox Code Playgroud)

(但是某些操作仅适用于永久配置,例如创建新区域。对于这些操作,您必须--permanent立即使用--reload防火墙。)