当前位置:首页 > 热点

查网站端口

服务器上跑着一个 Web 服务,查网浏览器却打不开。站端第一反应通常是查网看日志,但有时候日志干干净净,站端什么错误都没有。查网这时候我会直接去查端口——服务到底有没有在监听,站端监听在哪个 IP,查网防火墙有没有放行。站端这三件事查完,查网八成问题就定位了。站端

先说最常用的查网。Linux 上查端口,站端ss -tlnp 基本能覆盖大部分场景。查网-t 是站端 TCP,-l 是查网只看 listening 状态,-n 是不做域名解析(快很多),-p 是显示进程。输出大概长这样:

State Recv-Q Send-Q Local Address:Port Peer Address:Port Process LISTEN 0 128 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=1234,fd=6)) LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=890,fd=3)) LISTEN 0 128 127.0.0.1:3306 0.0.0.0:* users:(("mysqld",pid=5678,fd=21)) 

注意第三行。MySQL 监听的是 127.0.0.1:3306,不是 0.0.0.0:3306。这意味着只有本机能连,外部机器连不上。很多人装完 MySQL 发现远程连不了,翻半天配置文件,其实 ss 一看就明白了。绑定地址决定了谁能连,防火墙决定能不能到,两回事。

如果系统上没有 ss,老一点的机器用 netstat -tlnp,参数含义一样。再老的系统可能只有 lsof -i -P -n | grep LISTEN,输出格式不同但信息量差不多。我个人的习惯是优先用 ss,它比 netstat 快,尤其在连接数多的时候差距明显。

查到服务在监听 0.0.0.0:8080,但外面还是访问不了?下一步查防火墙。iptables 的话,iptables -L -n --line-numbers 看规则链。firewalld 用 firewall-cmd --list-all。Ubuntu 上可能用的是 ufw,直接 ufw status verbose。有一回我帮人排查,服务监听正常,本机 curl 也通,外部就是不行。最后发现是云服务商的安全组没放行——机器本身的防火墙是开的,但云平台那层网络 ACL 把包丢了。这种情况在本机怎么查都查不出来,得去云控制台看。

还有一种情况:端口被占了。启动服务报 Address already in use,说明有人先占了。用 ss -tlnp | grep 8080 找到进程 PID,再 ps -p PID -o comm= 看看是什么程序。有时候是之前没杀干净的残留进程,有时候是别的服务碰巧用了同一个端口。改端口还是杀进程,看具体情况。

Windows 上查端口用 netstat -ano | findstr :8080,最后一列是 PID,然后 tasklist | findstr PID 找到对应程序。PowerShell 里可以用 Get-NetTCPConnection -LocalPort 8080,输出更结构化,但老版本的 Windows 不一定有这命令。

Mac 跟 Linux 差不多,lsof -i :8080 最直接。不过 Mac 上 lsof 不加 sudo 可能看不到别的用户的进程,加 sudo 就行。

查端口这件事本身不复杂,关键是查完之后要能判断。看到 127.0.0.1 就得想到绑定范围的问题,看到 0.0.0.0 但外部不通就得往防火墙或安全组方向走。工具输出是死的,怎么读才是活的。我见过有人 ss 输出摆在面前,盯着 127.0.0.1:5432 看了十分钟没意识到问题在哪。不是命令不会用,是没把地址和可达性联系起来。

平时顺手记几个常用组合就够了。ss -tlnp 看本机监听,ss -tnp 看已建立连接,iptables -L -n 看规则,curl -v telnet://host:port 测连通性。这四个覆盖日常九成以上的排查场景。剩下的,遇到再查。

分享到: