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

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

[root@test001 ~]# netstat -anp | grep 6379
tcp        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(私有)
不是弹性ip

现在我对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,不太懂
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 3
  1. 问:
    本地地址可以通过 ip addr show 查看, 本地地址是有几个网段的, 10.0.0.0/8, 172.x.0.0/16, 192.168.1.0/24 等都可以是本地地址

  2. 问:
    那些端口没有关系, 一个是php7.4, 一个 是 redis, 两者没有关联

  1. redis 监听的是 0.0.0.0:6379 , 为什么会是 192.168.0.11:6379

因为 0.0.0.0 表示本机的所有ip,访问那个就显示哪个 ip, 可以用 redis-cli 命令链接, 就会有一条 127.0.0.1:6379 的命令

  1. netstat 第二条

    tcp 0 0 192.168.0.11:55160 41.92.250.40:6379 ESTABLISHED 3184/php7.4
    我猜测是 本地 php 链接远程 41.92.250.40:6379 的redis , 当然不一定是, mysql 也可以改用 6379 端口
    ESTABLISHED 是链接
    LISTEN 是本地监听服务

  1. 最后一条

    tcp 0 0 192.168.0.11:6379 41.92.250.40:55160 ESTABLISHED 949/redis-server 0.
    外网连本地 redis

3个月前 评论
bluememory (楼主) 3个月前

建议学习下计算机网络以及网络套接字相关知识。

简单说下网络套接字,以传统的CS架构软件Redis(端口为6379)举例,假设CS在同一局域网内。

客户端(C) 服务端(S)
内网IP:192.168.0.22 内网IP: 192.168.0.188
公网IP:41.92.250.16 公网IP: 41.92.250.88
  1. S启动Redis服务时,监听*:6379(即所有IP可访问)
    当C内网访问S的redis服务时,C会在本机1024~65535随机一个端口发起请求(假设端口为13057),S接收到了C的请求,这时对C来说,客户端IP+端口就组成了客户端连接套接字,即192.168.0.22:13057,服务端连接套接字为192.168.0.188:6379,由客户端与服务端连接套接字合并称为连接套接字对.

    计算机 套接字本地地址 套接字外部地址
    C 192.168.0.22:13057 192.168.0.188:6379
    S 192.168.0.188:6379 192.168.0.22:13057
  2. S启动Redis服务时,监听41.92.250.88:6379(即只提供公网IP访问)
    同上,C在本机1024~65535随机一个端口发起请求(假设端口为13057),套接字地址如下。

    计算机 套接字本地地址 套接字外部地址
    C 41.92.250.16:13057 41.92.250.88:6379
    S 41.92.250.88:6379 41.92.250.16:13057
  • 最后,本地地址和外部地址只是相对于本机而言,一般来说本机的套接字就是本地地址,非本机的套接字为外部地址,当然有种特殊请情况,即本机CS架构,本机IP访问本机服务,此时本机C套接字为本地地址,本机S套接字为外部地址。

文章中redis开放了所有IP可以访问,这是存在安全风险的,单机建议设置Redis监听IP为127.0.0.1即可。

3个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!