主题
Linux端口与ss命令详解
1. 课程介绍
接下来我们学习端口管理和ss命令。端口是程序与外部通信的出入口,HTTP用80端口,SSH用22端口等。ss命令用于查看网络连接和端口监听状态,比旧的netstat命令更快更简洁。常用ss -tlnp查看TCP监听端口和对应的进程。端口管理是网络安全和故障排查的重要部分。
2. 端口的概念
基本定义
端口(Port)是设备与外界通讯交流的出入口,用于标识设备上不同的网络服务或程序。
通俗理解
想象一下你的电脑是一栋大楼:
- IP地址 = 大楼的地址(比如:192.168.88.100)
- 端口 = 大楼里的房间号(比如:22、80、3306)
- 程序 = 在房间里工作的人
当外面的人要找某人时,需要知道:
- 大楼的地址(IP地址)
- 房间的号码(端口号)
端口的作用
- 标识网络服务:通过端口可以唯一标识设备上的不同网络服务或程序
- 实现多路复用:允许同一台设备上的多个程序同时与网络进行通信
- 确保通信准确性:在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))关键信息说明:
State:UNCONN表示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.18. 什么时候需要查看端口?
场景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 -rn9. 常见问题与解决方法
问题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 -p10. 关键命令参考
| 命令 | 功能描述 | 使用频率 |
|---|---|---|
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:基础概念
SSH服务默认使用哪个端口?
- A) 80
- B) 22
- C) 3306
- D) 6379
以下哪个端口范围属于公认端口?
- A) 1-1023
- B) 1024-49151
- C) 49152-65535
- D) 65536-99999
测试2:命令使用
要查看所有TCP监听端口,应该使用哪个命令?
- A) ss -ulnp
- B) ss -tlnp
- C) ss -anp
- D) ss -s
要查看22端口的详细信息,应该使用哪个命令?
- A) ss -tlnp 22
- B) ss -nlp | grep 22
- C) ss -ant state established
- D) ss -s
测试3:连接状态
ESTABLISHED状态表示什么?
- A) 等待连接
- B) 已建立连接,正在通信
- C) 连接关闭中
- D) 连接已关闭
LISTEN状态表示什么?
- A) 等待连接请求
- B) 已建立连接
- C) 发送连接请求
- D) 连接已关闭
点击查看答案
- B - SSH服务使用22端口
- A - 公认端口范围是1-1023
- B - ss -tlnp查看TCP监听端口
- B - ss -nlp | grep 22查看22端口详细信息
- B - ESTABLISHED表示已建立连接,正在通信
- 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服务启动失败了,报错"端口已被占用"
任务:
- 检查80端口是否被占用
- 如果被占用,找出占用80端口的进程
- 查看该进程的详细信息
- 根据情况决定是停止该进程还是修改Web服务的端口
💡 提示:
- 使用
ss -nlp | grep 80检查端口 - 使用
ps -ef | grep 进程名查看进程详情 - 使用
kill -9 进程号停止进程