Linux 网络排查建议按网络层次和数据流路径来看:先确认地址和路由,再看端口监听、防火墙/NAT、VPN 状态,最后用抓包确认真实流量。

一句话记忆:

1
2
3
4
5
6
ip 看地址和路由
ss 看端口
iptables/nft 看防火墙和 NAT
wg 看 VPN
tcpdump 看真相
conntrack 看 NAT 映射

推荐排查顺序

日常最常用的顺序:

1
2
3
4
5
6
7
8
ip -br addr
ip route get 目标IP
ss -ltnp
iptables -t nat -S
wg show
ping 目标IP
curl -v http://目标IP:端口
tcpdump -ni any host 目标IP

如果问题和域名有关,再补 DNS:

1
2
3
resolvectl status
cat /etc/resolv.conf
dig example.com

1. 看网卡和 IP

常用命令:

1
2
3
ip addr
ip -br addr
ip link

用途:

  • 确认网卡是否存在。
  • 确认网卡是否 UP
  • 确认 IP 是否配置正确。
  • 确认虚拟网卡是否存在,例如 wg0

示例:

1
ip -br addr

常见输出关注点:

1
2
3
eth0      UP      172.16.0.10/24
wg0 UP 10.77.0.1/24
lo UNKNOWN 127.0.0.1/8

如果网卡是 DOWN,先排查网络服务、驱动、云服务器网卡状态或 WireGuard 是否启动。

2. 看路由

常用命令:

1
2
3
ip route
ip route get 10.200.0.1
ip rule

ip route get <IP> 很好用,它会告诉你访问某个 IP 时:

  • 走哪张网卡。
  • 使用哪个源 IP。
  • 命中哪条路由。

示例:

1
ip route get 10.77.0.2

可能输出:

1
10.77.0.2 dev wg0 src 10.77.0.1

说明访问 10.77.0.2 会走 wg0,源 IP 是 10.77.0.1

如果结果显示走了错误网卡,例如走 eth0 而不是 wg0,通常是路由或 WireGuard AllowedIPs 配错。

3. 看监听端口

常用命令:

1
2
3
ss -ltnp
ss -lunp
ss -antp

含义:

  • -l:只看监听端口。
  • -t:TCP。
  • -u:UDP。
  • -n:不解析域名和服务名。
  • -p:显示进程。
  • -a:显示全部连接。

查看 TCP 监听:

1
ss -ltnp

查看 UDP 监听:

1
ss -lunp

查看某个端口:

1
2
3
4
ss -ltnp | grep ':80'
ss -ltnp | grep ':3128'
ss -ltnp | grep ':3307'
ss -lunp | grep ':51820'

典型用途:

  • 确认 Nginx 是否监听 80/443
  • 确认 Squid 是否监听 3128
  • 确认 WireGuard 是否监听 51820/udp
  • 确认服务是不是只监听 127.0.0.1,导致外部访问不到。

4. 看防火墙和 NAT

老系统或常见脚本里多见 iptables

1
2
3
4
iptables -S
iptables -t nat -S
iptables -L -n -v
iptables -t nat -L -n -v

新系统多见 nftables

1
nft list ruleset

查看 NAT POSTROUTING:

1
iptables -t nat -S POSTROUTING

典型 WireGuard 出口 NAT:

1
-A POSTROUTING -s 10.77.0.0/24 -o eth0 -j MASQUERADE

含义是:从 10.77.0.0/24 出来的流量,经 eth0 出公网时做源地址伪装。

排查重点:

  • INPUT 是否允许目标端口。
  • FORWARD 是否允许跨网卡转发。
  • POSTROUTING 是否有 MASQUERADE。
  • 云服务器安全组是否也放行了相同端口。

注意:Linux 本机防火墙放行,不代表云厂商安全组也放行;两层都要检查。

5. 看连接跟踪

连接跟踪记录了 NAT 和状态连接的映射关系。

安装:

1
sudo apt install -y conntrack

常用命令:

1
2
3
conntrack -L
conntrack -L -p tcp
conntrack -L | grep 10.200.0.1

如果没有安装 conntrack,可以看:

1
cat /proc/net/nf_conntrack

用途:

  • 确认 NAT 后的连接是否被记录。
  • 排查回包是否能根据连接表还原。
  • 判断连接是否大量堆积。

常见场景:

1
本地服务器 -> WireGuard -> 云服务器 NAT -> 公网

如果公网请求发出去了但回包异常,可以看云服务器 conntrack 是否有对应连接记录。

6. 抓包

tcpdump 是最直接的网络排查工具,可以确认包到底有没有经过某张网卡。

安装:

1
sudo apt install -y tcpdump

常用命令:

1
2
3
4
5
tcpdump -ni any host 10.200.0.1
tcpdump -ni wg0
tcpdump -ni eth0
tcpdump -ni enp5s0 udp port 51820
tcpdump -ni any tcp port 3128

参数说明:

  • -n:不解析域名。
  • -i:指定网卡。
  • any:抓所有网卡。

排查 WireGuard:

1
2
tcpdump -ni any udp port 51820
tcpdump -ni wg0 host 10.77.0.2

判断逻辑:

  • 真实网卡有 UDP 包,说明 WireGuard 外层包在传输。
  • wg0 有内层 IP 包,说明解密后的 VPN 流量存在。
  • 只有出包没有回包,通常看路由、防火墙、安全组。
  • 外层包正常但 wg0 没流量,通常看密钥、AllowedIPs、握手状态。

7. 看 WireGuard

常用命令:

1
2
3
wg show
systemctl status wg-quick@wg0
journalctl -u wg-quick@wg0 -n 100 --no-pager

wg show 重点看:

1
2
3
4
latest handshake
endpoint
transfer
allowed ips

判断方式:

  • latest handshake 为空:基本没连上。
  • transfer 只有发送没有接收:对端回包异常,查安全组、防火墙、路由。
  • endpoint 不对:对端公网地址或 NAT 映射异常。
  • allowed ips 不包含目标网段:路由不会走这个 peer。

重启:

1
sudo systemctl restart wg-quick@wg0

查看配置:

1
sudo wg showconf wg0

8. 看内核网络参数

常用命令:

1
2
sysctl net.ipv4.ip_forward
sysctl -a | grep net.ipv4

转发是否开启:

1
sysctl net.ipv4.ip_forward

期望:

1
net.ipv4.ip_forward = 1

临时开启:

1
sudo sysctl -w net.ipv4.ip_forward=1

持久化:

1
2
echo "net.ipv4.ip_forward=1" | sudo tee /etc/sysctl.d/99-ip-forward.conf
sudo sysctl --system

适用场景:

  • WireGuard 网关。
  • NAT 出口。
  • 本地测试局域网通过 VPN 网关访问云服务器。

如果只是在本机访问服务,不涉及转发,通常不需要开启 IP forward。

9. 连通性测试

不同命令测试的是不同层级。

ICMP:

1
ping 10.200.0.1

路径:

1
2
traceroute 10.200.0.1
tracepath 10.200.0.1

TCP 端口:

1
nc -vz 10.200.0.1 3128

HTTP:

1
2
curl -v http://10.200.0.1:3128
curl -I https://example.com

代理:

1
curl -v -x http://10.77.0.1:3128 https://ifconfig.me

注意:

  • ping 通不代表 TCP 通。
  • ping 不通也不一定代表服务不可达,ICMP 可能被禁。
  • curl -v 能看到 DNS、连接、TLS、HTTP 响应等更多信息。
  • nc -vz 适合快速测试 TCP 端口是否可连接。

10. 看 DNS

如果 IP 能通但域名不通,优先查 DNS。

常用命令:

1
2
3
4
resolvectl status
cat /etc/resolv.conf
dig example.com
nslookup example.com

指定 DNS 查询:

1
2
dig @8.8.8.8 example.com
dig @1.1.1.1 example.com

排查重点:

  • /etc/resolv.conf 是否被 WSL、systemd-resolved、NetworkManager 或 VPN 覆盖。
  • DNS 服务器是否可达。
  • VPN 是否接管 DNS。
  • 代理只能处理应用流量,不能自动修复系统 DNS。

常见场景

场景一:服务端口访问不到

排查顺序:

1
2
3
4
ss -ltnp | grep ':端口'
ip route get 客户端IP
iptables -S
tcpdump -ni any tcp port 端口

判断:

  • 没监听:服务没启动或监听地址不对。
  • 监听 127.0.0.1:只能本机访问。
  • 抓不到包:上游路由、安全组或客户端没发到。
  • 抓到包但没响应:本机防火墙、服务异常或应用层拒绝。

场景二:WireGuard 握手失败

排查顺序:

1
2
3
4
wg show
ss -lunp | grep ':51820'
tcpdump -ni any udp port 51820
iptables -S

判断:

  • 云服务器没监听 UDP:检查 WireGuard 服务。
  • 本地发包云服务器收不到:检查安全组、Endpoint、网络。
  • 收到包但无 handshake:检查公钥、配置、时间同步。
  • 有 handshake 但无流量:检查 AllowedIPs 和路由。

场景三:WireGuard 能连但不能转发

排查顺序:

1
2
3
4
5
6
sysctl net.ipv4.ip_forward
ip route
iptables -S FORWARD
iptables -t nat -S POSTROUTING
tcpdump -ni wg0
tcpdump -ni eth0

判断:

  • ip_forward = 0:系统不会转发。
  • FORWARD 链 DROP:防火墙拦截。
  • 没有 MASQUERADE:做出口 NAT 时回包可能无法返回。
  • wg0 有包但 eth0 没包:转发或防火墙问题。
  • eth0 有回包但 wg0 没回包:NAT 或路由问题。

场景四:代理出口不生效

排查顺序:

1
2
3
4
5
env | grep -i proxy
curl -v -x http://代理IP:端口 https://ifconfig.me
curl -v https://ifconfig.me
ss -ltnp | grep ':3128'
tail -f /var/log/squid/access.log

判断:

  • 显式 -x 能用,普通 curl 不行:环境变量没被应用读取。
  • Squid 没日志:请求没到代理。
  • Squid 有拒绝日志:ACL 或认证问题。
  • 出口 IP 没变:应用没有走代理。

速查表

目标 命令
查看 IP ip -br addr
查看路由 ip route
判断访问目标走哪条路 ip route get <IP>
查看策略路由 ip rule
查看 TCP 监听 ss -ltnp
查看 UDP 监听 ss -lunp
查看 NAT iptables -t nat -S
查看 nftables nft list ruleset
查看连接跟踪 conntrack -L
抓所有相关包 tcpdump -ni any host <IP>
查看 WireGuard wg show
查看 WireGuard 服务 systemctl status wg-quick@wg0
查看 IP 转发 sysctl net.ipv4.ip_forward
测 TCP 端口 nc -vz <IP> <PORT>
测 HTTP curl -v http://<IP>:<PORT>
查 DNS dig example.com

排查原则

  • 先确认目标 IP 和目标端口,不要只说“网络不通”。
  • 先看本机地址和路由,再看远端服务。
  • 先用 ss 确认服务真的在监听。
  • 云服务器要同时检查安全组和系统防火墙。
  • VPN 问题先看 wg show,再看 ip route get
  • NAT 问题先看 iptables -t nat -S,再看 conntrack
  • 最终用 tcpdump 定位包停在哪一段。