网络诊断命令手册

网络出问题时,GUI 工具往往只能告诉你"连不上",而命令行工具能告诉你"为什么连不上"。本文从排障角度出发,将 Windows 和 Linux 下的常用网络诊断命令按排障场景组织,辅以案例,列举网络排障方法命令。

一、排障思维框架

网络排障最忌讳"瞎试"。推荐遵循 OSI 自底向上 的排查顺序:
#mermaid-svg-zmI9zwgxQ2i7BnQZ{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-zmI9zwgxQ2i7BnQZ .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-zmI9zwgxQ2i7BnQZ .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-zmI9zwgxQ2i7BnQZ .error-icon{fill:#552222;}#mermaid-svg-zmI9zwgxQ2i7BnQZ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-zmI9zwgxQ2i7BnQZ .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-zmI9zwgxQ2i7BnQZ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-zmI9zwgxQ2i7BnQZ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-zmI9zwgxQ2i7BnQZ .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-zmI9zwgxQ2i7BnQZ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-zmI9zwgxQ2i7BnQZ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-zmI9zwgxQ2i7BnQZ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-zmI9zwgxQ2i7BnQZ .marker.cross{stroke:#333333;}#mermaid-svg-zmI9zwgxQ2i7BnQZ svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-zmI9zwgxQ2i7BnQZ p{margin:0;}#mermaid-svg-zmI9zwgxQ2i7BnQZ .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-zmI9zwgxQ2i7BnQZ .cluster-label text{fill:#333;}#mermaid-svg-zmI9zwgxQ2i7BnQZ .cluster-label span{color:#333;}#mermaid-svg-zmI9zwgxQ2i7BnQZ .cluster-label span p{background-color:transparent;}#mermaid-svg-zmI9zwgxQ2i7BnQZ .label text,#mermaid-svg-zmI9zwgxQ2i7BnQZ span{fill:#333;color:#333;}#mermaid-svg-zmI9zwgxQ2i7BnQZ .node rect,#mermaid-svg-zmI9zwgxQ2i7BnQZ .node circle,#mermaid-svg-zmI9zwgxQ2i7BnQZ .node ellipse,#mermaid-svg-zmI9zwgxQ2i7BnQZ .node polygon,#mermaid-svg-zmI9zwgxQ2i7BnQZ .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-zmI9zwgxQ2i7BnQZ .rough-node .label text,#mermaid-svg-zmI9zwgxQ2i7BnQZ .node .label text,#mermaid-svg-zmI9zwgxQ2i7BnQZ .image-shape .label,#mermaid-svg-zmI9zwgxQ2i7BnQZ .icon-shape .label{text-anchor:middle;}#mermaid-svg-zmI9zwgxQ2i7BnQZ .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-zmI9zwgxQ2i7BnQZ .rough-node .label,#mermaid-svg-zmI9zwgxQ2i7BnQZ .node .label,#mermaid-svg-zmI9zwgxQ2i7BnQZ .image-shape .label,#mermaid-svg-zmI9zwgxQ2i7BnQZ .icon-shape .label{text-align:center;}#mermaid-svg-zmI9zwgxQ2i7BnQZ .node.clickable{cursor:pointer;}#mermaid-svg-zmI9zwgxQ2i7BnQZ .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-zmI9zwgxQ2i7BnQZ .arrowheadPath{fill:#333333;}#mermaid-svg-zmI9zwgxQ2i7BnQZ .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-zmI9zwgxQ2i7BnQZ .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-zmI9zwgxQ2i7BnQZ .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-zmI9zwgxQ2i7BnQZ .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-zmI9zwgxQ2i7BnQZ .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-zmI9zwgxQ2i7BnQZ .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-zmI9zwgxQ2i7BnQZ .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-zmI9zwgxQ2i7BnQZ .cluster text{fill:#333;}#mermaid-svg-zmI9zwgxQ2i7BnQZ .cluster span{color:#333;}#mermaid-svg-zmI9zwgxQ2i7BnQZ div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-zmI9zwgxQ2i7BnQZ .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-zmI9zwgxQ2i7BnQZ rect.text{fill:none;stroke-width:0;}#mermaid-svg-zmI9zwgxQ2i7BnQZ .icon-shape,#mermaid-svg-zmI9zwgxQ2i7BnQZ .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-zmI9zwgxQ2i7BnQZ .icon-shape p,#mermaid-svg-zmI9zwgxQ2i7BnQZ .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-zmI9zwgxQ2i7BnQZ .icon-shape .label rect,#mermaid-svg-zmI9zwgxQ2i7BnQZ .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-zmI9zwgxQ2i7BnQZ .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-zmI9zwgxQ2i7BnQZ .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-zmI9zwgxQ2i7BnQZ :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 物理层

网线/网卡
数据链路层

ARP/MAC
网络层

IP/路由/ICMP
传输层

TCP/UDP 端口
应用层

DNS/HTTP/TLS

80% 的日常网络问题停留在网络层到应用层之间,这也是本文的重点覆盖范围。

排障三问

每次面对网络问题时,先问自己三个问题:

  1. "我能到达目标吗?"ping / traceroute
  2. "我解析对了吗?"nslookup / dig
  3. "端口在监听吗?"netstat / ss / telnet

二、第一层:连通性检查

2.1 ping

协议:ICMP(Internet Control Message Protocol)

核心原理:向目标发送 ICMP Echo Request,等待对方回复 ICMP Echo Reply。通过回复时间和 TTL 判断连通质量和路径长度。

bash 复制代码
# Linux
$ ping -c 4 www.baidu.com
PING www.a.shifen.com (110.242.68.66) 56(84) bytes of data.
64 bytes from 110.242.68.66: icmp_seq=1 ttl=53 time=38.5 ms
64 bytes from 110.242.68.66: icmp_seq=2 ttl=53 time=37.8 ms
64 bytes from 110.242.68.66: icmp_seq=3 ttl=53 time=38.1 ms
64 bytes from 110.242.68.66: icmp_seq=4 ttl=53 time=37.9 ms

--- www.baidu.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 37.8/38.1/38.5/0.3 ms
powershell 复制代码
# Windows (默认发送 4 个包)
> ping -n 4 www.baidu.com

读懂 ping 结果:

指标 含义 异常信号
ttl 剩余跳数,每经过一个路由器减 1 TTL 异常低 → 路由迂回
time 往返时延 (RTT) > 200ms → 链路拥塞或跨国路由
packet loss 丢包率 > 1% → 链路不稳定,需进一步排查

快速扫描局域网存活主机:

bash 复制代码
# Linux: 扫描 192.168.1.0/24 网段(并行 fping)
$ fping -a -g 192.168.1.0/24 2>/dev/null
192.168.1.1
192.168.1.100
192.168.1.101
powershell 复制代码
# Windows PowerShell: 扫描局域网
1..254 | ForEach-Object { 
    $ip = "192.168.1.$_"
    if (Test-Connection $ip -Count 1 -Quiet) { Write-Host $ip }
}

** 常见误区**:ping 不通不代表服务不可达。很多服务器禁用了 ICMP 响应(防火墙拦截),但 TCP 80/443 端口正常。遇到 ping 不通时,请继续往下走。


2.2 telnet / nc

ping 只能证明 IP 层通,端口是否开放需要 telnet / nc(netcat)来验证

bash 复制代码
# 测试 TCP 80 端口是否开放
$ telnet www.example.com 80
Trying 93.184.216.34...
Connected to www.example.com.
Escape character is '^]'.
# 出现 "Connected" → 端口通 

# 或者用 nc(更强⼤)
$ nc -zv www.example.com 80
Connection to www.example.com 80 port [tcp/http] succeeded!
$ nc -zv www.example.com 443
Connection to www.example.com 443 port [tcp/https] succeeded!
powershell 复制代码
# Windows PowerShell 替代 telnet
> Test-NetConnection www.example.com -Port 80
ComputerName     : www.example.com
RemoteAddress    : 93.184.216.34
RemotePort       : 80
TcpTestSucceeded : True    # ← 关键看这个

三、第二层:路径追踪

3.1 traceroute / tracert

原理:利用 IP 头的 TTL(Time To Live)字段。每次发送 TTL 递增的数据包,途经路由器在 TTL 归零时返回 ICMP Time Exceeded,从而逐跳揭示路径。
目标主机 路由器2 路由器1 源主机 目标主机 路由器2 路由器1 源主机 #mermaid-svg-A9Kghx9HIgo1abk4{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-A9Kghx9HIgo1abk4 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-A9Kghx9HIgo1abk4 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-A9Kghx9HIgo1abk4 .error-icon{fill:#552222;}#mermaid-svg-A9Kghx9HIgo1abk4 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-A9Kghx9HIgo1abk4 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-A9Kghx9HIgo1abk4 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-A9Kghx9HIgo1abk4 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-A9Kghx9HIgo1abk4 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-A9Kghx9HIgo1abk4 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-A9Kghx9HIgo1abk4 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-A9Kghx9HIgo1abk4 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-A9Kghx9HIgo1abk4 .marker.cross{stroke:#333333;}#mermaid-svg-A9Kghx9HIgo1abk4 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-A9Kghx9HIgo1abk4 p{margin:0;}#mermaid-svg-A9Kghx9HIgo1abk4 .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-A9Kghx9HIgo1abk4 text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-A9Kghx9HIgo1abk4 .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-A9Kghx9HIgo1abk4 .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-A9Kghx9HIgo1abk4 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-A9Kghx9HIgo1abk4 .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-A9Kghx9HIgo1abk4 #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-A9Kghx9HIgo1abk4 .sequenceNumber{fill:white;}#mermaid-svg-A9Kghx9HIgo1abk4 #sequencenumber{fill:#333;}#mermaid-svg-A9Kghx9HIgo1abk4 #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-A9Kghx9HIgo1abk4 .messageText{fill:#333;stroke:none;}#mermaid-svg-A9Kghx9HIgo1abk4 .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-A9Kghx9HIgo1abk4 .labelText,#mermaid-svg-A9Kghx9HIgo1abk4 .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-A9Kghx9HIgo1abk4 .loopText,#mermaid-svg-A9Kghx9HIgo1abk4 .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-A9Kghx9HIgo1abk4 .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-A9Kghx9HIgo1abk4 .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-A9Kghx9HIgo1abk4 .noteText,#mermaid-svg-A9Kghx9HIgo1abk4 .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-A9Kghx9HIgo1abk4 .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-A9Kghx9HIgo1abk4 .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-A9Kghx9HIgo1abk4 .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-A9Kghx9HIgo1abk4 .actorPopupMenu{position:absolute;}#mermaid-svg-A9Kghx9HIgo1abk4 .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-A9Kghx9HIgo1abk4 .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-A9Kghx9HIgo1abk4 .actor-man circle,#mermaid-svg-A9Kghx9HIgo1abk4 line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-A9Kghx9HIgo1abk4 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} TTL=1, "去 D 的包" ICMP Time Exceeded (我是 R1) TTL=2, "去 D 的包" ICMP Time Exceeded (我是 R2) TTL=3, "去 D 的包" ICMP Echo Reply (到达!)

示例:

bash 复制代码
# Linux
$ traceroute www.github.com
traceroute to github.com (20.205.243.166), 30 hops max, 60 byte packets
 1  _gateway (192.168.1.1)  1.234 ms  1.189 ms  1.156 ms
 2  10.74.0.1 (10.74.0.1)  5.432 ms  5.401 ms  5.387 ms
 3  * * *        # ← 该节点不响应 ICMP(常见,继续看后面)
 4  121.14.78.185 (121.14.78.185)  8.234 ms  8.211 ms  8.198 ms
 ...
14  20.205.243.166 (20.205.243.166)  198.345 ms  198.332 ms  198.319 ms
powershell 复制代码
# Windows (tracert)
> tracert -d www.github.com    # -d 不解析主机名,更快

看懂 * * *

现象 可能原因
中间某跳持续 * * *,后面恢复 该路由器配置了不响应 ICMP(运营商常见做法)
从某跳开始全部 * * * 该节点之后的链路断开或被防火墙阻断
目的地 * * * 目标主机防火墙丢弃了探测包

3.2 mtr / pathping

traceroute 只做一次快照,mtr(My Traceroute)持续采样,呈现每跳的丢包率和延迟波动------这才是真正的排障利器。

bash 复制代码
# Linux: mtr 实时模式
$ mtr -r -c 100 www.google.com   # 发送 100 个包后出报告
Start: 2026-06-24T10:00:00+0800
HOST: myhost                     Loss%   Snt   Last   Avg  Best  Wrst StDev
  1. _gateway                    0.0%   100    1.2   1.3   1.1   2.1   0.2
  2. 10.74.0.1                   0.0%   100    5.4   5.5   5.1   8.2   0.5
  3. 121.14.78.185               0.0%   100    8.2   8.5   7.9  12.3   0.8
  4. 202.97.34.1                 2.0%   100   35.2  36.1  34.8  55.2   3.2  # ← 注意这跳有丢包!
  5. 72.14.237.130               2.0%   100  180.5 182.3 178.2 210.5   5.5

mtr 解读

  • 某跳丢包但后续跳不丢包 → 该路由器限制了 ICMP 响应速率,不是真丢包
  • 某跳丢包且后续所有跳同样丢包真丢包,该节点是瓶颈。
  • 延迟在某跳骤增 → 物理距离跨越(如出海光缆)或该路由器拥塞。
powershell 复制代码
# Windows: pathping(类似 mtr,但采样时间更长)
> pathping -n www.google.com

3.3 BestTrace

Windows 下原生的 tracert 不够直观,BestTrace 提供图形界面,自动展示每跳 IP 的地理位置和 AS 归属,出海链路一目了然。


四、第三层:DNS 解析诊断

DNS 是网络世界的"电话簿",很多时候"网站打不开"其实是"号码查不到"。

4.1 nslookup

bash 复制代码
# Linux & Windows 通用
$ nslookup www.example.com
Server:         192.168.1.1
Address:        192.168.1.1#53

Non-authoritative answer:
Name:   www.example.com
Address: 93.184.216.34

指定 DNS 服务器查询(排查"是不是运营商 DNS 有问题"的神技):

bash 复制代码
# 用 Google DNS 查询
$ nslookup www.example.com 8.8.8.8

# 用 Cloudflare DNS 查询
$ nslookup www.example.com 1.1.1.1

查询特定记录类型:

bash 复制代码
$ nslookup -type=MX google.com        # 邮件交换记录
$ nslookup -type=NS google.com        # 域名服务器记录
$ nslookup -type=TXT google.com       # 文本记录(SPF/DKIM)
$ nslookup -type=CNAME www.github.com # 别名记录

4.2 dig ------ Linux 下的 DNS 诊断

相比 nslookupdig 的输出更详细且更结构化:

bash 复制代码
$ dig www.example.com +trace    # 从根服务器开始追踪整个解析链
$ dig www.example.com +short    # 只输出结果 IP
$ dig -x 93.184.216.34         # 反向解析(IP → 域名)

+trace 的价值 :可以看到 DNS 解析的完整链路:

根 DNS → .com 顶级域 DNS → example.com 权威 DNS → 最终 A 记录。任何一环出问题都能定位。


4.3 DNS 排障 checklist

问题现象 排查手段
域名解析不到 nslookup 分别用运营商 DNS 和 8.8.8.8 查询对比
解析结果不对(DNS 劫持) nslookup 指定多个不同 DNS 对比结果
解析很慢 dig +trace 看哪个环节慢
本地 DNS 缓存问题 Windows: ipconfig /flushdns;Linux: systemd-resolve --flush-caches

五、第四层:端口与服务状态

5.1 netstat / ss

bash 复制代码
# Linux: ss 是 netstat 的现代替代(更快)
$ ss -tlnp    # 查看所有 TCP 监听端口
State   Recv-Q  Send-Q  Local Address:Port   Peer Address:Port  Process
LISTEN  0       128     0.0.0.0:22           0.0.0.0:*          sshd (pid=1024)
LISTEN  0       128     0.0.0.0:80           0.0.0.0:*          nginx (pid=2048)
LISTEN  0       128     127.0.0.1:3306       0.0.0.0:*          mysqld (pid=3072)

$ ss -tan     # 查看所有 TCP 连接(含 ESTABLISHED)
$ ss -tlnp | grep :8080    # 快速查某端口是否被占用

关键状态解读(TCP):

状态 含义
LISTEN 正在监听,等待连接
ESTABLISHED 连接已建立,正常通信中
TIME_WAIT 主动关闭方等待 2MSL(约 60s),防止旧包干扰新连接
CLOSE_WAIT 对端已关闭,但本端应用层还没调 close()------应用 Bug 信号!
SYN_SENT 正在发起连接(可能对端不可达)
powershell 复制代码
# Windows
> netstat -ano | findstr LISTENING    # 查看监听端口及 PID
> netstat -ano | findstr :80          # 查看 80 端口相关连接
> netstat -s                          # 查看各协议统计(TCP 重传率等)

5.2 lsof

bash 复制代码
$ lsof -i :8080            # 查看 8080 端口被哪个进程占用
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
java     2048 user   45u  IPv6  12345      0t0  TCP *:8080 (LISTEN)

$ lsof -i tcp:3306         # 查看 3306 端口连接

六、第五层:路由与防火墙

6.1 route

bash 复制代码
# Linux
$ route -n                  # 查看路由表(-n 不解析主机名,更快)
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.1.1     0.0.0.0         UG    100    0        0 eth0
192.168.1.0     0.0.0.0         255.255.255.0   U     100    0        0 eth0
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0

添加/删除路由(常见于 VPN 分流场景):

bash 复制代码
# 添加一条路由:访问 10.0.0.0/8 网段走 192.168.1.254 网关
$ sudo ip route add 10.0.0.0/8 via 192.168.1.254

# 删除路由
$ sudo ip route del 10.0.0.0/8

# 添加默认网关
$ sudo ip route add default via 192.168.1.1
powershell 复制代码
# Windows
> route print                    # 显示路由表
> route add 10.0.0.0 mask 255.0.0.0 192.168.1.254

6.2 iptables / nftables

iptables 是 Linux 内核 netfilter 框架的用户态工具,按 表(table)+ 链(chain)+ 规则(rule) 三层结构组织。

复制代码
数据包流向:
                        ┌──────────┐
                        │PREROUTING│  ← 刚到达网卡
                        └────┬─────┘
                             │
                        ┌────▼─────┐
                        │  路由决策 │
                        └────┬─────┘
                    ┌────────┼────────┐
              (本地)│                 │(转发)
            ┌───────▼──┐        ┌────▼─────┐
            │  INPUT   │        │ FORWARD  │
            └───────┬──┘        └────┬─────┘
                    │                 │
            ┌───────▼──┐        ┌────▼─────┐
            │  本地进程 │        │  OUTPUT  │
            └───────┬──┘        └────┬─────┘
                    │                 │
                    └────────┬────────┘
                             │
                        ┌────▼─────┐
                        │POSTROUTING│  ← 即将离开网卡
                        └──────────┘

常用场景:

bash 复制代码
# 查看当前规则(带行号,方便删除)
$ sudo iptables -L -n -v --line-numbers

# 允许来自 192.168.1.0/24 的 SSH 访问
$ sudo iptables -A INPUT -p tcp --dport 22 -s 192.168.1.0/24 -j ACCEPT

# 拒绝某个 IP 的所有流量
$ sudo iptables -A INPUT -s 10.0.0.99 -j DROP

# 端口转发:将 8080 端口的流量转发到 80
$ sudo iptables -t nat -A PREROUTING -p tcp --dport 8080 -j REDIRECT --to-port 80

# 保存规则(重启后保留)
$ sudo iptables-save > /etc/iptables/rules.v4

现代 Linux 发行版(如 Debian 10+、Ubuntu 20.04+)逐渐转向 nftables,语法更简洁,性能更好。但 iptables 仍然广泛使用。


6.3 netsh

powershell 复制代码
# 查看/设置 IP 地址
> netsh interface ip show config
> netsh interface ip set address "以太网" static 192.168.1.100 255.255.255.0 192.168.1.1

# 查看/设置 DNS
> netsh interface ip show dnsservers
> netsh interface ip set dns "以太网" static 8.8.8.8

# Windows 自带端口转发(类似 iptables DNAT)
> netsh interface portproxy add v4tov4 listenport=8080 connectaddress=127.0.0.1 connectport=80
> netsh interface portproxy show all

# 重置网络栈(网络乱了之后的"终极武器")
> netsh int ip reset
> netsh winsock reset

七、综合案例

案例一:网站打不开

现象 :浏览器访问 https://api.mycompany.com 超时。

排查步骤:

bash 复制代码
# Step 1: DNS 正常吗?
$ nslookup api.mycompany.com 8.8.8.8
Name:   api.mycompany.com
Address: 10.20.30.40          #  解析正常

# Step 2: IP 层通吗?
$ ping -c 4 10.20.30.40
4 packets transmitted, 0 received, 100% packet loss   #  不通!
# 但别急,可能是禁 ping

# Step 3: 端口通吗?
$ nc -zv 10.20.30.40 443
nc: connect to 10.20.30.40 port 443 (tcp) failed: Connection timed out  #  超时

# Step 4: 路径哪里断了?
$ mtr -r -c 30 10.20.30.40
# 发现在第 8 跳之后全部丢包 → 问题在运营商骨干网或目标侧防火墙

# Step 5: 本地防火墙拦截了?
$ sudo iptables -L -n | grep 10.20.30.40
# 无拦截规则 → 问题不在本地

# 结论:目标 IP 的 443 端口不可达,可能是安全组/防火墙未放行,联系目标服务运维。

案例二:服务启动后端口被占用

现象 :启动 Nginx 报错 bind() to 0.0.0.0:80 failed (98: Address already in use)

bash 复制代码
# Step 1: 谁在占 80 端口?
$ sudo ss -tlnp | grep :80
LISTEN  0  128  0.0.0.0:80  0.0.0.0:*  users:(("apache2",pid=3456,fd=4))
# Apache 占着 80 端口

# Step 2: 确认进程详情
$ ps aux | grep 3456
www-data  3456  ... /usr/sbin/apache2 -k start

# Step 3: 停掉 Apache,启动 Nginx
$ sudo systemctl stop apache2
$ sudo systemctl start nginx

案例三:跨国访问慢

现象:国内访问海外服务器延迟很高。

bash 复制代码
# mtr 持续监控 100 个包
$ mtr -r -c 100 overseas-server.com

# 输出分析:
# Hop 5 (202.97.x.x):   avg 180ms  ← 中国电信国际出口,延迟跃升!
# Hop 6 (ae-1.r20):     avg 250ms  ← 跨太平洋海底光缆,再加 70ms
# Hop 10 (目标):        avg 260ms  ← 总延迟 260ms,物理极限 ≈ 光速

# 结论:260ms 跨太平洋已是正常值(光速往返约 130ms + 路由器处理延迟)
# 解决方案:考虑 CDN 加速或同区域部署。

八、常用命令

Linux 命令矩阵

场景 命令 关键参数
连通性 ping -c 计数 -i 间隔
路径追踪 traceroute -n(不解析) -I(ICMP模式)
持续路径监控 mtr -r(报告) -c(包数)
DNS 查询 dig / nslookup +trace -type=MX
端口检测 nc -zv / telnet -z(扫描) -v(详细)
连接状态 ss -tlnp(监听) -tan(所有)
端口占用 lsof -i :端口号
路由表 ip route add/del
防火墙 iptables / nft -L -n -v
抓包 tcpdump -i eth0 port 80

Windows 命令矩阵

场景 命令 关键参数
连通性 ping -n 计数 -t(持续)
路径追踪 tracert -d(不解析) -h(最大跳数)
持续路径 pathping -n(不解析)
DNS 查询 nslookup -type=MX
端口检测 Test-NetConnection -Port
连接状态 netstat -ano(含PID)
路由表 route print add/del
网络配置 netsh interface ip/portproxy
DNS 缓存 ipconfig /flushdns ---
重置网络 netsh int ip reset ---