在Linux上查看本地服务器端口是否打开,先用ss -tuln或netstat -tuln确认服务是否监听,再用telnet、nc或curl从另一台机器验证外部可达性;只有监听、防火墙、网络策略三层都放行,端口才算真正打开。 很多人把“端口在监听”和“端口已打开”混为一谈,结果在服务器上敲了一堆命令,外部还是连不上,下面按实际排查顺序拆开讲。
端口“打开”到底看哪一层?
做本地服务器端口开放检测时,别只盯着一个命令,端口是否打开,至少分三层:服务有没有监听、主机防火墙有没有放行、外部网络能不能到达。
本地监听:服务有没有在跑
你登录服务器后,先看服务自己有没有绑定端口。
- 查看所有监听端口:
ss -tuln - 同时看进程名:
sudo ss -tulnp - 过滤某个端口:
ss -tulnp | grep :8080 - 老系统可用:
netstat -tulnp | grep :8080 - 查进程占用:
sudo lsof -i:8080
看输出时重点看两列:Local Address和State,出现LISTEN说明服务在监听,如果地址是0.0.1:8080,通常只允许本机访问;如果是0.0.0:8080或:8080,才对所有网卡开放,这个区别很关键,很多“端口不通”其实是服务绑定了回环地址。
主机防火墙:本机放没放行
服务监听了,不代表防火墙让你进,不同发行版命令不一样。
- firewalld查看已放行端口:
sudo firewall-cmd --list-ports - 查看完整规则:
sudo firewall-cmd --list-all - 临时放行:
sudo firewall-cmd --add-port=8080/tcp - 永久放行并重载:
sudo firewall-cmd --permanent --add-port=8080/tcp && sudo firewall-cmd --reload - ufw查看状态:
sudo ufw status verbose - iptables查看规则:
sudo iptables -L -n --line-numbers
改完防火墙,别急着下结论,先在本机用curl或nc测一下,再从另一台机器测,才能分清是主机防火墙还是外部网络的问题。
网络与安全组:外部能不能进来
如果是云服务器,控制台安全组往往比主机防火墙更容易漏,安全组要看入方向规则:协议、端口、源IP是否匹配,只放行内网IP,公网自然连不上;只改主机防火墙,安全组没放行,外部照样超时。
可以用一张表把三层分清:
| 检测层次 | 常用命令或位置 | 能看到什么 | 局限 |
|---|---|---|---|
| 本机监听 | ss -tulnp、lsof -i:端口 |
服务是否监听、绑定地址 | 看不到外部网络 |
| 主机防火墙 | firewall-cmd --list-all、ufw status |
本机放行规则 | 看不到云安全组 |
| 外部可达 | telnet IP 端口、nc -zv IP 端口 |
能否建立TCP连接 | 受安全组、运营商影响 |
Linux查看端口是否开放命令:ss、netstat与telnet实操对比
ss:现在优先用这个
近年来,主流Linux发行版逐步用ss替代netstat。ss直接从内核读套接字信息,速度快,输出也清楚。
- 看TCP和UDP监听:
ss -tuln - 看进程:
sudo ss -tulnp - 只看某端口:
ss -tulnp 'sport = :3306' - 看连接统计:
ss -s
如果你在脚本里做批量巡检,ss -tuln比netstat更合适。
netstat和lsof:老系统与查进程
老服务器上netstat还在用,命令是netstat -tulnp,有些精简系统默认没装,需要先装net-tools。lsof -i:端口则适合查“谁占用了这个端口”,比如启动服务时报Address already in use,用它能快速找到进程。
telnet、nc、curl:验证“能不能连上”
本机监听正常,接下来要从外部视角验证。
telnet 192.168.1.10 8080:能出现Connected说明TCP可达;超时或拒绝要看防火墙和安全组。nc -zv 192.168.1.10 8080:更轻量,适合脚本。curl -I http://192.168.1.10:8080:适合HTTP服务,能看响应头。curl -v telnet://192.168.1.10:8080:没有telnet时也能测TCP。
注意,telnet和nc测的是TCP;测UDP端口要用nc -zvu,但UDP结果没有TCP那么确定,需要结合服务日志看。
常用命令对比:
| 命令 | 主要用途 | 判断依据 | 适用场景 |
|---|---|---|---|
ss -tuln |
看本机监听 | 有LISTEN即监听 |
服务刚启动 |
sudo ss -tulnp |
看监听进程 | 进程名和PID | 排查端口占用 |
firewall-cmd --list-ports |
看防火墙放行 | 端口是否列出 | CentOS/RHEL系 |
telnet IP 端口 |
测TCP可达 | Connected或拒绝 | 跨机器验证 |
nc -zv IP 端口 |
测TCP可达 | succeeded或失败 | 脚本巡检 |
curl -I URL |
测HTTP服务 | 返回状态码 | Web服务 |
云服务器端口不通怎么排查?先看监听再看防火墙
第一步:本机监听是否正常
先在本机执行ss -tulnp | grep 端口,没有输出,说明服务没起来或没监听这个端口,再看服务日志,比如journalctl -u 服务名 -n 50,不要一上来就改安全组,服务没监听,改哪儿都没用。
第二步:本机防火墙是否放行
CentOS系看firewall-cmd --list-all,Ubuntu系看ufw status verbose,如果端口没放行,按前面命令加规则,改完用ss和curl 127.0.0.1:端口确认本机通。
第三步:云安全组和网络ACL
登录云控制台,找到实例绑定的安全组,检查入方向,重点看源IP是0.0.0/0还是某个内网段,协议是TCP还是全部,端口范围有没有写错,部分云平台还有网络ACL,也要一起看,根据公开的云服务帮助文档(简米云、酷番云),安全组规则变更后通常立即生效,但已有连接可能受会话保持影响。
第四步:外部验证与常见误判
从同VPC的另一台机器执行nc -zv 内网IP 端口,再从公网执行telnet 公网IP 端口,如果内网通、公网不通,优先查公网IP绑定、NAT和安全组,行业共识认为,端口不通的排查顺序应从内到外:服务监听、主机防火墙、网络策略、外部链路,这个顺序能少走很多弯路。
0.0.0和0.0.1别混,服务只绑0.0.1,外部一定连不上;想对外提供服务,配置里要改成0.0.0或具体网卡地址,同时确认SELinux没有拦截。
免费端口检测工具怎么选?命令行和在线检测的场景对比
命令行工具:服务器内部巡检更靠谱
命令行工具适合你在服务器上直接操作,也适合批量巡检。
ss:看本机监听,轻量、快。nc:测TCP/UDP可达,脚本友好。nmap -p 8080 192.168.1.10:批量扫端口,适合内网巡检;对公网目标要先获得授权。curl:测HTTP/HTTPS服务,能看状态码和响应头。
在线端口检测:从公网视角看结果
在线端口检测工具的原理是从外部节点发起连接,适合判断“公网能不能访问”,但它只能测公网IP,不能替代本机ss;如果服务器有CDN、云WAF或只开放内网,结果会有偏差,免费工具通常有超时限制,偶尔误报,最好用两个不同节点交叉验证。
场景选择清单
- 服务刚启动:先用
ss -tulnp | grep 端口。 - 改完防火墙:
firewall-cmd --list-ports加外部nc。 - 公网访问不了:安全组入方向加在线检测。
- 内网批量巡检:
nmap或简单Shell脚本。 - 没有telnet:用
nc或curl。
工具对比:
| 工具 | 视角 | 优点 | 局限 |
|---|---|---|---|
ss |
本机 | 快、信息全 | 只看本机 |
nc |
外部/本机 | 轻量、可脚本化 | UDP结果不够确定 |
nmap |
外部/内网 | 批量、端口范围灵活 | 需授权,公网慎用 |
| 在线检测 | 公网 | 无需登录服务器 | 只测公网,可能误报 |
业内专家指出,端口检测工具的结果只能说明某一时刻的网络可达性,不能替代服务日志和防火墙配置检查。
北京服务器端口检测常见坑:安全组与运营商限制
在北京地区托管或租用云服务器时,控制台安全组和机房防火墙策略往往要分别确认,有的环境安全组放行了,主机防火墙没放行;有的主机防火墙关了,机房侧还有策略,两边都看,别只改一个。
安全组和主机防火墙别只改一个
云服务器上,安全组是平台侧,firewall-cmd和ufw是系统侧,任何一侧没放行,外部都连不上,排查时把两边的端口、协议、源IP逐项对一遍。
IPv6与双栈容易漏
服务如果监听::8080,说明走了IPv6双栈;但安全组只放了IPv4,或者客户端只用IPv4去连,结果会不一样,用ss -tuln看清楚地址族,再决定测telnet IPv4还是IPv6。
端口占用与TIME_WAIT
启动服务报端口占用,先用sudo lsof -i:端口找进程。TIME_WAIT多通常不影响新连接,但大量短连接会占本地端口,调优前先确认业务场景,别盲目改内核参数,部分运营商对25、80等端口有入方向限制,具体以服务商公告为准。
说到底,查看Linux本地服务器端口是否打开,不是背一个命令就完事。先ss看监听,再查防火墙,最后从外部telnet或nc验证,三层都通,端口才算真正打开。
Linux查看本地服务器端口是否打开Q&A
为什么ss显示LISTEN,外部telnet却不通?
常见原因有四类:服务绑定在0.0.1只允许本机访问;主机防火墙没放行;云安全组入方向没开;中间有NAT、ACL或运营商限制,按“本机监听、主机防火墙、安全组、外部链路”的顺序逐层排除,基本能定位。
没有telnet和nc,怎么测试端口?
可以用Bash内置的/dev/tcp:timeout 3 bash -c 'cat < /dev/null > /dev/tcp/127.0.0.1/8080' && echo open,也可以用curl -v telnet://127.0.0.1:8080,或者Python:python3 -c "import socket;s=socket.socket();s.settimeout(3);print(s.connect_ex(('127.0.0.1',8080)))",返回0通常表示连接成功,生产环境更建议装nc,脚本可读性更好。
查看端口是否打开需要root权限吗?
普通用户执行ss -tuln就能看到监听端口,但加-p查看进程名通常需要sudo;查看firewall-cmd和ufw规则也需要sudo,普通用户能看到端口是否监听,但完整排查进程和防火墙规则通常要提权。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/795765.html


