4、传输层排查:TCP三次握手失败分析、端口连通性测试(Telnet/Nmap)、防火墙规则检查
传输层,说白了就是设备之间“打电话”的过程。TCP三次握手就是那个“喂,能听到吗?”的环节。很多物联网设备连不上云,问题就卡在这一层。我排查过不下百个断连案例,至少一半是传输层出的幺蛾子。
核心思路:先确认握手能不能完成,再测端口通不通,最后查防火墙有没有“拦路打劫”。三步走,基本能定位80%的传输层问题。
4.1 TCP三次握手失败分析
三次握手,你肯定不陌生。客户端发SYN,服务端回SYN+ACK,客户端再回ACK。但物联网设备环境复杂,握手失败的情况五花八门。
常见失败场景:
- SYN超时重传:设备发了SYN,服务器没回。原因可能是网络延迟大、服务器负载高、或者中间路由丢了包。我遇到过一批NB-IoT水表,每次上报都要重传3次才能连上,最后发现是基站侧配置了过小的RTO(重传超时时间)。
- SYN被RST:服务器直接回了RST包。这通常意味着端口没开,或者服务没在监听。说白了就是“你打过去,对方直接挂电话”。
- 半连接队列溢出:服务器来不及处理SYN,把新连接丢进了黑洞。高并发场景下常见,比如大量设备同时上线。
抓包小技巧:在设备侧用tcpdump抓SYN包,在服务器侧同时抓。对比时间戳,看SYN是否到达、ACK是否返回。我曾经用这个方法帮一个客户定位到是运营商4G核心网把SYN包给丢了,折腾了两周。
抓包命令示例:
# 在设备侧抓取发往服务器的SYN包
tcpdump -i wlan0 -nn 'tcp[tcpflags] & tcp-syn != 0 and host 192.168.1.100'
# 在服务器侧抓取收到的SYN包
tcpdump -i eth0 -nn 'tcp[tcpflags] & tcp-syn != 0 and port 8080'
为什么会抓不到包?嗯,这里要注意:很多物联网设备用的是加密传输(TLS),但三次握手是明文进行的,抓包完全能看到。如果连SYN都看不到,那问题大概率出在更底层——比如IP层路由不通,或者物理层根本没连上。
4.2 端口连通性测试(Telnet/Nmap)
握手没问题,但应用层就是连不上?那得测端口。我个人习惯用两个工具:Telnet和Nmap。一个轻量快速,一个功能全面。
4.2.1 Telnet:快速验证端口是否开放
Telnet虽然老,但胜在简单。一行命令就知道端口通不通。
# 测试服务器8080端口是否开放
telnet 192.168.1.100 8080
如果端口开放,你会看到光标闪烁或者收到一些乱码字符。如果端口不通,要么卡住不动,要么直接报错“Connection refused”或“Connection timed out”。
注意:很多物联网设备默认没装Telnet客户端。你可以用busybox自带的telnet,或者干脆用nc(netcat)替代。nc -zv 192.168.1.100 8080 效果一样,而且更轻量。
4.2.2 Nmap:深度扫描与端口状态分析
Telnet只能测一个端口,Nmap可以扫一大片。我常用它来排查设备是否被防火墙限制了端口范围。
# 扫描常见端口,判断状态
nmap -sS -p 80,443,8080,8443 192.168.1.100
# 扫描所有端口,适合排查非标端口
nmap -sS -p 1-65535 192.168.1.100
端口状态解读:
| 状态 | 含义 | 常见原因 |
|---|---|---|
| open | 端口开放,服务在监听 | 正常 |
| closed | 端口关闭,无服务监听 | 服务未启动、端口配置错误 |
| filtered | 端口被防火墙/ACL过滤 | 防火墙规则拦截、安全组配置 |
| unfiltered | 端口可达但状态未知 | 需要进一步探测 |
我记得有一次,客户说设备连不上云平台。我远程用Nmap扫了一下,发现目标端口状态是filtered。客户坚持说防火墙没动过。结果一查,是云平台的安全组规则不小心把设备IP段给禁了。嗯,这种“我以为没动过”的坑,我踩过不止一次。
4.3 防火墙规则检查
防火墙是传输层排查的“终极大Boss”。很多问题查到最后,都是防火墙在作祟。物联网设备通常在内网或专网里,中间可能经过好几层防火墙:设备本地防火墙、企业出口防火墙、云平台安全组。
检查思路:
- 从设备侧开始:检查iptables或ufw规则,确认出站方向没有拦截目标IP和端口。
- 检查中间网络:如果有NAT或VPN,确认端口映射和转发规则正确。
- 检查服务器侧:云平台安全组、主机防火墙(iptables/firewalld)是否放行了入站流量。
实用命令:在Linux设备上查看iptables规则,确认是否有DROP或REJECT规则命中。
# 查看所有iptables规则
iptables -L -n -v
# 查看特定链的规则,比如INPUT链
iptables -L INPUT -n -v
# 清空规则(谨慎使用,仅用于测试)
iptables -F
避坑指南:我曾经遇到一个案例,设备能ping通服务器,但TCP连接就是建不起来。查了三天,最后发现是防火墙配置了“只允许ICMP,禁止TCP”。你想想看,ping通不代表TCP能通,这是两个完全不同的协议。所以别被ping的结果迷惑了。
4.4 本章知识体系
下面这张图总结了传输层排查的核心逻辑,你可以对照着一步步走。
传输层排查,说白了就是“握手、端口、防火墙”三板斧。握不上手查网络,端口不通查服务,防火墙拦路就改规则。按这个顺序走,大部分问题都能快速定位。我个人的经验是,别一上来就怀疑防火墙,先确认握手和端口,否则容易绕弯路。