外观
ss / curl / dig
ss:看谁在监听
bash
ss -tlnp # TCP 监听 + 进程
ss -ulnp # UDP
ss -tlnp | grep -E ':80|:443'
ss -tnp state established # 已建立的连接看监听地址:0.0.0.0 是所有接口,127.0.0.1 只有本机,[::] 是 IPv6 所有接口。「明明服务起了外面连不上」先看这一列。
curl:探测
bash
curl -I https://example.com # 只看响应头
curl -sv https://example.com -o /dev/null # 完整握手过程,不要正文
curl -k https://127.0.0.1:8443 # 忽略证书错误
curl --connect-timeout 5 --max-time 10 ... # 别让它挂着
curl -sf http://127.0.0.1:20241/ready # -f 让非 2xx 返回非零,适合脚本返回码怎么读:
| 现象 | 意思 |
|---|---|
000 + 极短耗时 | 连接被拒绝或被 drop,服务没在监听或防火墙拦了 |
000 + 长耗时 | 超时,路由不通或中间有东西吞包 |
52 Empty reply | TCP 通了但协议对不上,比如对 HTTPS 端口发了明文 HTTP |
35 SSL connect error | TLS 握手失败 |
curl 测本地 HTTPS 站点的正确姿势
想测 127.0.0.1:8443 上跑着的 www.example.com:
bash
# ❌ 只改 Host 头,TLS 的 SNI 还是 127.0.0.1,会被 nginx 拒绝握手
curl -k -I https://127.0.0.1:8443 -H "Host: www.example.com"
# ✅ --resolve 同时设置 SNI 和目标地址
curl -k -I --resolve www.example.com:8443:127.0.0.1 https://www.example.com:8443-H "Host:" 只影响 HTTP 层,管不到 TLS 层的 SNI。报 tlsv1 unrecognized name 就是这个原因。
dig:解析
bash
dig +short example.com # 只要答案
dig example.com A # A 记录
dig example.com AAAA # IPv6
dig @1.1.1.1 example.com # 指定 DNS 服务器
dig +trace example.com # 从根开始追
dig -x 203.0.113.10 # 反查改完 DNS 记录,dig @1.1.1.1 和 dig @8.8.8.8 都看一遍,各家缓存时间不同。
一个排查顺序
服务连不上,从下往上:
ss -tlnp服务在不在监听、监听地址对不对- 本机
curl 127.0.0.1:端口通不通 - 防火墙 / 安全组
- 从另一台机器
curl 公网IP:端口 dig域名解析对不对- 反代配置