概述:
我在运行 Ubuntu Server 18.04 的机架服务器上运行了多个 Docker 容器。这些容器中的大多数都提供可通过 80 以外的端口上的浏览器访问的服务。我设置了一个 nginx 容器来提供反向代理,这样当我输入服务1.mydomain.com它会将请求传递给托管该服务的 ip+port 组合(该服务是另一个 docker 容器)。
这在我的局域网内运行得很好。在我家的任何一台电脑上我都可以输入服务.mydomain.com并可以访问容器。我拥有 mydomain,并设置了 DynamicDNS,并将端口 80 和 443 转发到 nginx 正在运行的 IP。
问题:
当我将容器设置为在 macvlan 网络上运行后,我可以从 LAN 外部(在工作时、在我的手机上等)访问服务。但是,当我使用默认的 Docker 桥接网络时,外部访问就会中断。我仍然可以从我家(LAN)内连接到容器,但无法再从我家外连接。
故障排除:
这就是我迄今为止尝试解决的问题。
- 在服务器上运行 tcpdump。可以看到发往 docker 的 ip:port 组合的数据包。
- 如果我从 LAN 内部发出请求,我会得到一个 [S] 标志,后跟一个 [S.] 标志,然后请求就会通过。
- 如果我从 LAN 外部发出请求,我会收到一堆 [S] 标记,表示请求未通过。似乎数据包在服务器的某个地方被丢弃了。
- 已禁用 UFW。没有帮助。
- 使用 netstat -i,RX-DRP 数据包没有变化,但发送到 docker0 和 eno2 接口的 RX-OK 数据包有所增加。来自 docker0 的 TX-OK 数据包有所增加,但来自 eno2 的 TX-OK 数据包没有增加。(nginx 使用的是 eno2 的 IP)
有什么想法吗?我已经搜索了好几天,但找不到此问题的任何示例。