关于netstat查不到映射端口的连接信息的原因

在宿主机上使用 netstat -ano 无法查到公网访问容器映射的端口连接信息,但可以查到内网IP访问容器映射端口的信息,而在容器中 netstat -ano 都可以查到,这是因为 Docker 的网络命名空间隔离和 NAT(网络地址转换)规则导致的。

关键点解析

  1. 网络命名空间隔离

    • 容器运行在独立的网络命名空间中,因此容器内部的网络连接和端口状态在宿主机上不可见,反之亦然。
  2. NAT 和端口映射

    • Docker 使用 NAT 来实现宿主机端口到容器端口的映射。当一个公网IP访问宿主机的映射端口时,数据包首先到达宿主机的网络堆栈,然后通过 NAT 转发到相应的容器。
    • 宿主机上的 netstat 显示的是宿主机网络堆栈中的连接,而不是容器内的连接。这意味着公网IP的连接可能被 docker-proxy 或 NAT 处理,不直接显示在宿主机的 netstat 结果中。

内网IP访问 vs 公网IP访问

  • 内网IP访问

    • 内网IP直接访问容器的映射端口,宿主机上的 netstat 可以显示这些连接,因为这些连接没有经过复杂的 NAT 转发。
  • 公网IP访问

    • 公网IP访问宿主机的映射端口,连接经过 NAT 转发到容器。这些连接在宿主机上可能仅显示为 docker-proxy 进程,而具体的连接信息则存在于容器内部的网络堆栈中。

具体示例

假设你有一个 Nginx 容器,宿主机的 8080 端口映射到容器的 80 端口:

docker run -d -p 8080:80 nginx
宿主机上的 netstat -ano 示例

在宿主机上,使用 netstat -ano

netstat -anop | grep 8080

可能看到的输出:

tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      1234/docker-proxy
  • 这里显示的是宿主机上的 8080 端口在监听,由 docker-proxy 处理。

如果有内网IP访问,可以看到类似于:

tcp        0      0 192.168.1.100:8080      192.168.1.101:56789     ESTABLISHED 1234/docker-proxy
  • 显示的是内网IP访问的连接信息。
容器内部的 netstat -ano 示例

在容器内部,使用 netstat -ano

docker exec -it <container_id> /bin/bash
netstat -ano

可能看到的输出:

tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      1/nginx
tcp        0      0 172.17.0.2:80           192.168.1.100:56789     ESTABLISHED 1/nginx
tcp        0      0 172.17.0.2:80           203.0.113.50:12345      ESTABLISHED 1/nginx
  • 容器内部可以看到所有连接,包括内网和公网的访问连接。

解决方法和验证步骤

  1. 检查 Docker 端口映射

    docker ps
    

    确认端口映射正确。

  2. 使用 ss 命令
    在宿主机上,ss 命令可能比 netstat 提供更详细的连接信息:

    ss -tuln | grep 8080
    
  3. 检查 iptables 规则

    sudo iptables -t nat -L -n
    

    查看 Docker 的 NAT 规则,确认端口映射。

  4. 检查 docker-proxy 进程

    ps aux | grep docker-proxy
    

总结

由于 Docker 的网络隔离和 NAT 机制,宿主机上的 netstat -ano 可能无法直接显示公网访问的容器端口连接信息。这些连接信息在容器内部是可见的,因为连接最终终止在容器的网络堆栈中。通过理解和配置 Docker 网络,可以更好地调试和管理容器的网络连接。

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值