跳转到内容

Linux端口与ss命令详解

1. 课程介绍

接下来我们学习端口管理和ss命令。端口是程序与外部通信的出入口,HTTP用80端口,SSH用22端口等。ss命令用于查看网络连接和端口监听状态,比旧的netstat命令更快更简洁。常用ss -tlnp查看TCP监听端口和对应的进程。端口管理是网络安全和故障排查的重要部分。

2. 端口的概念

基本定义

端口(Port)是设备与外界通讯交流的出入口,用于标识设备上不同的网络服务或程序。

通俗理解

想象一下你的电脑是一栋大楼:

  • IP地址 = 大楼的地址(比如:192.168.88.100)
  • 端口 = 大楼里的房间号(比如:22、80、3306)
  • 程序 = 在房间里工作的人

当外面的人要找某人时,需要知道:

  1. 大楼的地址(IP地址)
  2. 房间的号码(端口号)

端口的作用

  • 标识网络服务:通过端口可以唯一标识设备上的不同网络服务或程序
  • 实现多路复用:允许同一台设备上的多个程序同时与网络进行通信
  • 确保通信准确性:在IP地址的基础上,通过端口进一步锁定具体的程序

3. 物理端口与虚拟端口

物理端口

物理端口又称为接口,是计算机硬件设备上的可见接口,用于连接外部设备。

常见的物理端口

  • USB接口:用于连接USB设备
  • RJ45接口:用于连接网线
  • HDMI接口:用于连接显示器
  • VGA接口:用于连接显示器
  • DVI接口:用于连接显示器

💡 提示:本课程主要讲的是虚拟端口,不是这些物理接口哦!

虚拟端口

虚拟端口是计算机内部的端口,不可见,用于操作系统与外部程序之间的交互。

虚拟端口的特点

  • 不可见:虚拟端口是软件层面的概念,无法直接看到
  • 程序识别:用于标识计算机上的不同程序或服务
  • 通信标识:在网络通信中,用于确定数据应该发送到哪个程序

💡 类比:物理端口就像门把手,看得见摸得着;虚拟端口就像房间号,看不见但很重要

4. 虚拟端口的作用

程序间通信

虚拟端口的主要作用是实现不同计算机上的程序之间的通信。

通信过程

  • 计算机A上的程序通过某个端口发出访问请求
  • 访问请求包含目标计算机B的IP地址和目标程序的端口号
  • 计算机B收到请求后,通过端口号将数据发送到对应的程序

端口与IP地址的关系

  • IP地址:用于标识网络中的计算机,相当于小区地址
  • 端口号:用于标识计算机上的程序,相当于小区中的门牌号
  • 完整标识:IP地址 + 端口号 = 唯一标识网络中的某个程序

💡 例子192.168.88.100:22 表示IP地址为192.168.88.100的计算机上的22号端口

5. Linux系统中的端口分类

Linux系统支持65535个虚拟端口,这些端口分为三类:

1. 公认端口(Well-Known Ports)

  • 范围:1 - 1023
  • 用途:用于系统内置或知名程序的预留使用
  • 特点:由IANA(互联网号码分配局)统一分配和管理
  • 常见例子
    • SSH服务:22端口
    • HTTP服务:80端口
    • HTTPS服务:443端口
    • FTP服务:21端口
    • Telnet服务:23端口

⚠️ 注意:公认端口需要root权限才能使用

2. 注册端口(Registered Ports)

  • 范围:1024 - 49151
  • 用途:用于松散绑定程序或服务
  • 特点:可以由用户程序自由使用,但需要在IANA注册
  • 常见例子
    • MySQL数据库:3306端口
    • Tomcat服务器:8080端口
    • Redis服务:6379端口
    • MongoDB服务:27017端口

3. 动态端口(Dynamic Ports)

  • 范围:49152 - 65535
  • 用途:用于临时使用,不固定绑定程序
  • 特点:当程序对外发起网络连接时临时分配使用

💡 类比

  • 公认端口 = VIP专用停车位(0-1023)
  • 注册端口 = 普通停车位(1024-49151)
  • 动态端口 = 临时停车位(49152-65535)

6. ss命令详解

什么是ss命令

ss(Socket Statistics)是Linux系统中用于查看网络连接、端口状态等信息的现代命令行工具,来自iproute2包。它是netstat命令的替代者,速度更快、输出更简洁,是Rocky Linux 9推荐使用的工具。

为什么用ss而不用netstat

对比项netstat(旧)ss(新)
速度较慢更快(直接读取内核数据)
输出较复杂更简洁
功能基本功能更强大
来源包net-tools(已过时)iproute2(现代标准)
Rocky Linux 9需要安装默认已安装

💡 提示:Rocky Linux 9推荐使用ss命令,netstat已过时,不建议再使用。

基本语法

bash
ss [选项]

常用选项

选项功能描述记忆技巧
-t只显示TCP连接t = TCP
-u只显示UDP连接u = UDP
-l只显示监听状态的端口l = Listen(监听)
-n以数字形式显示地址和端口号(不解析域名)n = Number(数字)
-p显示建立连接的进程ID和进程名p = Process(进程)
-a显示所有连接和监听端口a = All(所有)
-s显示网络统计摘要s = Summary(摘要)
-r显示路由表r = Route(路由)

最常用的组合

bash
# 查看所有TCP监听端口和对应的进程(最常用!)
ss -tlnp

# 查看所有UDP监听端口和对应的进程
ss -ulnp

# 查看所有连接和监听端口
ss -anp

# 查看网络统计摘要
ss -s

💡 记忆技巧ss -tlnp 可以记作 "TCP Listen Number Process"

输出结果解析

TCP监听端口输出示例

bash
[root@node1 ~]# ss -tlnp
State   Recv-Q  Send-Q   Local Address:Port   Peer Address:Port  Process
LISTEN  0       128      0.0.0.0:22            0.0.0.0:*          users:(("sshd",pid=1234,fd=3))
LISTEN  0       128      [::]:22               [::]:*             users:(("sshd",pid=1234,fd=4))

关键信息说明

  • State:连接状态,LISTEN表示监听状态(等待连接)
  • Recv-Q:接收队列中的字节数,可以理解为"已经收到但还没被程序读取的数据"
    • 💡 类比:就像快递员送到家门口但还没拆开的包裹
  • Send-Q:发送队列中的字节数,可以理解为"已经发送但对方还没确认的数据"
    • 💡 类比:就像已经寄出但对方还没签收的快递
  • Local Address:Port:本地地址和端口(监听的地址)
  • Peer Address:Port:远程地址和端口(连接的客户端地址)
  • Process:进程信息(包含进程名、PID和文件描述符)

UDP端口输出示例

bash
[root@node1 ~]# ss -ulnp
State   Recv-Q  Send-Q   Local Address:Port   Peer Address:Port  Process
UNCONN  0       0        0.0.0.0:68           0.0.0.0:*          users:(("dhclient",pid=5678,fd=6))

关键信息说明

  • StateUNCONN表示UDP无连接状态(UDP是无连接协议)
  • Recv-Q:接收队列中的字节数
  • Send-Q:发送队列中的字节数
  • Local Address:Port:本地地址和端口
  • Peer Address:Port:远程地址和端口(UDP为*表示任意地址)
  • Process:进程信息

💡 提示:UDP是无连接协议,所以没有"建立连接"的概念,状态永远是UNCONN

所有连接输出示例

bash
[root@node1 ~]# ss -anp
Netid State  Recv-Q  Send-Q  Local Address:Port  Peer Address:Port   Process
tcp   ESTAB  0       0       192.168.88.100:22   192.168.88.1:54321  users:(("sshd",pid=1234,fd=3))
tcp   LISTEN 0       128     0.0.0.0:22          0.0.0.0:*           users:(("sshd",pid=1234,fd=3))
udp   UNCONN 0       0       0.0.0.0:68          0.0.0.0:*           users:(("dhclient",pid=5678,fd=6))

常见连接状态

状态含义通俗解释
LISTEN监听状态等待连接请求,就像服务员站在门口等客人
ESTABLISHED已建立连接正在通信,就像客人和服务员在点餐
SYN_SENT发送连接请求主动发起连接,等待对方确认
SYN_RECV收到连接请求收到连接请求,准备发送确认
FIN_WAIT1主动关闭方,等待对方确认就像客人说"我吃完了",等服务员确认
FIN_WAIT2主动关闭方,收到对方确认客人准备离开,等服务员结账
TIME_WAIT被动关闭方,等待足够时间确保对方收到关闭通知就像结完账后,再等一小会儿确保没有遗漏
CLOSE_WAIT被动关闭方,等待应用层关闭连接就像服务员等客人买单
LAST_ACK被动关闭方,等待最后的确认服务员最后的确认
CLOSED连接已关闭连接完全关闭

网络统计摘要

bash
[root@node1 ~]# ss -s
Total: 150
TCP:   20 (estab 1, closed 18, orphaned 0, synrecv 0, timewait 0/0), ports 10

Transport Total     IP        IPv6
*         -         -         -
RAW       0         0         0
UDP       2         2         0
TCP       20        18        2
INET      22        20        2
FRAG      0         0         0

关键信息说明

  • Total:总的连接数
  • TCP:TCP连接统计
    • estab:已建立的连接数
    • closed:已关闭的连接数
    • timewait:TIME_WAIT状态的连接数
  • Transport:传输协议类型统计

💡 提示ss -s 适合快速查看服务器整体网络状态,适合排查性能问题

7. 常用操作示例

查看特定端口

bash
# 查看SSH端口(22端口)
ss -nlp | grep 22

# 查看HTTP端口(80端口)
ss -nlp | grep 80

# 查看MySQL端口(3306端口)
ss -nlp | grep 3306

💡 提示grep 命令用于过滤输出,只显示包含指定内容的行

查看特定进程的连接

bash
# 查看sshd进程的所有连接
ss -anp | grep sshd

# 查看nginx进程的所有连接
ss -anp | grep nginx

查看特定状态的连接

bash
# 查看所有已建立的连接
ss -ant state established

# 查看所有TIME_WAIT状态的连接
ss -ant state time-wait

# 查看所有监听状态的连接
ss -ant state listening

查看特定地址的连接

bash
# 查看本地192.168.88.100的连接
ss -an | grep 192.168.88.100

# 查看特定远程地址的连接
ss -an | grep 192.168.88.1

8. 什么时候需要查看端口?

场景1:服务无法启动时

问题:启动服务时报错"端口已被占用"

解决方法

bash
# 检查端口是否被占用
ss -nlp | grep 端口号

# 例如:检查80端口是否被占用
ss -nlp | grep 80

# 如果有输出,说明端口被占用
# 解决方法:
# 1. 停止占用端口的程序
# 2. 或修改新服务的端口号

场景2:排查网络连接问题时

问题:服务启动了,但客户端无法连接

解决方法

bash
# 1. 查看服务是否在监听
ss -tlnp | grep 服务端口

# 2. 查看已建立的连接
ss -ant state established

# 3. 检查防火墙设置
firewall-cmd --list-all

场景3:安全检查时

问题:怀疑服务器有安全风险

解决方法

bash
# 1. 查看所有监听的端口
ss -tlnp

# 2. 检查是否有可疑端口在监听
# (比如一些你不认识的端口)

# 3. 查看每个端口对应的进程
ss -tlnp | grep 端口号

场景4:性能调优时

问题:服务器网络性能差

解决方法

bash
# 1. 查看网络统计摘要
ss -s

# 2. 查看是否有大量TIME_WAIT连接
ss -ant state time-wait | wc -l

# 3. 查看各个端口的连接数
ss -an | awk '{print $5}' | cut -d: -f2 | sort | uniq -c | sort -rn

9. 常见问题与解决方法

问题1:执行ss命令提示"command not found"

现象

bash
[root@node1 ~]# ss -tlnp
-bash: ss: command not found

原因:系统没有安装iproute2包

解决方法

bash
# 安装iproute2包
yum install -y iproute2

# 或者(Rocky Linux 9)
dnf install -y iproute2

问题2:查看进程时显示Permission denied

现象

bash
[root@node1 ~]# ss -nlp
State   Recv-Q  Send-Q  Local Address:Port  Peer Address:Port  Process
LISTEN  0       128     0.0.0.0:22         0.0.0.0:*          users:(("sshd",pid=1234,fd=3)),(("httpd",pid=5678,fd=5))
LISTEN  0       128     0.0.0.0:3306       0.0.0.0:*          users:()

原因:当前用户权限不足,无法查看某些进程的信息

解决方法

bash
# 使用root用户执行
sudo ss -nlp

# 或者切换到root用户
su -
ss -nlp

问题3:看不到进程信息

现象

bash
[root@node1 ~]# ss -nlp
State   Recv-Q  Send-Q  Local Address:Port  Peer Address:Port  Process
LISTEN  0       128     0.0.0.0:22         0.0.0.0:*          -

原因:没有使用-p选项

解决方法

bash
# 添加-p选项
ss -nlp

问题4:端口显示为数字而不是服务名

现象

bash
[root@node1 ~]# ss -tlp
State   Recv-Q  Send-Q  Local Address:Port  Peer Address:Port  Process
LISTEN  0       128     0.0.0.0:ssh         0.0.0.0:*          users:(("sshd",pid=1234,fd=3))
LISTEN  0       128     0.0.0.0:http        0.0.0.0:*          users:(("httpd",pid=5678,fd=5))

原因:没有使用-n选项,自动解析服务名

解决方法

bash
# 添加-n选项,显示数字端口
ss -nlp

问题5:TIME_WAIT连接过多

现象

bash
[root@node1 ~]# ss -ant state time-wait | wc -l
5000

原因:大量短连接导致

解决方法

bash
# 1. 临时调整内核参数
echo 'net.ipv4.tcp_tw_reuse = 1' >> /etc/sysctl.conf
echo 'net.ipv4.tcp_tw_recycle = 0' >> /etc/sysctl.conf
sysctl -p

# 2. 优化应用代码,使用连接池
# 3. 增加动态端口范围
echo 'net.ipv4.ip_local_port_range = 1024 65535' >> /etc/sysctl.conf
sysctl -p

10. 关键命令参考

命令功能描述使用频率
ss -tlnp查看TCP监听端口和进程⭐⭐⭐⭐⭐
ss -ulnp查看UDP监听端口和进程⭐⭐⭐⭐
ss -anp查看所有连接和监听端口⭐⭐⭐⭐⭐
ss -s查看网络统计摘要⭐⭐⭐
ss -nlp | grep 22查看22端口的详细信息⭐⭐⭐⭐
ss -ant查看所有TCP连接⭐⭐⭐
ss -aun查看所有UDP连接⭐⭐
ss -ant state established查看已建立的连接⭐⭐⭐
ss -ant state time-wait查看TIME_WAIT状态的连接⭐⭐⭐

⚠️ 注意:不要使用已过时的netstat命令,Rocky Linux 9推荐使用ss命令。



课程总结

这节课学了端口和ss命令,记好这几点:

1. 端口是什么

  • 就是程序和外界通信的"出入口"
  • 分两种:物理端口(USB、网口这些硬件)和虚拟端口(软件层面的)
  • Linux有65535个虚拟端口,够用来跑很多程序
  • IP地址 + 端口 = 唯一标识网络中的某个程序

2. 端口分三类

  • 1-1023:系统用的(SSH 22、HTTP 80、HTTPS 443)- 需要root权限
  • 1024-49151:用户程序用的(MySQL 3306、Redis 6379)
  • 49152-65535:临时用的,用完就释放

3. ss命令怎么用

  • ss -tlnp 看TCP端口和对应的进程(最常用!)⭐⭐⭐⭐⭐
  • ss -ulnp 看UDP端口
  • ss -s 看网络统计
  • 比旧的netstat快多了,Rocky Linux 9推荐用这个

4. 理解输出内容

  • State:连接状态(LISTEN监听、ESTABLISHED已建立等)
  • Recv-Q/Send-Q:接收/发送队列(已收到未读/已发未确认)
  • Local Address:Port:本地地址和端口
  • Process:进程信息(名称、PID)

5. 什么时候用ss命令

  • 服务无法启动时(检查端口是否被占用)
  • 排查网络连接问题时
  • 安全检查时(查看可疑端口)
  • 性能调优时(查看连接状态)

端口管理很重要,特别是排查网络问题的时候!

📝 小测验

测试1:基础概念

  1. SSH服务默认使用哪个端口?

    • A) 80
    • B) 22
    • C) 3306
    • D) 6379
  2. 以下哪个端口范围属于公认端口?

    • A) 1-1023
    • B) 1024-49151
    • C) 49152-65535
    • D) 65536-99999

测试2:命令使用

  1. 要查看所有TCP监听端口,应该使用哪个命令?

    • A) ss -ulnp
    • B) ss -tlnp
    • C) ss -anp
    • D) ss -s
  2. 要查看22端口的详细信息,应该使用哪个命令?

    • A) ss -tlnp 22
    • B) ss -nlp | grep 22
    • C) ss -ant state established
    • D) ss -s

测试3:连接状态

  1. ESTABLISHED状态表示什么?

    • A) 等待连接
    • B) 已建立连接,正在通信
    • C) 连接关闭中
    • D) 连接已关闭
  2. LISTEN状态表示什么?

    • A) 等待连接请求
    • B) 已建立连接
    • C) 发送连接请求
    • D) 连接已关闭
点击查看答案
  1. B - SSH服务使用22端口
  2. A - 公认端口范围是1-1023
  3. B - ss -tlnp查看TCP监听端口
  4. B - ss -nlp | grep 22查看22端口详细信息
  5. B - ESTABLISHED表示已建立连接,正在通信
  6. A - LISTEN表示等待连接请求

课后练习

练习1:查看端口状态(必做)

  • ss -tlnp看所有TCP监听端口,找SSH(22端口)和HTTP(80端口)
  • ss -ulnp看UDP端口
  • ss -s看网络统计摘要

💡 提示:-t是TCP,-u是UDP,-l是监听状态,-n是显示数字,-p是显示进程

练习2:找特定端口

  • 找SSH端口:ss -nlp | grep 22
  • 找HTTP端口:ss -nlp | grep 80
  • 如果装了MySQL,试试找3306端口:ss -nlp | grep 3306

练习3:理解端口分类

  • 想想为什么SSH用22端口(公认端口)
  • 为什么MySQL用3306端口(注册端口)
  • 动态端口什么时候会用到?

练习4:查看连接状态(进阶)

  • 查看所有已建立的连接:ss -ant state established
  • 查看所有TIME_WAIT状态的连接:ss -ant state time-wait
  • 查看特定进程的连接:ss -anp | grep sshd

练习5:实际应用(综合)

场景:你的Web服务启动失败了,报错"端口已被占用"

任务

  1. 检查80端口是否被占用
  2. 如果被占用,找出占用80端口的进程
  3. 查看该进程的详细信息
  4. 根据情况决定是停止该进程还是修改Web服务的端口

💡 提示:

  • 使用 ss -nlp | grep 80 检查端口
  • 使用 ps -ef | grep 进程名 查看进程详情
  • 使用 kill -9 进程号 停止进程

评论区

专业的Linux技术学习平台,从入门到精通的完整学习路径