Linux系统如何快速查看当前运行端口及占用情况详解与实用命令指南

admin | 怀旧特辑

在Linux系统管理中,端口管理是网络运维的核心任务之一。端口是网络通信的端点,每个运行的服务都会监听特定的端口来接收网络请求。快速准确地查看端口占用情况对于排查网络问题、优化系统性能、确保服务正常运行至关重要。本文将详细介绍Linux系统中查看端口及占用情况的多种方法,包括基础命令、高级工具以及实用脚本,帮助您全面掌握端口管理技能。

一、端口基础知识回顾

在深入命令之前,我们需要了解一些基础概念。端口是16位无符号整数,范围从0到65535。其中:

0-1023:知名端口(Well-known ports),通常由系统服务使用

1024-49151:注册端口(Registered ports),分配给用户进程

49152-65535:动态/私有端口(Dynamic/Ephemeral ports)

端口状态包括:

LISTEN:监听状态,等待连接

ESTABLISHED:已建立连接

TIME_WAIT:等待关闭连接

CLOSED:端口未使用

二、使用netstat命令查看端口

netstat是经典的网络统计工具,虽然在一些现代发行版中被ss取代,但仍然广泛使用。

2.1 基本用法

查看所有监听端口和已建立连接:

netstat -tuln

参数说明:

-t:TCP协议

-u:UDP协议

-l:仅显示监听端口

-n:以数字形式显示地址和端口(不解析主机名)

2.2 查看所有端口占用情况

netstat -tunlp

添加-p参数可以显示进程信息:

sudo netstat -tunlp

注意:普通用户可能无法看到所有进程信息,需要sudo权限。

2.3 查找特定端口

例如查找80端口:

netstat -tunlp | grep :80

2.4 查看TCP连接状态统计

netstat -s | grep -i tcp

2.5 netstat输出解析

典型输出示例:

Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name

tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1234/sshd

tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 5678/redis-server

Proto:协议类型

Recv-Q:接收队列长度

Send-Q:发送队列长度

Local Address:本地地址和端口

Foreign Address:远程地址和端口

State:连接状态

PID/Program name:进程ID和程序名

三、使用ss命令(推荐)

ss是netstat的现代替代品,速度更快,信息更详细。

3.1 基本用法

查看所有监听端口:

ss -tuln

参数与netstat类似,但更高效。

3.2 显示进程信息

sudo ss -tulnp

3.3 查看TCP连接状态

ss -t -a

3.4 查看内存使用情况

ss -t -m

这会显示每个连接的内存使用信息,对于性能调优很有帮助。

3.5 过滤特定状态

例如查看所有ESTABLISHED连接:

ss -t -a state established

3.6 ss与netstat对比优势

速度更快:ss直接从内核获取信息,而netstat需要解析/proc文件

信息更详细:支持更多TCP状态和内存信息

更少的资源消耗:在大量连接时表现更好

四、使用lsof命令

lsof(List Open Files)是功能强大的工具,可以查看进程打开的文件,包括网络套接字。

4.1 查看所有网络连接

sudo lsof -i

4.2 查看特定端口

sudo lsof -i :80

4.3 查看TCP端口

sudo lsof -i TCP:80

4.4 查看UDP端口

sudo lsof -i UDP:53

4.5 查看进程打开的所有网络连接

sudo lsof -p -a -i

4.6 lsof输出解析

典型输出:

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

nginx 1234 root 6u IPv4 12345 0t0 TCP *:80 (LISTEN)

nginx 1234 root 7u IPv6 12346 0t0 TCP *:80 (LISTEN)

COMMAND:进程名

PID:进程ID

USER:运行用户

FD:文件描述符

TYPE:文件类型

DEVICE:设备号

SIZE/OFF:文件大小/偏移量

NODE:inode号

NAME:网络连接信息

五、使用fuser命令

fuser可以显示使用指定文件或套接字的进程。

5.1 查看端口占用进程

sudo fuser -v 80/tcp

5.2 杀死占用端口的进程

sudo fuser -k 80/tcp

警告:这会强制终止占用该端口的所有进程,请谨慎使用。

5.3 查看多个端口

sudo fuser -v 80/tcp 443/tcp 22/tcp

六、使用/proc文件系统

Linux内核通过/proc文件系统暴露大量信息,包括网络状态。

6.1 查看TCP连接

cat /proc/net/tcp

6.2 查看UDP连接

cat /proc/net/udp

6.3 查看监听套接字

cat /proc/net/tcp | grep ":0050" # 80端口的十六进制是0050

6.4 解析/proc/net/tcp

输出格式:

sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode

0: 00000000:0050 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 12345 1 ffff880123456789 100 0 0 10 0

local_address:本地地址(十六进制)

rem_address:远程地址

st:状态(0A=LISTEN)

tx_queue/rx_queue:发送/接收队列

uid:用户ID

inode:inode号

6.5 将十六进制端口转换为十进制

echo $((0x0050)) # 输出80

七、使用nmap扫描端口

nmap是网络发现和安全审计工具,可用于本地端口扫描。

7.1 扫描本地所有端口

sudo nmap -sT -p- localhost

7.2 扫描特定端口范围

sudo nmap -sT -p 1-1000 localhost

7.3 扫描UDP端口

sudo nmap -sU -p 53,123 localhost

7.4 详细输出

sudo nmap -sT -p- -v localhost

八、使用netcat(nc)测试端口

netcat可以测试端口是否开放和可连接。

8.1 测试TCP端口

nc -zv localhost 80

-z:零I/O模式(仅扫描)

-v:详细输出

8.2 测试UDP端口

nc -zvu localhost 53

8.3 扫描端口范围

nc -zv localhost 1-100

九、使用telnet测试端口

telnet是传统的端口测试工具。

telnet localhost 80

如果连接成功,会显示:

Trying 127.0.0.1...

Connected to localhost.

Escape character is '^]'.

按Ctrl+]然后输入quit退出。

十、使用socat测试端口

socat是更强大的多功能工具。

10.1 测试TCP端口

socat - TCP:localhost:80

10.2 测试UDP端口

socat - UDP:localhost:53

十一、使用/proc/net/tcp6查看IPv6端口

cat /proc/net/tcp6

十二、使用ip命令查看网络接口和端口

ip addr show

ip route show

十三、使用watch命令实时监控端口

watch -n 1 'ss -tuln'

十四、实用脚本示例

14.1 查找占用特定端口的进程并显示详细信息

#!/bin/bash

PORT=$1

if [ -z "$PORT" ]; then

echo "Usage: $0 "

exit 1

fi

echo "=== Checking port $PORT ==="

# 使用ss检查

echo "ss output:"

sudo ss -tulnp | grep ":$PORT"

# 使用lsof检查

echo -e "\nlsof output:"

sudo lsof -i :$PORT

# 使用fuser检查

echo -e "\nfuser output:"

sudo fuser -v $PORT/tcp 2>/dev/null || echo "No process found"

# 使用/proc检查

echo -e "\n/proc/net/tcp output:"

sudo grep ":$(printf '%04X' $PORT)" /proc/net/tcp

14.2 监控端口变化

#!/bin/bash

# 监控端口变化并记录

while true; do

TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')

ss -tuln > /tmp/ports.current

if [ -f /tmp/ports.last ]; then

diff /tmp/ports.last /tmp/ports.current > /tmp/ports.diff

if [ -s /tmp/ports.diff ]; then

echo "[$TIMESTAMP] Port changes detected:"

cat /tmp/ports.diff

fi

fi

mv /tmp/ports.current /tmp/ports.last

sleep 5

done

14.3 批量检查多个端口

#!/bin/bash

PORTS=(22 80 443 3306 6379 27017)

for PORT in "${PORTS[@]}"; do

if sudo ss -tuln | grep -q ":$PORT "; then

echo "Port $PORT is LISTENING"

sudo lsof -i :$PORT | grep LISTEN

else

echo "Port $PORT is NOT listening"

fi

done

十五、图形界面工具

虽然命令行工具更高效,但图形界面工具对于初学者更友好。

15.1 netstat-gui

sudo apt install netstat-gui # Debian/Ubuntu

sudo yum install netstat-gui # CentOS/RHEL

15.2 nmap-gui

sudo apt install nmap-zenmap # Debian/Ubuntu

15.3 Wireshark

虽然主要是抓包工具,但也可以查看网络连接。

十六、端口管理最佳实践

定期检查:建立定期检查端口的cron任务

文档记录:维护端口使用文档

安全策略:使用iptables/firewalld限制不必要的端口

监控告警:设置端口异常告警

权限管理:最小权限原则,避免root运行服务

十七、常见问题排查

17.1 端口被占用但找不到进程

可能原因:

进程处于TIME_WAIT状态

内核模块占用

权限不足看不到进程

解决方案:

sudo ss -tunlp

sudo lsof -i

cat /proc/net/tcp

17.2 端口显示监听但无法连接

检查:

防火墙规则

SELinux策略

服务配置

网络路由

17.3 如何快速定位恶意进程

sudo lsof -i -n | grep -E 'LISTEN|ESTABLISHED' | awk '{print $1,$2,$9}' | sort | uniq -c | sort -nr

十八、性能考虑

在高并发环境下:

优先使用ss而不是netstat

避免频繁轮询/proc文件系统

使用watch命令而不是死循环脚本

考虑使用perf工具分析网络性能

十九、安全注意事项

敏感信息:端口信息可能暴露服务类型和版本

权限控制:限制普通用户查看所有端口的能力

日志记录:记录端口扫描和检查活动

合规性:遵守组织的安全策略

二十、总结

掌握Linux端口管理是系统管理员的基本技能。本文介绍了从基础到高级的多种工具和方法:

基础工具:netstat, ss, lsof

测试工具:nc, telnet, socat

高级工具:nmap, /proc文件系统

实用脚本:自动化检查和监控

建议优先使用ss命令,因为它更快、更现代。对于日常管理,可以组合使用ss -tulnp和lsof -i来获取全面信息。对于安全审计,nmap和lsof是最佳选择。

记住,端口管理不仅是技术问题,更是安全和运维的重要组成部分。建立良好的端口管理习惯,定期审计和监控,才能确保系统稳定安全运行。