Linux 网络排查常用工具
Linux 网络排查建议按网络层次和数据流路径来看:先确认地址和路由,再看端口监听、防火墙/NAT、VPN 状态,最后用抓包确认真实流量。
一句话记忆:
1 | ip 看地址和路由 |
推荐排查顺序
日常最常用的顺序:
1 | ip -br addr |
如果问题和域名有关,再补 DNS:
1 | resolvectl status |
1. 看网卡和 IP
常用命令:
1 | ip addr |
用途:
- 确认网卡是否存在。
- 确认网卡是否
UP。 - 确认 IP 是否配置正确。
- 确认虚拟网卡是否存在,例如
wg0。
示例:
1 | ip -br addr |
常见输出关注点:
1 | eth0 UP 172.16.0.10/24 |
如果网卡是 DOWN,先排查网络服务、驱动、云服务器网卡状态或 WireGuard 是否启动。
2. 看路由
常用命令:
1 | ip route |
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 | ss -ltnp |
含义:
-l:只看监听端口。-t:TCP。-u:UDP。-n:不解析域名和服务名。-p:显示进程。-a:显示全部连接。
查看 TCP 监听:
1 | ss -ltnp |
查看 UDP 监听:
1 | ss -lunp |
查看某个端口:
1 | ss -ltnp | grep ':80' |
典型用途:
- 确认 Nginx 是否监听
80/443。 - 确认 Squid 是否监听
3128。 - 确认 WireGuard 是否监听
51820/udp。 - 确认服务是不是只监听
127.0.0.1,导致外部访问不到。
4. 看防火墙和 NAT
老系统或常见脚本里多见 iptables:
1 | iptables -S |
新系统多见 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 | conntrack -L |
如果没有安装 conntrack,可以看:
1 | cat /proc/net/nf_conntrack |
用途:
- 确认 NAT 后的连接是否被记录。
- 排查回包是否能根据连接表还原。
- 判断连接是否大量堆积。
常见场景:
1 | 本地服务器 -> WireGuard -> 云服务器 NAT -> 公网 |
如果公网请求发出去了但回包异常,可以看云服务器 conntrack 是否有对应连接记录。
6. 抓包
tcpdump 是最直接的网络排查工具,可以确认包到底有没有经过某张网卡。
安装:
1 | sudo apt install -y tcpdump |
常用命令:
1 | tcpdump -ni any host 10.200.0.1 |
参数说明:
-n:不解析域名。-i:指定网卡。any:抓所有网卡。
排查 WireGuard:
1 | tcpdump -ni any udp port 51820 |
判断逻辑:
- 真实网卡有 UDP 包,说明 WireGuard 外层包在传输。
wg0有内层 IP 包,说明解密后的 VPN 流量存在。- 只有出包没有回包,通常看路由、防火墙、安全组。
- 外层包正常但
wg0没流量,通常看密钥、AllowedIPs、握手状态。
7. 看 WireGuard
常用命令:
1 | wg show |
wg show 重点看:
1 | latest handshake |
判断方式:
latest handshake为空:基本没连上。transfer只有发送没有接收:对端回包异常,查安全组、防火墙、路由。endpoint不对:对端公网地址或 NAT 映射异常。allowed ips不包含目标网段:路由不会走这个 peer。
重启:
1 | sudo systemctl restart wg-quick@wg0 |
查看配置:
1 | sudo wg showconf wg0 |
8. 看内核网络参数
常用命令:
1 | sysctl net.ipv4.ip_forward |
转发是否开启:
1 | sysctl net.ipv4.ip_forward |
期望:
1 | net.ipv4.ip_forward = 1 |
临时开启:
1 | sudo sysctl -w net.ipv4.ip_forward=1 |
持久化:
1 | echo "net.ipv4.ip_forward=1" | sudo tee /etc/sysctl.d/99-ip-forward.conf |
适用场景:
- WireGuard 网关。
- NAT 出口。
- 本地测试局域网通过 VPN 网关访问云服务器。
如果只是在本机访问服务,不涉及转发,通常不需要开启 IP forward。
9. 连通性测试
不同命令测试的是不同层级。
ICMP:
1 | ping 10.200.0.1 |
路径:
1 | traceroute 10.200.0.1 |
TCP 端口:
1 | nc -vz 10.200.0.1 3128 |
HTTP:
1 | curl -v http://10.200.0.1:3128 |
代理:
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 | resolvectl status |
指定 DNS 查询:
1 | dig @8.8.8.8 example.com |
排查重点:
/etc/resolv.conf是否被 WSL、systemd-resolved、NetworkManager 或 VPN 覆盖。- DNS 服务器是否可达。
- VPN 是否接管 DNS。
- 代理只能处理应用流量,不能自动修复系统 DNS。
常见场景
场景一:服务端口访问不到
排查顺序:
1 | ss -ltnp | grep ':端口' |
判断:
- 没监听:服务没启动或监听地址不对。
- 监听
127.0.0.1:只能本机访问。 - 抓不到包:上游路由、安全组或客户端没发到。
- 抓到包但没响应:本机防火墙、服务异常或应用层拒绝。
场景二:WireGuard 握手失败
排查顺序:
1 | wg show |
判断:
- 云服务器没监听 UDP:检查 WireGuard 服务。
- 本地发包云服务器收不到:检查安全组、Endpoint、网络。
- 收到包但无 handshake:检查公钥、配置、时间同步。
- 有 handshake 但无流量:检查
AllowedIPs和路由。
场景三:WireGuard 能连但不能转发
排查顺序:
1 | sysctl net.ipv4.ip_forward |
判断:
ip_forward = 0:系统不会转发。- FORWARD 链 DROP:防火墙拦截。
- 没有 MASQUERADE:做出口 NAT 时回包可能无法返回。
wg0有包但eth0没包:转发或防火墙问题。eth0有回包但wg0没回包:NAT 或路由问题。
场景四:代理出口不生效
排查顺序:
1 | env | grep -i proxy |
判断:
- 显式
-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定位包停在哪一段。
