如何更正 firewalld 和 docker/nginx 的配置?
How to correct configuration for firewalld and docker/nginx?
我有一台 CentOS 7 服务器,它 运行 愉快地运行了 600 多天,直到它最近重新启动,之后传入的 Web 请求收到 HTTP523(来源无法访问)错误代码(通过 Cloudflare,如果这有区别吗?)除非我停止了 firewalld
服务。 运行 没有 firewalld
也很好,但我宁愿不禁用它!
我试过停止 docker
和 firewalld
并以不同的顺序重新启动它们,但同样的 523
错误发生,除非我停止 firewalld
.
/var/log/firewalld
包含一些可能有用的警告:
WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -D FORWARD -i br-8acb606a3b50 -o br-8acb606a3b50 -j DROP' failed: iptables: Bad rule (does a matching rule exist in that chain?).
WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -D FORWARD -i docker0 -o docker0 -j DROP' failed: iptables: Bad rule (does a matching rule exist in that chain?).
WARNING: AllowZoneDrifting is enabled. This is considered a n insecure configuration option. It will be removed in a future release. Please consider disabling it now.
WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t nat -D PREROUTING -m addrtype --dst-type LOCAL -j DOCKER' failed: iptables v1.4.21: Couldn't load target 'DOCKER':No such file or directory
WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t nat -D PREROUTING' failed: iptables: Bad rule (does a matching rule exist in that chain?).
WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t nat -D OUTPUT' failed: iptables: Bad rule (does a matching rule exist in that chain?)
WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t nat -F DOCKER' failed: iptables: No chain/target/match by that name.
我发现周围关于需要任何手册 configuration/commands 的建议似乎相互矛盾:
firewall-cmd --permanent --zone=trusted --add-interface=docker0
on a CentOS forum
firewall-cmd --zone=trusted --remove-interface=docker0 --permanent
on the offical Docker docs -- 这肯定与上面的相反?
- a bunch of manual
firewall-cmd
commands on a Docker github issue -- 当然不需要所有这些?
- 这个看起来很有希望 --
nmcli
, NetworkManager
and firewall-cmd --permanent --zone=trusted --change-interface=docker0
我不完全理解 br-8acb606a3b50
接口的来源,或者如果我使用像 4.
多于?多年来它一直自动运行良好,直到重新启动!
现在是否需要一些神奇的 firewalld
咒语(为什么?!)或者有什么方法可以让系统恢复到重新启动之前的正确 auto/default 配置?
$ docker -v
Docker version 20.10.5, build 55c4c88
$ firewall-cmd --version
0.6.3
$ firewall-cmd --get-zones
block dmz docker drop external home internal public trusted work
我在使用 Podman 时遇到了一些类似的问题,对我来说,我不得不从 Debian 9 升级到 Debian 10 才能修复它,因为 firewalld 处理 iptables 和 nftables 的方式不同。
回顾一下 chat investigation,这个特殊问题与 Docker 和容器无关。问题出在 firewalld
没有 NGINX
运行 的规则作为主机上容器的代理。解决方案是为 HTTP 和 HTTPS 流量添加永久 firewalld 规则:
sudo firewall-cmd --permanent --zone=public --add-service=http
sudo firewall-cmd --permanent --zone=public --add-service=https
sudo firewall-cmd --reload
像这样的警告信息:
WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -D FORWARD -i br-8acb606a3b50 -o br-8acb606a3b50 -j DROP' failed: iptables: Bad rule (does a matching rule exist in that chain?)
... 可以在正常操作期间出现,当 Docker 尝试删除规则而不先检查其是否存在时。换句话说,即使有这样的警告,容器也可以运行顺利
我有一台 CentOS 7 服务器,它 运行 愉快地运行了 600 多天,直到它最近重新启动,之后传入的 Web 请求收到 HTTP523(来源无法访问)错误代码(通过 Cloudflare,如果这有区别吗?)除非我停止了 firewalld
服务。 运行 没有 firewalld
也很好,但我宁愿不禁用它!
我试过停止 docker
和 firewalld
并以不同的顺序重新启动它们,但同样的 523
错误发生,除非我停止 firewalld
.
/var/log/firewalld
包含一些可能有用的警告:
WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -D FORWARD -i br-8acb606a3b50 -o br-8acb606a3b50 -j DROP' failed: iptables: Bad rule (does a matching rule exist in that chain?).
WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -D FORWARD -i docker0 -o docker0 -j DROP' failed: iptables: Bad rule (does a matching rule exist in that chain?).
WARNING: AllowZoneDrifting is enabled. This is considered a n insecure configuration option. It will be removed in a future release. Please consider disabling it now.
WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t nat -D PREROUTING -m addrtype --dst-type LOCAL -j DOCKER' failed: iptables v1.4.21: Couldn't load target 'DOCKER':No such file or directory
WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t nat -D PREROUTING' failed: iptables: Bad rule (does a matching rule exist in that chain?).
WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t nat -D OUTPUT' failed: iptables: Bad rule (does a matching rule exist in that chain?)
WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t nat -F DOCKER' failed: iptables: No chain/target/match by that name.
我发现周围关于需要任何手册 configuration/commands 的建议似乎相互矛盾:
firewall-cmd --permanent --zone=trusted --add-interface=docker0
on a CentOS forumfirewall-cmd --zone=trusted --remove-interface=docker0 --permanent
on the offical Docker docs -- 这肯定与上面的相反?- a bunch of manual
firewall-cmd
commands on a Docker github issue -- 当然不需要所有这些? - 这个看起来很有希望 --
nmcli
,NetworkManager
andfirewall-cmd --permanent --zone=trusted --change-interface=docker0
我不完全理解 br-8acb606a3b50
接口的来源,或者如果我使用像 4.
多于?多年来它一直自动运行良好,直到重新启动!
现在是否需要一些神奇的 firewalld
咒语(为什么?!)或者有什么方法可以让系统恢复到重新启动之前的正确 auto/default 配置?
$ docker -v
Docker version 20.10.5, build 55c4c88
$ firewall-cmd --version
0.6.3
$ firewall-cmd --get-zones
block dmz docker drop external home internal public trusted work
我在使用 Podman 时遇到了一些类似的问题,对我来说,我不得不从 Debian 9 升级到 Debian 10 才能修复它,因为 firewalld 处理 iptables 和 nftables 的方式不同。
回顾一下 chat investigation,这个特殊问题与 Docker 和容器无关。问题出在 firewalld
没有 NGINX
运行 的规则作为主机上容器的代理。解决方案是为 HTTP 和 HTTPS 流量添加永久 firewalld 规则:
sudo firewall-cmd --permanent --zone=public --add-service=http
sudo firewall-cmd --permanent --zone=public --add-service=https
sudo firewall-cmd --reload
像这样的警告信息:
WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -D FORWARD -i br-8acb606a3b50 -o br-8acb606a3b50 -j DROP' failed: iptables: Bad rule (does a matching rule exist in that chain?)
... 可以在正常操作期间出现,当 Docker 尝试删除规则而不先检查其是否存在时。换句话说,即使有这样的警告,容器也可以运行顺利