您现在的位置是:烟消火灭网 > 焦点

测试端口

烟消火灭网2026-10-17 08:17:14【焦点】7人已围观

简介凌晨两点,我盯着终端上那行 `Connection refused` 发呆。服务器就在那里,ping 得通,SSH 却死活连不上。这不是第一次了,但每次遇到都让人想砸键盘。 问题出在端口上。准确地说,

凌晨两点,测试端口我盯着终端上那行 `Connection refused` 发呆。测试端口服务器就在那里,测试端口ping 得通,测试端口SSH 却死活连不上。测试端口这不是测试端口第一次了,但每次遇到都让人想砸键盘。测试端口

问题出在端口上。测试端口准确地说,测试端口是测试端口 22 端口被防火墙悄悄拦了。运维同事白天改规则的测试端口时候忘了加白名单,而我恰好是测试端口那个倒霉蛋。

端口不是测试端口门,是测试端口门牌号

很多人把端口理解成"门",我觉得不太准确。测试端口端口更像酒店房间的门牌号。IP 地址告诉你酒店在哪条街,端口告诉你具体敲哪个房间的门。房间本身是存在的,但你能不能进去,取决于前台(防火墙)让不让你上楼。

一台服务器有 65535 个端口可用。0 到 1023 是系统保留的,普通程序没资格占用。80 给 HTTP,443 给 HTTPS,22 给 SSH,3306 给 MySQL——这些都是约定俗成的规矩,不是硬性规定。你完全可以让 Web 服务跑在 8080 上,但用户访问的时候得手动加 `:8080`,体验差一截。

我见过一个离谱的配置:有人把 Redis 跑在 80 端口上。理由是"这样防火墙不用额外开端口"。结果每次重启服务器,Nginx 和 Redis 抢端口抢得头破血流。这种省事的代价,迟早要还。

测试端口,别只会 telnet

刚入行那会儿,测试端口通不通,我只会一招:`telnet ip port`。通就是通,不通就是不通。简单粗暴,但信息量太少。

后来学乖了。`nc -zv ip port` 能告诉你连接被拒绝还是超时。被拒绝说明端口没服务在听,超时八成是防火墙丢了包。这两个错误的排查方向完全相反,一个查服务进程,一个查网络策略。

再后来用 `nmap`。`nmap -p 1-1000 ip` 扫一遍,哪些端口开着、跑着什么服务,一目了然。有次帮朋友排查一台被入侵的机器,nmap 一扫,发现 4444 端口开着——那是 Metasploit 的默认反弹端口。朋友脸都绿了。

还有个场景:本地服务明明启动了,`netstat -tlnp` 也能看到监听,但外部就是连不上。这时候得看绑定地址。如果服务绑的是 `127.0.0.1:3306`,那只有本机能连。想对外提供服务,得绑 `0.0.0.0:3306`。这个坑我踩过不止一次,每次都是拍大腿才想起来。

防火墙在中间做了什么

端口测试最迷惑的地方在于:你在本机 `curl localhost:8080` 成功,换台机器 `curl 192.168.1.100:8080` 就失败。服务没问题,网络也通,问题就在防火墙。

iptables 的规则是从上往下匹配的。有时候前面一条 `DROP` 把包丢了,后面就算有 `ACCEPT` 也轮不到。`iptables -L -n --line-numbers` 看一眼规则顺序,比瞎猜快得多。云服务器还有安全组,那是另一层防火墙,在操作系统之外。两边都得放行,少一边都不行。

我习惯用 `tcpdump` 做最终确认。在服务器上跑 `tcpdump -i eth0 port 8080`,然后从客户端发起连接。如果服务器上能看到 SYN 包进来但没有 SYN-ACK 回去,说明包被本机防火墙拦了。如果连 SYN 包都看不到,那问题在更上游的网络设备上。这一步能把排查范围缩到最小。

写在最后

端口测试这件事,工具不重要,思路才重要。先确认服务在听,再确认绑定地址对,然后查本机防火墙,再查网络防火墙,最后抓包看流量到底走到哪一步断了。按这个顺序来,九成问题都能定位。

至于剩下那一成?可能是 SELinux。别问我是怎么知道的。

很赞哦!(72132)

上一篇: msf渗透工具官网

下一篇: get shell