端口是服务器与外界通信的门户,每一个运行中的网络服务都会占用至少一个端口。搞清楚服务器上开了哪些端口,是排查服务故障、评估安全风险、定位端口冲突的基本功。比如网站打不开,可能是80端口没在监听;怀疑被入侵,要先看看有没有陌生的端口在对外通信;部署新应用失败,很可能是端口被别的进程占用了。这篇文章把Linux和Windows下查看端口的方法完整梳理一遍,并汇总了实际操作中最常遇到的问题。

一、先弄明白几个基础概念
在动手敲命令之前,有几个概念需要先理清,否则查出来的结果很容易看不懂。第一个是IP地址与端口的组合,一个网络连接由源IP、源端口、目的IP、目的端口四要素唯一确定。服务器上的服务通常会绑定某个端口,处于监听状态,等待客户端来连接。
第二个要理解的是监听地址的含义。你会看到0.0.0.0:80和127.0.0.1:80这样的写法,前者表示监听所有网卡上的80端口,外部机器可以访问;后者只监听本地回环地址,只有服务器自己能连,外部根本访问不到。很多服务连不上,问题就出在监听地址配成了127.0.0.1。
第三个是TCP和UDP的区别。netstat这类工具默认会同时显示两种协议的端口,TCP有连接状态(如LISTEN、ESTABLISHED),UDP则没有状态概念。查看时要注意区分,避免把UDP端口误认为TCP端口。
二、Linux下查看开放端口的常用命令
1. netstat命令
netstat是最经典也最通用的工具,几乎所有Linux发行版都自带或者可以快速安装。查看所有监听中的TCP端口,使用下面的命令:
netstat -tlnp
各参数含义:t表示只看TCP,l表示只看监听状态,n表示用数字形式显示地址和端口(不做域名反解析,速度更快),p表示显示占用端口的进程名和进程号。如果想看UDP端口,把t换成u即可,即netstat -ulnp。如果想看所有状态的连接(包括已建立的连接),去掉l参数,用netstat -anp。
输出结果中,Local Address列显示本地监听地址和端口,State列显示状态,LISTEN就是正在监听。PID/Program name列告诉你哪个进程占用了这个端口,排查端口冲突时特别有用。
2. ss命令
ss是netstat的现代替代品,属于iproute2工具包,读取内核数据的方式更高效,在连接数巨大的服务器上速度明显快于netstat。用法和netstat基本一致:
ss -tlnp
参数含义与netstat完全相同。查看UDP监听端口用ss -ulnp。ss还支持一些灵活的过滤语法,比如只想看80端口的监听情况,可以用ss -tlnp sport = :80,这在端口很多的服务器上能快速定位目标。
3. lsof命令
lsof本来是用来列出进程打开的文件,但在Linux的设计哲学里,网络套接字也算文件,所以它同样能查端口。命令格式如下:
lsof -i:80
这条命令会列出所有与80端口相关的进程,包括监听进程和已建立的连接。如果想只看监听状态,可以加上-sTCP:LISTEN参数,写成lsof -i:80 -sTCP:LISTEN。lsof查单个端口非常直观,是确认某个具体端口是否被占用的利器。
4. 其他辅助方法
除了上面三个主力命令,还有一些补充手段。nmap是端口扫描工具,从外部扫描本机可以验证端口是否真正对外开放,命令如nmap -sT localhost。/proc/net/tcp文件记录了内核层面的TCP连接信息,直接查看它可以看到最原始的数据,不过内容是十六进制格式,可读性较差,一般只在特殊排查场景使用。
三、Windows下查看开放端口的方法
1. netstat命令
Windows系统同样内置了netstat,在命令提示符或PowerShell中运行:
netstat -ano
a表示显示所有连接和监听端口,n表示数字格式显示,o表示显示占用端口的进程ID(PID)。Windows的netstat没有p参数直接显示进程名,需要拿到PID后再用任务管理器查对应进程,或者在PowerShell里用Get-Process -Id 进程号来确认。
2. PowerShell方式
PowerShell提供了更结构化的查询方式:
Get-NetTCPConnection -State Listen
这条命令列出所有处于监听状态的TCP连接,输出的表格里包含本地地址、本地端口、所属进程等信息,配合Select-Object可以做进一步筛选,比如只看80和443端口。UDP端口则用Get-NetUDPEndpoint查询。
四、命令输出结果怎么解读
拿到命令输出后,重点看这几列信息。下面以netstat -tlnp的典型输出为例做说明:
| 字段 | 含义 | 关注要点 |
| Proto | 协议类型 | 区分tcp和udp |
| Local Address | 监听地址和端口 | 0.0.0.0表示对外开放,127.0.0.1仅本机可访问 |
| State | 连接状态 | LISTEN表示正在监听 |
| PID/Program | 进程号和进程名 | 定位端口归属,排查冲突 |
解读时有个常见误区需要提醒:命令查到端口在监听,不代表外部一定能访问。监听只是服务端自己的状态,中间还隔着防火墙、安全组、网络策略好几道关卡。要验证外部可达性,最可靠的办法是从另一台机器上用telnet 目标IP 端口或者curl测试。
五、常见问题解答
问题1:执行netstat提示命令不存在怎么办?
部分精简版Linux系统默认没装net-tools包。CentOS和RedHat系列可以用yum install net-tools安装,Debian和Ubuntu系列用apt-get install net-tools安装。装不上或者不想装,直接改用ss命令,功能完全够用,而且ss在多数新系统里是预装的。
问题2:查不到lsof的进程信息,只显示进程号怎么办?
普通用户执行lsof或netstat -p时,看不到不属于自己进程的名称是正常现象,因为查看其他用户的进程信息需要root权限。用sudo提权后再执行,进程名就能正常显示了。
问题3:端口在监听但外部访问不通是什么原因?
按顺序排查这几个环节:第一,确认监听地址不是127.0.0.1;第二,检查服务器本机防火墙,Linux下用iptables -L -n或firewall-cmd --list-all查看规则,Windows下检查防火墙入站规则;第三,如果是云服务器,登录控制台检查安全组是否放行了对应端口;第四,确认服务本身没有做访问限制。
问题4:怎么知道某个端口被哪个程序占了?
Linux下用ss -tlnp或lsof -i:端口号直接看进程名。Windows下用netstat -ano找到PID,再打开任务管理器的详细信息页,按PID列找到对应进程。找到占用者后,要么停掉它,要么给新服务换个端口。
问题5:TIME_WAIT状态的连接很多,需要处理吗?
TIME_WAIT是TCP连接正常关闭后的等待状态,一般持续一到两分钟,大量出现说明短连接频繁。它本身不是故障,只有当数量大到占满可用端口时才需要优化,常见做法是改用长连接,或者调整内核参数net.ipv4.tcp_tw_reuse。
六、安全方面的几点建议
定期查看开放端口也是个安全习惯。看到不认识的监听端口,先查清是哪个进程,确认是否为合法服务。原则上只开放业务必需的端口,数据库端口如3306、6379这类,千万不要对公网暴露0.0.0.0的监听,应该改为只监听内网地址,或者用防火墙严格限制来源IP。运维中不少入侵事件,就是从数据库端口裸奔开始的。
总结一下:Linux下记住ss -tlnp和lsof -i:端口这两条命令,Windows下记住netstat -ano,基本能覆盖日常九成以上的场景。查到端口只是第一步,结合监听地址、防火墙状态、安全组配置综合判断,才能真正确认端口的可达性。把这些方法练熟,服务器排查的效率会提升一大截。

