我有两台机器。
- 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 发夹结构将使用iptables和route_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。