使用docker容器的机器之间的端口映射

使用docker容器的机器之间的端口映射

我有两台机器。

  • 192.168.0.10
  • 192.168.0.20

其中运行一些 docker 服务。

在第二台机器上,我看到几个端口上有来自第一台机器服务的传入流量。

但是当我检查第一个主机时,我没有看到这些端口正在使用。

例如我将看到:

 192.168.0.10:48002 ->  192.168.0.20
 192.168.0.10:51364 ->  192.168.0.20
 192.168.0.10:52502 ->  192.168.0.20

但是当我进入 192.168.0.10 检查这些端口时,没有显示它们正在使用中。

因此结果是空的:

sudo netstat -tulpan | grep '52502'

这可能是什么原因造成的?我该如何调查?我怀疑这可能与 docker 容器和端口映射有关?

编辑:

扫描服务本身会显示如下内容:

tcp6       0      0 127.0.0.1:48806         127.0.0.1:8088          ESTABLISHED 1065071/java

内部端口转到 docker 网络上的另一个端口...然后什么都没有。我是否可以假设这是所有其他流量都通过的某种隧道?我该如何映射它?

答案1

当您连接到 tcp 服务时,目标端口是预先知道的(例如80对于 http 服务),但是在创建套接字时会随机选择源端口,通常端口号高于 32767。

您看到的三个端口192.160.0.10是连接的源端口192.168.0.20

答案2

容器流量不是在 Docker 上发起或终止的主持人因为它是从 Docker 路由或路由到 Docker容器主机本身充当路由器,没有用于此流量的套接字(docker-proxy处理NAT 发夹结构当没有使用 禁用时--userland-proxy=false,在这种情况下 NAT 发夹结构将使用iptablesroute_localnet)。

Docker 使用iptables和 NAT,所有这些都由 Netfilter 的连接跟踪

要查看跟踪的流量,请使用conntrack命令(conntrack如果需要,请安装该软件包)。由于所有这些流量都经过了 NAT,因此此命令将显示所有相关流量:

conntrack -L --any-nat -d 192.168.0.20

它应该在地址为 192.168.0.10 的系统上运行,显示从地址为 192.168.0.20 的系统看到的源 NAT 流(容器作为客户端)。

如果地址为 192.168.0.20 的系统上的目标应用程序也在 Docker 容器中,则在该系统上运行相同的命令将显示目标 NAT 流(容器作为服务器)。如果不是,则不会显示任何内容,因为没有可显示的 NAT。

相关内容