Skip to content

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 replyTCP 通了但协议对不上,比如对 HTTPS 端口发了明文 HTTP
35 SSL connect errorTLS 握手失败

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.1dig @8.8.8.8 都看一遍,各家缓存时间不同。

一个排查顺序

服务连不上,从下往上:

  1. ss -tlnp 服务在不在监听、监听地址对不对
  2. 本机 curl 127.0.0.1:端口 通不通
  3. 防火墙 / 安全组
  4. 从另一台机器 curl 公网IP:端口
  5. dig 域名解析对不对
  6. 反代配置

个人笔记,写给未来忘事的自己。