nginx 无法通过服务器公共IP访问Docker容器(仅在禁用UFW的情况下工作)

hxzsmxv2  于 2023-01-01  发布在  Nginx
关注(0)|答案(1)|浏览(202)

我在Vultr(主机系统Ubuntu 22.04)上购买了一个VPS,示例IP标识为123.123.123,并尝试使用以下命令启动一个新容器:

docker run -d -p 8081:80 nginx:alpine

知道我的服务器的公共IP,理论上我应该能够通过浏览器http://123.123.123:8081中的以下地址访问它。然而,它至少在公共环境下不工作.因为如果我决定在主机中停止UFW(使用Ubuntu 22.04):

service ufw stop

然后我就可以访问它,没有任何问题(或通过SSH使用cURL,而不禁用UFW):

但是,在使用以下命令启用简单的防火墙后:

service ufw start

则主机不可访问:

以下是UFW的现行规则:

我也有一个通过docker的Portainer示例(只有在UFW被禁用时才能正常工作):

我也尝试过使用Nginx代理管理器,但是我无法让它在像这个Nginx基本容器这样简单的东西上工作。任何帮助都是感激的,如果有必要的话,我很乐意提供更多信息。

fjaof16o

fjaof16o1#

令人惊讶的是,Docker不能与Linux的“通用防火墙”(UFW)一起开箱即用,它们都修改了相同的iptables配置,这可能导致错误配置暴露不应该是公共的容器。
Docker官方文档中的一个快速修复--但不推荐大多数用户使用--其他许多用户似乎也不推荐使用。请阅读下面的详细信息。

防止Docker操作iptables

可以在/etc/docker/daemon.json的Docker引擎配置文件中将iptables键设置为false,但此选项不适合大多数用户,无法完全阻止Docker创建iptables规则。并且在事后创建它们是极其复杂的并且超出了这些说明的范围。将iptables设置为false很可能会破坏Docker引擎的容器网络。
这是可行的,然而,这只是解决方案的一半。它禁用了Docker管理自己网络的能力,并可能导致容器无法访问互联网在所有开箱即用。这仍然可以工作,但你需要手动维护iptables规则的Docker容器和自定义网络,这是复杂的,恼人的,并击败了UFW的简单的目的。
另一个需要更多努力的解决方案可以在这个Github回购中找到,详细说明了问题和修复步骤。https://github.com/chaifeng/ufw-docker
这里还链接了StackOverflow的一个相关问题。

相关问题