当前位置: 首页 > 知识库问答 >
问题:

linux - 如何理解netstat的本地地址和外部地址?

楚承天
2024-01-20

我在服务器上执行如下命令:
netstat -anp | grep 6379
查看redis的6379端口情况,结果如下所示:

[root@test001 ~]# netstat -anp | grep 6379tcp        0      0 0.0.0.0:6379            0.0.0.0:*               LISTEN      949/redis-server 0. tcp        0      0 192.168.0.11:55160      41.92.250.40:6379       ESTABLISHED 3184/php7.4         tcp        0    100 127.0.0.1:6379          127.0.0.1:42116         ESTABLISHED -                   tcp        0      0 192.168.0.11:55164      41.92.250.40:6379       ESTABLISHED 3216/php7.4         tcp        0      0 127.0.0.1:41684         127.0.0.1:6379          TIME_WAIT   -                   tcp        0      0 127.0.0.1:41688         127.0.0.1:6379          TIME_WAIT   -                   tcp        0      0 127.0.0.1:37384         127.0.0.1:6379          ESTABLISHED 29046/php           tcp        0      0 127.0.0.1:42116         127.0.0.1:6379          ESTABLISHED 30970/php-fpm: pool tcp        0      0 192.168.0.11:6379       41.92.250.40:55164      ESTABLISHED 949/redis-server 0. tcp        0      0 192.168.0.11:55156      41.92.250.40:6379       ESTABLISHED 3182/php7.4         tcp        0      0 192.168.0.11:6379       41.92.250.40:55156      ESTABLISHED 949/redis-server 0. tcp        0      0 127.0.0.1:6379          127.0.0.1:37384         ESTABLISHED 949/redis-server 0. tcp        0      0 127.0.0.1:41682         127.0.0.1:6379          TIME_WAIT   -                   tcp        0      0 192.168.0.11:6379       41.92.250.40:55160      ESTABLISHED 949/redis-server 0. 

上面的192.168.0.11是内网地址,41.92.250.40是公网地址(当然为了安全我这边是随便改了不是真实的地址)
阿某云买的服务器,上面有两个ip
41.92.250.40(公)
192.168.0.11(私有)

现在我对Local Address 本地地址还有Foreign Address 外部地址不懂,比如以第二条数据为例:

tcp        0      0 192.168.0.11:55160      41.92.250.40:6379       ESTABLISHED 3184/php7.4

这里的55160端口是什么?还有和他配对的是不是最后一条

tcp        0      0 192.168.0.11:6379       41.92.250.40:55160      ESTABLISHED 949/redis-server 0. 

感觉正好反过来似的,如何理解这两对的地址加端口?

我的问题是:

  1. 如何理解本地地址和外部地址?
  2. 上面样例的55160端口是什么意思?以及55160对应的ip地址一下192.168.0.11一下41.92.250.40,不太懂

共有2个答案

冯浩旷
2024-01-20

根据你的描述,我假设这个公网 IP 是你服务器的 EIP(弹性公网IP),那么我猜整个连接建立的过程是这样的:

  1. 首先,你的web服务器(php)程序调用connect系统调用发起一个tcp连接,目的地址是41.92.250.40,目的端口是6379。
  2. 内核在处理connect调用时,会先查路由,找到去41.92.250.40这个地址的接口,发现接口的IP地址是192.168.0.11,然后再根据端口选择算法选择一个本地端口55160。完成这些动作之后,会在内核中创建一条连接,连接的Local Address是192.168.0.11,Foreign Address是41.92.250.40。
  3. 请求报文从你服务器的内网口出去之后,送给了41.92.250.40这个地址。41.92.250.40 是EIP,是配置在你的网关上的,所以网关收到了你的请求。报文大概是这样:

    192.168.0.11:55160 -> 41.92.250.40:6379  
  4. 网关收到这个包之后,先会匹配源,替换成服务器的EIP,完成这步之后,报文大概是这样:

    41.92.250.40:55160 -> 41.92.250.40:6379  
  5. 然后发包,匹配目的,发现目的是EIP,对应的内网IP是192.168.0.11,所以再次进行替换:

    41.92.250.40:55160 -> 192.168.0.11:6379  
  6. 这个包的目的地址还是你服务器的地址,所以最终这个包又回到了你的服务器,在服务器上建立一条41.92.250.40:55160 -> 192.168.0.11:6379的连接,并把请求送给了redis-server这个进程。

综上,你用netstat看到的统计就成了那个样子。

PS:如果41.92.250.40这个地址不是EIP,是真实配置在你服务器接口上的地址,那么第二步里的请求报文根本都不会走出你的服务器,所以大概率你会看到这样的连接:

41.92.250.40:55160 -> 41.92.250.40:6379
经昱
2024-01-20

本机与另外一台机器有一个连接,本机的地址就是本地地址。另外一台机器的地址是外部地址。

一个连接的两端各有一个端口。端口可以是程序指定的(比如用 bind 启动服务),也可能是自动分配的(比如你连接到某一个服务的时候,自己的端口通常就是自动分配的)。

自动分配的时候端口范围通常一个固定的区间(根据操作系统而不同),所以不同的机器分配到同一个端口号是很正常的。

你说的那个正好反过来,可能只是碰巧另一台机器连了本机的 redis ,也去了它的 redis 。分配的端口号又碰巧是一样的。

本机地址的端口跟外部地址的端口没有任何联系。

本机地址,本机端口,外部地址,外部端口 四个属性决定了一个连接。

如果连接两端是同一台机器,那么一个连接在 netstat 里就会出现两次。比如你给出 127.0.0.1:6379 -- 127.0.0.1:37384 这个连接。

 类似资料:
  • 我无法理解为什么这个命令不起作用: 注意:我已经用把上面的链接本地地址弄错了,但我有一些有效的链接本地ipv6地址是端口号。 我得到了一个错误: 我也试着放单引号/双引号,但结果是同样的错误: 我使用的是OpenSSL 1.1.0f版本,它应该支持IPv6。 使用IPv4地址,它可以工作。

  • 所以有几个网站会为你计算你的链接本地ipv6地址,就像这里的这个。 尽管如此,它并没有给出任何有用的关于这个地址是如何计算的,也没有输入参数是什么。那么,如果一个人知道自己的ipv4地址、子网掩码和网关地址,计算链路本地ipv6地址的过程(或算法)是什么?我正在使用SCTP套接字做一个项目,该项目使用ISATAP网络隧道和LL ipv6地址用于构建ISATAP地址。

  • 这是我的docker-compose.yml代码: 下面是我的traefik.toml代码:

  • 问题内容: 我正在一个小型嵌入式系统上工作。当我的linux启动到用户空间时,我知道物理内存中的设备在哪里。我想将它们映射到用户空间虚拟地址。目前,我正在通过内核模块进行操作。我使用vmalloc / kmalloc(取决于大小),然后在返回的虚拟地址上使用ioremap_page_range映射我的物理地址。我不认为这是正确的方法。首先,我分配内存,然后要求内核将虚拟地址空间重新映射到一些不同的

  • 问题内容: 除了手动浏览页面目录条目之外,是否有任何合适的方法可以通过逻辑地址获取物理地址?我在内核的源代码中寻找了此功能,并发现有一个功能可以很好地利用内置的巨大和透明页面支持。但是它没有导出到内核模块(为什么?)… 因此,我不想发明轮子,我认为手动重新实现功能不是很好。 问题答案: 好吧,它看起来可能像这样(在虚拟地址后跟随PTE):

  • 需求是当本地程序请求一个IP地址的时候,映射到另一个ip地址上去。 和DNS不同的是,这里没有解析域名,因此修改hosts不行。 有没有办法或者工具可以做到?