网络出问题时,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% 的日常网络问题停留在网络层到应用层之间,这也是本文的重点覆盖范围。
排障三问
每次面对网络问题时,先问自己三个问题:
- "我能到达目标吗?" →
ping/traceroute - "我解析对了吗?" →
nslookup/dig - "端口在监听吗?" →
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 诊断
相比 nslookup,dig 的输出更详细且更结构化:
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 |
--- |