0

我最近诊断出一个涉及 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 容器发起的请求才会出现此问题。

谁能解释为什么会这样?

4

1 回答 1

1

示例不完整。您尚未显示此链的链接位置。无论如何我都会尝试回答,但您可能希望将您的 IPtables 规则减少到一个除了重现您的问题之外什么都不做的集合。

iptables 的工作方式是传入的数据包应用了匹配规则。任何匹配它的规则都应用了它的目标。

在您的情况下,可能发生的是您的出站数据包在此规则上匹配,因此也被重定向。

由于 REDIRECT 目标位于预路由表中,并且该目标不限于传入流量,因此您需要以某种方式限制匹配。最简单的可能是添加! -i lo到规则中。这应该防止匹配通过环回接口到达的数据包。

于 2016-09-13T05:56:25.953 回答