连接被拒绝在说什么
客户端发出建连请求后立刻收到复位报文,通常带确认位,表示目标主机可达但拒绝对该端口提供服务。它与「超时」的含义完全不同:超时说明请求可能被静默丢弃或没有回应,而立即收到复位意味着报文已经到达对方并被明确拒绝。常见原因有三种:目标端口没有进程监听、策略被配置为拒绝、或者监听队列已满导致内核直接回绝。响应速度很快是它最显著的外部特征。
基本信息
| 抓取写法 | tcp[tcpflags] & tcp-rst != 0 |
|---|---|
| 报文形态 | SYN 之后紧跟复位,通常带确认位 |
| 响应速度 | 极快,接近一个往返时延 |
| 内核含义 | 端口未监听或被策略配置为拒绝 |
| 对照现象 | 应用日志里的连接被拒绝提示对应本现象 |
典型使用场景
- 区分两类失败:立即拒绝与静默超时的排查方向完全不同
- 确认服务是否在监听:结合服务端监听状态快速定位
- 核对策略配置:确认拒绝类策略与丢弃类策略的实际表现
- 排查监听地址:服务只绑定了部分地址时从其他地址访问会被拒绝
- 识别端口写错:调用方配置了错误的端口时表现为快速拒绝
核对方式
核对方式
ss -lnt | grep ':8080' # 本机是否在监听该端口
ss -lntp | grep ':8080' # 确认是哪个进程监听
ss -lnt | awk '{print $4}' | sort # 核对监听地址范围
tcpdump -i eth0 -nn 'tcp[tcpflags] & tcp-rst != 0 and dst port 8080' -c 10 # 抓拒绝报文
tcpdump -i eth0 -nn -ttt 'port 8080 and tcp[tcpflags] & (tcp-syn|tcp-rst) != 0' -c 10 # 看响应快慢拒绝与超时对比
| 对比项 | 连接被拒绝 | 连接超时 |
|---|---|---|
| 响应方式 | 立即收到复位 | 无任何响应直到本地放弃 |
| 耗时 | 约一个往返时延 | 由重试次数决定,常见数十秒 |
| 含义 | 报文到达且被明确拒绝 | 请求被静默丢弃或对端未回应 |
| 排查方向 | 端口监听、监听地址、拒绝类策略 | 路径策略、路由、对端处理能力 |
| 结论强度 | 可以直接定位到监听与策略 | 需要两端对照才能定性 |
快速收到拒绝其实是好事:失败可以立即暴露,调用方不必等到超时才放弃,排障时也省下了大量等待时间。真正难查的是静默丢弃造成的不确定状态。
拒绝类策略与端口未监听产生的报文形式非常接近,仅凭抓包难以区分。必须回到服务端核对监听状态与策略配置,才能给出确定结论。
服务端核对
服务端核对
ss -lntp | head -20 # 监听端口与进程一览
systemctl status mysvc 2>/dev/null | head -8 # 服务是否在运行
iptables -S 2>/dev/null | grep -i reject | head -10 # 是否存在拒绝类规则判读要点
- 多个客户端同时被拒绝时,优先怀疑服务未启动或端口配置变更
- 只有部分来源被拒绝时,重点看策略与监听地址绑定范围
- 应用日志出现连接被拒绝而抓包看不到复位,说明抓包点不在路径上
- 调用方配置端口写错时表现为稳定复现的快速拒绝,容易与故障混淆