网络调试是这样一片地方:每个工具都做同一件事,但语法有点不一样。netstat 被弃用,由 ss 接替。dig、host、nslookup 各有重叠。macOS 上的 route 不是 Linux 的 route。按意图问,而不是按你记得哪个工具问,问题就绕开了。
1. 监听端口
clai
$ clai 列出所有监听 TCP 端口和对应进程名→ ss -ltnpState Recv-Q Local Address:Port ProcessLISTEN 0 0.0.0.0:22 users:(("sshd",pid=812))LISTEN 0 127.0.0.1:5432 users:(("postgres",pid=1234))
2. 谁连到了某服务
clai
$ clai 谁正在连我的 postgres→ ss -tnp 'sport = :5432'ESTAB 10.0.1.12:54322 10.0.1.50:5432 users:(("postgres",pid=1234))
3. 为什么 DNS 慢
clai
$ clai 跟踪 example.com 的 DNS 为什么慢→ dig +trace +stats example.com;; Query time: 312 msec;; SERVER: 8.8.8.8#53(8.8.8.8) (UDP)
+stats 是几乎没人会写的那半。区别在于「我知道慢」和「我知道慢在哪一跳」。
4. MTU 检查
clai
$ clai 检查到 8.8.8.8 的 MTU→ ping -M do -c 3 -s 1472 8.8.8.81480 bytes from 8.8.8.8: ttl=58 time=12.4 ms
-M do 设置 don't-fragment 位。1472+8+20 = 1500 通不过,说明实际 MTU 低于标准。
5. 路由表——可读
clai
$ clai 用可读形式显示路由表→ ip -4 route showdefault via 10.0.0.1 dev eth0 proto dhcp src 10.0.1.1210.0.0.0/16 dev eth0 proto kernel scope link src 10.0.1.12
另见
- 杀掉端口进程——监听调查告诉你该停谁。
- Docker 与 Kubernetes 一行命令——问题在容器里、不在宿主机时。