我最近诊断出一个涉及 Docker 和iptables
.
我有一个具有以下iptables
设置的 Ubuntu 主机:
$ sudo iptables -L -t nat
[...]
Chain xyz (1 references)
target prot opt source destination
REDIRECT tcp -- anywhere anywhere tcp dpt:https /* xyz */ redir ports 8443
该规则用于将所有入站流量从端口 443 重定向到 8443。它旨在将流量重定向到基于 Java 的应用程序,该应用程序与我的 Docker 容器无关,但在同一台机器上运行,并且具有自签署的 SSL 证书。
当我使用 Docker 的默认网络设置在同一台机器上运行 Docker 容器并从容器内发出 wget HTTPS 请求时,Docker(或操作系统)似乎将出站连接重定向到 Ubuntu 主机上的端口 8443,并且,因此,本地基于 Java 的应用程序反过来接受连接(大部分时间)并返回无效(自签名)证书详细信息。结果,容器内的应用程序最终与主机上的本地 Java 应用程序进行通信,而不是与它们应该与之通信的 Internet 上的真实服务器进行通信。
我还验证了直接从 Ubuntu 主机发出的任何 wget HTTPS 请求都会命中 Internet 上的目标服务器。只有在同一主机上运行的 Docker 容器发起的请求才会出现此问题。
谁能解释为什么会这样?