端口明明开放了,Telnet 却连不上?5个排查思路帮你破案
大家好,我是33blog的技术小编。今天想和大家分享一个我最近在服务器运维中遇到的”灵异事件”:明明用netstat
看到端口是监听的,防火墙也放行了,但用Telnet死活连不上。相信不少运维同学都遇到过这种情况,下面就把我的排查经验分享给大家。
1. 先确认基础检查项
首先我们要做最基础的”三件套”检查:
- 服务是否真的在运行?
systemctl status xxx
- 端口确实在监听?
netstat -tulnp | grep 端口号
- 防火墙是否放行?
iptables -L -n
或firewall-cmd --list-all
上周我就犯了个低级错误,检查时发现服务进程虽然存在,但其实是僵尸进程…(捂脸)
2. 检查监听地址绑定
这个坑我踩过不止一次!有时候服务可能只绑定了127.0.0.1:
netstat -tulnp | grep 3306
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 1234/mysqld
看到没?MySQL只监听本地回环地址,外部自然连不上。解决方法是在配置文件中把bind-address
改为0.0.0.0
。
3. 云服务器的安全组陷阱
如果你用的是阿里云、AWS这些云服务,千万记得检查安全组规则!我就曾经在客户现场排查两小时,最后发现是安全组没配置(尴尬)。云平台的安全组是独立于系统防火墙的,需要单独配置。
4. 中间网络设备拦截
有一次我给客户部署服务,本地测试都OK,但客户就是连不上。后来发现是他们公司出口防火墙做了ACL限制。这种情况可以:
- 在服务端用
tcpdump
抓包看有没有收到请求 - 在客户端用
tcptraceroute
检查路由 - 尝试换一个非常用端口测试
5. 服务自身的访问控制
有些服务如MySQL、Redis会有额外的访问控制:
- MySQL的grant权限
- Redis的
bind
和protected-mode
配置 - MongoDB的
net.bindIp
建议检查服务的日志文件,经常会给出明确的拒绝信息。
终极排查大法
如果以上方法都试过了还是不行,我的终极建议是:
# 服务端执行
nc -l 端口号
# 另开终端测试
telnet 服务器IP 端口号
用nc
启动一个最简单的监听,如果这样都连不上,那绝对是网络层面的问题;如果能连上,就是服务配置的问题。
希望这些经验对你有帮助!遇到网络问题不要慌,按照这个checklist一步步排查,总能找到原因。大家如果有其他排查技巧,欢迎在评论区分享~
太真实了,之前排查了半天发现是安全组的问题,气得我直接原地辞职 😤
绑定地址那个坑我也踩过,感谢分享经验!
遇到过最坑的是客户内网策略问题,白折腾一整天
建议把这些写成脚本,自动检查收藏了👍
云服务器那个深有同感,第一次用ECS时差点怀疑人生
想问下小编,如果telnet拒绝连接但端口确实开着,还有什么可能呢?