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

embedded/2024/10/15 18:53:04/

在宿主机上使用 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 网络,可以更好地调试和管理容器的网络连接。


http://www.ppmy.cn/embedded/90851.html

相关文章

JavaWeb-HTML

一、HTML&CSS&JavaSript的作用: 1.HTML主要用于网页为主体结构的搭建&#xff1b; 2.CSS主要用于页面元素的美化 3.JavaScript主要用于页面元素的动态处理; 二、HTML HTML是Hyper Text Markup Language的缩写。意思是超文本标记语言。它的作用是搭建网页结构&…

Python与c,JAVA相比,最大的问题在哪?

Python、C和Java是三种非常流行的编程语言&#xff0c;它们各自有独特的优势和劣势。Python与C和Java相比&#xff0c;可能面临以下一些挑战或问题&#xff1a; 1. 执行速度&#xff1a; Python是一种解释型语言&#xff0c;通常比编译型语言C和Java运行得慢。C语言代码通常直…

WebRTC简介

WebRTC简介 WebRTC&#xff08;Web Real-Time Communication&#xff09;是一项开源的实时通信技术&#xff0c;它允许网页浏览器进行实时语音、视频和数据共享通信&#xff0c;而无需安装额外的插件或应用程序。WebRTC的出现极大地简化了实时通信的开发和部署过程&#xff0c…

力扣 77题 组合 记录

题目描述 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。你可以按 任何顺序 返回答案。示例 1&#xff1a; 输入&#xff1a;n 4, k 2 输出&#xff1a; [[2,4],[3,4],[2,3],[1,2],[1,3],[1,4], ]示例 2&#xff1a; 输入&#xff1a;n 1, k…

混合密度网络Mixture Density Networks(MDN)

目录 简介1 介绍2 实现3 几个MDN的应用&#xff1a;参考 简介 平方和或交叉熵误差函数的最小化导致网络输出近似目标数据的条件平均值&#xff0c;以输入向量为条件。对于分类问题&#xff0c;只要选择合适的目标编码方案&#xff0c;这些平均值表示类隶属度的后验概率&#x…

【网络安全】本地文件包含及远程文件包含漏洞详解

一、文件包含漏洞概述 1.1 什么是文件包含 开发人员将需要重复调用的函数写入一个文件&#xff0c;对该文件进行包含时产生的操作。这样编写代码能减少冗余&#xff0c;降低代码后期维护难度。 保证网站整体风格统一&#xff1a;导航栏、底部footer栏等&#xff0c;把这些不…

Docker Compose方式部署Ruoyi-前后端分离版本

目录 一. 环境准备 二. 制作一个jdk8u202环境的镜像 三. 制作nginx镜像 四. 对项目文件做修改 五. 项目打包 1. 前端打包 2. 后端打包 六. 编写docker-compose.yml 一. 环境准备 主机名IP系统软件版本配置信息localhost192.168.226.25Rocky_linux9.4 git version 2.4…

JaCoCo - Java Code Coverage Library

概述 JaCoCo&#xff08;Java Code Coverage&#xff09;是一个开源的Java代码覆盖率库。它可以帮助开发人员测量单元测试和集成测试中代码的覆盖情况。通过使用JaCoCo&#xff0c;开发人员可以识别哪些代码没有被测试覆盖&#xff0c;从而提高代码的质量和可靠性。 功能 1.…