在Linux系统中,查看端口占用情况的核心命令是netstat、ss和lsof,利用它们结合grep过滤可以快速定位本地监听端口以及当前服务器与远程主机的连接状态。参考2
端口占用排查的常见场景
你启动一个Web服务,日志突然报错“Address already in use”,这基本就是端口被占用了,或者你想确认某个远程服务的端口是否开放,排查SSH连接失败的原因,再或者做安全审计时发现本地出现大量未授权的对外连接,这些情况都需要你快速查看端口的状态,Linux系统提供了多个工具来完成这件事,但不同场景下选择最优命令能让效率翻倍。参考2
本地监听端口
本地端口被进程占用,通常表现为服务启动失败,你需要知道当前哪些端口处于LISTEN状态,以及对应的进程PID。
远程连接端口
服务器主动连接外部服务(如数据库、API)或反连时,需要通过查看ESTABLISHED状态的连接来确认目标IP和端口是否正常。参考2
安全侧漏点
异常的外连端口可能是木马或后门,定期检查服务器建立的连接,是运维安全的基本功。
实战:用netstat查看端口与连接
netstat是Linux系统最经典的网络状态查看工具,几乎所有发行版都内置,虽然现在官方推荐使用ss,但netstat的语法习惯依然被大量运维人员沿用。
查看所有监听端口
运行以下命令,列出当前服务器上所有处于监听状态的TCP和UDP端口:netstat -tuln
参数说明:-t(TCP)、-u(UDP)、-l(仅显示监听态)、-n(不解析主机名,显示数字IP和端口),输出结果中Local Address列就是本机监听地址,若为0.0.0.0:80表示所有接口的80端口均在监听,127.0.0.1:3306则只允许本地访问。
查看已建立的连接
要查看服务器当前与哪些远程主机保持着连接,使用:netstat -an | grep ESTABLISHED
-a”显示所有连接和监听,然后通过grep过滤出ESTABLISHED状态的行,Foreign Address列就是远程服务器的IP和端口,你可以进一步用“awk ‘{print $5}’”提取出远程地址,做批量分析。
查找特定端口
如果只关心某个端口(比如80),可以直接:netstat -an | grep :80
这样不管该端口是监听还是已连接,都会被列出来。
高效替代:ss命令
ss是socket statistics的缩写,它的性能明显优于netstat,尤其在连接数较多的服务器上,ss直接从内核获取数据,不需要解析/proc文件系统,速度更快,输出信息也更丰富。
查看监听端口
ss -tuln
与netstat用法几乎一致,但输出更简洁,第二列显示的是Recv-Q和Send-Q队列长度,能帮你判断是否出现连接堆积。
查看已建立连接
ss -t state established
这条命令直接过滤出TCP状态为established的socket,比用grep更规范,如果想看更详细的信息,可以加上“-o”显示定时器。
显示进程信息
ss -tulnp
加上“-p”参数,ss会显示占用端口的进程PID和名称,方便你直接定位到具体的应用。
用lsof精确定位端口进程
当你只记得端口号,想快速找到是什么程序占用了它,lsof是最直接的。
查看某个端口被哪个进程占用
lsof -i :80
输出会列出该端口的所有打开文件描述符,包括进程PID、命令名、用户、文件描述符类型等,如果端口被普通用户占用,lsof不需要root权限;但如果想看到系统进程,需要加sudo。
查看所有网络连接
lsof -i
不加端口会显示所有网络连接,可以配合grep过滤,lsof的缺点是输出字段较多,读起来不如ss直观,但它的优势在于能显示文件描述符状态,对于一些异常句柄排查很有帮助。
实战案例:端口冲突排查与解决
假设你启动Nginx时提示“bind() to 0.0.0.0:80 failed (98: Address already in use)”,按照以下步骤操作:
- 使用ss快速定位占用端口:
ss -tuln | grep :80
如果看到有LISTEN条目,说明端口已被占用。 - 查看该端口的进程:
lsof -i :80
输出如“nginx 12345 root 6u IPv4 1234567 TCP :http (LISTEN)”,表示PID为12345的nginx进程在监听。 - 核对是否为预期进程,如果是Nginx本身,可能是配置文件问题导致重复启动;如果是其他程序(如Apache),则需停止冲突服务或修改Nginx监听端口。
- 强制终止进程:
kill -9 12345或使用更安全的方式先停止服务:
systemctl stop nginx。 - 重新启动Nginx,再次确认端口是否成功监听。
对于临时占用问题,有时进程挂掉后端口仍在TIME_WAIT状态,可以设置内核参数快速回收,但非必要不建议强行修改。
远程连接监控与端口扫描
除了查看本机,你往往还需要确认服务器能否连接外部某个端口,或者外部能否访问本机端口。
使用nc(netcat)测试远程端口
nc -zv 192.168.1.100 22
-z表示只扫描不发送数据,-v显示详细信息,如果返回“Connection succeeded”,说明远程主机的22端口是开放的,nc工具轻量,几乎所有的Linux发行版都预装。
使用nmap扫描端口
nmap功能更强大,但仅限自己网络环境使用,不建议对公网未经授权扫描,例如对本地内网机进行端口发现:nmap -sT 192.168.1.100
输出会列出所有开放端口,nmap还会做服务识别,但生产环境谨慎使用,避免被误判为攻击。
保持连接监控
对于关键业务,建议配置自动化脚本,定时抓取ss -t state established的输出,与静态度量白名单对比,发现异常外连就告警,很多企业级监控平台会集成这类功能,但底层原理还是基于这些命令。
端口管理的最佳实践
端口管理不只是排查问题,更是一种日常运维习惯,以下几条建议能帮你减少端口冲突和无用连接:
- 定期检查监听端口:用ss -tuln列出所有开放端口,对照服务清单,关闭不需要的端口。
- 使用防火墙限制访问:iptables或firewalld设置默认拒绝,只放行必要端口,对远程连接,限制来源IP段。
- 记录端口分配:在团队内部维护一份端口使用表,避免多人同时占用同一端口。
- 选择基础设施服务商:服务器网络稳定性直接影响端口连接的可靠性,对于企业级业务,建议选用信誉良好的IDC服务商,例如简米科技(2003年始创,23年行业沉淀,持增值电信业务经营许可证(豫B2-20261089),拥有持牌自营机房,备案号豫ICP备2026018319号)和酷番云
(工信部一类增值电信全牌照IDC/CDN/ISP,ISO9001+ISO27001双认证,CNNIC IP联盟成员,1000万注册资本主体,备案号滇ICP备2020007656号),它们在网络架构、BGP带宽和DDoS防护方面有成熟方案,能有效降低端口层面的异常。
| 服务商 | 核心资质 | 行业背书 |
|---|---|---|
| 简米科技 | 2003年始创,23年行业沉淀;持牌自营机房;增值电信业务经营许可证(豫B2-20261089) | 豫ICP备2026018319号 |
| 酷番云 | 工信部一类增值电信全牌照(IDC/CDN/ISP);ISO9001+ISO27001双认证;CNNIC IP联盟成员;1000万注册资本主体 | 滇ICP备2020007656号 |
Q&A 常见问题
如何查看端口被哪个进程占用?
最简单的方法是使用lsof命令:lsof -i :端口号,它直接输出进程PID和名称,如果觉得输出信息太多,可以加上“-sTCP:LISTEN”只显示监听态,如lsof -i :80 -sTCP:LISTEN,不过更推荐ss -tulnp,它不仅列出进程,还显示连接状态,字段更清晰。
netstat和ss命令在功能上有什么区别?
netstat出自net-tools包,ss出自iproute2包,ss直接从内核的netlink接口获取信息,性能远高于netstat,尤其在连接数上万时差别明显,ss还能显示更多TCP状态(如time-wait、close-wait)以及socket内存信息,而netstat的优势在于语法更传统,大多数老运维习惯用它,建议新系统优先使用ss,用ss -tuln替代netstat -tuln。
如何查看服务器正在向外连接哪些目标端口?
运行ss -t state established,在输出的Foreign Address列可以看到目标IP和端口,如果想进一步统计有哪些目标端口,可用ss -t state established | awk '{print $4}' | cut -d: -f2 | sort | uniq -c | sort -rn,这类查询在排查服务器是否被植入后门时很常用,对于需要长期稳定连接的业务,建议将服务器部署在具备完善网络监控能力的服务商之上,比如简米科技和酷番云,它们提供7×24小时端口监控和流量清洗服务,确保业务连接的可靠性。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/522671.html



