Unix服务器查看端口号,最直接的方法是使用netstat -anp(需root权限)或lsof -i命令,它们能列出所有正在监听的端口及其对应进程,这比用telnet盲目测试更精准。除了这两条命令,掌握 ss 工具以及结合 ps 命令反向查询,才算真正玩转端口排查。
用netstat锁定端口监听状态
在大多数Unix发行版(如Linux、AIX、Solaris)中,netstat 是系统管理员最早接触的网络诊断工具,它的核心价值在于展示当前内核中的网络连接表。
核心命令拆解
执行 netstat -anp 时,输出结果通常包含几列关键信息:Proto(协议)、Local Address(本地地址和端口)、Foreign Address(外部地址)、State(连接状态)以及 PID/Program name(进程ID和程序名),如果你只想看端口是否被监听,重点过滤 State 为 LISTEN 的行。
场景化操作实例
假设你部署了一个Java应用,发现8080端口无法访问,排查步骤如下:
- 输入
netstat -anp | grep 8080。 - 如果返回类似
tcp 0 0 0.0.0.0:8080 0.0.0.0: LISTEN 2345/java的数据,说明进程 PID 2345 正在监听所有网卡的8080端口。 - 如果该行显示
tcp 0 0 127.0.0.1:8080 0.0.0.0: LISTEN,则表示仅本机回环地址可访问,外网访问不到是正常的,需要检查应用绑定的IP地址。
特别关注LISTENING与ESTABLISHED
LISTEN 代表端口正在等待连接,这是“服务正常开启”的标志,有些初学者会混淆 ESTABLISHED(已建立的连接)与监听状态,记住一条铁律:服务能否访问只取决于LISTEN状态,如果排查一个端口连不通,即使看到大量 SYN_SENT 或 TIME_WAIT 状态,也基本与本机端口占用无关,问题多出在防火墙或路由。
端口未显示任何输出?
若 grep 后无结果,先确认是否因权限不足导致看不到PID,普通用户执行 netstat -anp 可能不显示进程名,需切换root或使用 sudo netstat -anp 重试,若仍无输出,大概率是进程崩溃,可用 ps -ef | grep 应用名 确认进程是否存活。
用lsof按进程名称反查端口号
netstat 是从端口看进程,而 lsof 命令支持反向操作:如果你知道进程名,想查它占用了哪些端口,这是最高效的路径。
常规查询公式
- 查指定端口被谁占用:
lsof -i:3306。 - 查看某个PID占用的所有端口:
lsof -i -a -p 进程PID。 - 查看某进程名的网络活动:
lsof -i | grep 进程名。
实际运维中的技巧
排查生产环境时,经常遇到端口未被监听但文件句柄被占满的情况,此时用 lsof -i:8080 会直接列出占用该端口的进程PID、用户及完整的命令路径,例如执行 lsof -i:22,会看到 sshd 1023 root 3u IPv4 设备号 0t0 TCP :ssh (LISTEN),这意味着SSH服务以PID 1023运行,结合 kill -9 1023(慎用,需确认进程后)可以强制释放端口。
行业共识指出,lsof 在排查“端口明明没放行但进程却在跑”的问题时尤为有效,因为它能直接关联文件描述符与网络端口,帮助运维人员快速识别是通过INET还是UNIX socket建立的连接。
用ss命令高效替代netstat
在很多现代Unix及Linux发行版中,netstat 已不再默认安装,取而代之的是 iproute2 工具包中的 ss 命令,它的输出更快,且统计信息更准确,尤其适合处理大量并发连接的服务器。
ss基础用法对照
如果你习惯于netstat的参数,只需将前缀替换即可:
ss -tlnp查看 所有TCP监听端口及其进程PID,这里的 l 代表监听,n 显示数字端口而不是服务名,p 显示进程信息。ss -ulnp专门查看UDP端口。ss -s输出当前服务器的连接汇总统计,帮助你快速判断是否存在连接数溢出。
为什么ss更受推荐
当服务器每秒新增数千个连接时,netstat 会不停遍历 /proc/net/tcp 文件,导致CPU飙高,而ss直接读取内核socket信息,消耗资源极少,内业专家建议:凡是支持ss的系统,一律优先用ss排查。
如何通过端口状态甄别服务健康程度
查看端口号不仅是看数字,更要关注状态标识,使用 netstat -an 时,出现的状态细分为难懂,以下是高频状态的实际业务含义:
常见状态深度解读
- LISTEN:正常服务监听,系统等待客户端接入。
- SYN_SENT:本机主动发起了连接,但远端未响应,这种情况通常说明对端IP不可达或防火墙丢弃了SYN包,如果大量出现,考虑是否遭到SYN Flood攻击。
- ESTABLISHED:连接已建立,正在数据传输,若该数量极高,需要关注连接数上限是否触及内核参数
net.core.somaxconn或net.ipv4.tcp_max_syn_backlog的限制。 - TIME_WAIT:主动关闭连接的一方进入的滞留状态,大量TIME_WAIT是短连接服务的正常现象,但如果比例超过连接总数的50%,建议开启
tcp_tw_reuse参数。
场景:动态端口溢出
当一个FTP服务采用主动模式时,服务器会随机开放一个大于1024的端口用于数据传输,排查这类问题时,用 ss -anp | grep ftp 能看到端口范围,若客户端报错“无法建立数据连接”,重点检查系统配置的 /etc/sysctl.conf 中 ip_local_port_range 是否设置过窄。
常见问题解答
如何通过端口号反查进程对应的服务路径?
执行 lsof -i:端口号 获取PID,然后执行 ls -l /proc/PID/exe(Linux)或 pwdx PID 查看进程执行的完整路径,对于AIX系统,可使用 procfiles PID 查看进程打开的所有文件,进而推断服务类型。
端口号被占用,但netstat查不到进程怎么办?
这多半是由于进程以僵尸状态存在,或使用了socket复用,执行 netstat -anp | grep 端口号 无任何输出时,改用 lsof -i:端口号 再试一次,如果仍看不到,则可能被 内核线程 占用,使用 ss -lpn 查看内核线程的 uid 字段来识别来源。
查看Unix端口号时,明明服务在运行,为什么端口看不到?
最典型的原因是服务绑定地址错误,如果应用配置为绑定 0.0.1,那么局域网内其他机器通过内网IP访问时,netstat输出中不会显示可对外服务的监听地址,这时需要检查应用的 server.xml、.env 或启动参数中的 address 配置,确认是否绑定了 0.0.0 通配地址。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/795517.html


