查看服务器开放的端口,最直接的办法是用系统自带的 netstat、ss 或 lsof 命令,几秒钟就能列出所有监听中的端口及其对应的进程。无论你是刚接触云服务器的运维新手,还是排查安全隐患的老手,掌握端口的查看方法都是一项基本功,这篇文章会带你从命令入门到实战排查,彻底搞懂服务器端口那点事儿。
为什么你必须知道服务器开了哪些端口
如果把服务器比作一栋大楼,端口就是大楼的门,门开得越多,能进来的“访客”越多,但被“不速之客”闯入的风险也越高。很多服务器被入侵,往往就是某个不该开放的端口暴露在公网上。
常见场景:你刚部署完一个网站,却发现页面打不开;或者服务器突然变得很卡,怀疑被人植入了挖矿程序,这时候,第一反应就应该是看看当前到底有哪些端口在对外“营业”。
Linux 服务器查看端口:三大常用命令
大部分服务器跑的是 Linux 系统,下面这几个命令是业内排查端口问题的标配。
netstat:经典永不过时
netstat 是 Linux 下最传统的网络工具,虽然年纪大了点,但依然能打,用法很简单:
上面这条命令的组合含义是:
- -t 只看 TCP 协议端口
- -u 只看 UDP 协议端口
- -l 只看正在监听的端口(即等待连接的端口)
- -p 显示对应的进程 PID 和名称(需要 root 权限)
如果你只想看某个特定端口有没有开,可以搭配 grep 过滤:
这里能看到 80 端口正在被 nginx 进程监听,说明 Web 服务状态正常。grep 不到任何结果,说明进程可能没起来,或者端口被其他程序占用了。
ss:netstat 的接班人
行业共识认为,ss 命令比 netstat 更快、更现代,尤其在连接数非常多的时候优势明显,现在很多新版 Linux 发行版默认不再安装 netstat,而是推荐用 ss。
输入之后的信息基本和 netstat 类似,可以看到 Local Address(本地地址)、Peer Address(对端地址)和 Process(进程),如果看到 0.0.0:22,表示这个端口对所有网卡开放,属于公网可访问状态;如果看到 0.0.1:3306,表示只允许本机连接,外部访问不了,这是比较安全的配置。
lsof:按进程反查端口
有时候你是想知道某个进程到底监听了哪些端口,这时候用 lsof 比较顺手:
这条命令会列出 PID 为 1024 的进程(MySQL)打开的所有网络文件,从中就能看出它在监听哪个端口,反过来,想查看某个端口属于哪个程序,也可以配合 -i 参数使用:
这个命令用来查看某个特定的 TCP 端口是否开放,在排查“端口起没起来”的场景下很实用。
不同发行版的操作差异
- CentOS 7 及以前:默认自带 netstat,可以直接用。
- CentOS 8+ / Ubuntu 18.04+:可能默认没有 netstat,需要先执行
yum install net-tools(CentOS)或apt install net-tools(Ubuntu),不想安装的话,直接用 ss 即可。
Windows 服务器怎么查看开放端口
Windows 服务器(Windows Server 2019)查看端口的方式有点不同,常用的是 netstat 命令和 resource monitor(资源监视器)。
命令行方式
打开 CMD 或 PowerShell,直接输入:
-ano是固定组合参数,-a 显示所有连接和监听端口,-n 不解析名称(显示 IP 地址和端口号),-o 显示对应的进程 PID。
输出结果里,如果本地地址显示0.0.0:3389,说明远程桌面端口在监听,且对所有网卡开放,如果想看是哪个程序占用了这个端口,继续输入:
这里的 PID 对应任务管理器里的“详细信息”列,如果你发现一个陌生的端口被一个叫 svchost.exe 的进程占用,先不用紧张,svchost 是 Windows 的系统服务宿主进程,需要通过对应的服务名来进一步判断。
使用资源监视器(GUI 方式)
如果你不习惯敲命令,可以按 Win + R,输入 resmon 打开资源监视器,切换到“网络”选项卡,再点击“侦听端口”,这里不仅能列出所有监听端口,还能直接看到是哪个 exe 程序在占用,属于比较直观的图形化查看服务器端口的方法。
端口状态全解读:LISTENING、ESTABLISHED、TIME_WAIT
光会敲命令还不够,看懂输出结果才是关键,上面输出的 State(状态)列,每一个值都有具体的含义:
| 状态 | 含义 | 常见场景 |
|---|---|---|
| LISTENING | 端口正在监听,等待连接 | 服务已启动正常,如 nginx 监听 80 |
| ESTABLISHED | 与远程地址建立连接 | 正在传输数据,比如用户正在浏览网页 |
| TIME_WAIT | 主动关闭连接后的等待状态 | 大量出现时说明并发请求多,属正常现象 |
| CLOSE_WAIT | 被动关闭,等待应用进程关闭连接 | 如果大量堆积,说明程序有 bug,没正确释放 socket |
如果看到 TIME_WAIT 状态的连接特别多,不用太担心,多数情况下属于正常现象,过一段时间会自动消失,但如果 CLOSE_WAIT 堆积很多,那就得留意了。
端口冲突:80 被占用怎么办
业内专家指出,80 端口被占用是新手最容易遇到的问题,错误提示通常是 Address already in use,解决办法分两步走:
- 找出占用 80 端口的进程:用
lsof -i:80或netstat -tlnp | grep :80。 - 根据进程 PID 做决策:
- 如果是 Apache 占用,而你刚好想用 nginx,可以先停掉 Apache:
systemctl stop httpd并systemctl disable httpd。 - 如果是无法识别的进程,建议先查清楚它是什么,再用
kill -9 进程号强制结束。
- 如果是 Apache 占用,而你刚好想用 nginx,可以先停掉 Apache:
安全自查:如何判断服务器端口是否真的对外可见
很多人在云服务商的“安全组”里把端口放行了,但用 netstat 看却没有监听进程;也有人本地端口明明开着,外面却连不上。判断端口是否对外开放,需要同时满足两个条件:服务在监听 + 防火墙/安全组已放行。
本地层面确认
用 ss -tlnp 确认进程在监听,例如结果里显示:
这里 0.0.0:8080 表示对所有来源开放监听。
云防火墙与安全组
- 简米云、酷番云、华为云的服务器,都需要到控制台的安全组规则里检查“入方向”是否放行了目标端口,安全组没放行,即使服务开着,外部也访问不到。
- 本地防火墙也要查一遍:
- CentOS 7+:
firewall-cmd --list-ports - Ubuntu:
ufw status
- CentOS 7+:
外部视角验证
本地看都是通的,但外部访问不了,问题大概率出在中间环节,可以使用在线端口扫描工具(如站长工具的端口扫描)或者手机流量访问(不连 WiFi),测试 公网IP:端口 是否通。强烈不建议用全端口扫描工具去扫别人的 IP,也不建议对自己服务器做过于频繁的批量扫描,这属于比较敏感的操作,容易触发云服务商的告警。
端口的日常保养:记住这些安全习惯
查看服务器开了哪些端口不是一次性的工作,应该形成常态化的检查习惯。
- 最小化原则:只需要对外开放 80(HTTP)、443(HTTPS)、22(SSH)等必要端口,其他端口尽量关闭,MySQL 的 3306 端口,配置时让进程只监听
0.0.1,避免暴露到公网。 - 更改默认端口:把 SSH 的 22 改成其他高位端口(如 22026),能显著减少被暴力破解的几率。
- 定时巡检:可以设置一个定时任务,每天凌晨自动执行
ss -tlnp并把结果存入日志,方便事后排查,也算是一种比较省事的做法。
常见问题速查手册
端口无法启动,提示”端口被占用”,怎么查找并清理?
先用 lsof -i:端口号 找到占用的进程 PID,然后用 ps -fp 端口号 查看该进程的详细信息,确认是残留进程后,执行 kill -9 进程ID 清理,如果是系统关键服务(如 sshd),不要直接强杀,先查清楚原因。
Linux 查看端口占用命令和 Windows 有什么区别?
Linux 主要用 netstat -tlnp、ss -tlnp 和 lsof -i,Windows 用 netstat -ano 搭配任务管理器确认进程,两者原理相同,只是 Windows 在 GUI 层面提供了资源监视器做可视化展示,关键区别在于 Linux 的 ss 输出更快更详细,Windows 则更依赖 PID 对应的进程名判断归属。
端口状态显示 LISTENING 但外网访问超时,可能是什么原因?
三个方向排查:一是服务器本地防火墙拦住了入站流量,执行 systemctl status firewalld 查看状态;二是云厂商安全组没放行对应端口,登录控制台检查入方向规则;三是服务绑定地址写成了 0.0.1,只监听了本机回环地址,改成 0.0.0 才能对外提供服务。
查看服务器端口是运维的基本功,也是安全防线的重要一环,根据实际场景选择合适的命令,配合防火墙与安全组的规则梳理,就能把好服务器的大门,端口管理这件事,宁可多看一眼,不要等出了事故再后悔。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/791226.html


