Linux 網絡排查與故障診斷實戰 2026

🔌 網絡問題是運維最常見的挑戰之一。 從簡單的連接失敗到複雜的 TCP 丟包,網絡故障千變萬化。掌握一套系統化的排查方法和工具鏈,是每個 Linux 管理員的必備技能。本文帶你從基礎到進階,全面掌握網絡故障診斷。
本文將帶你係統掌握:
- ✅ 網絡排查方法論與思路
- ✅ ping / traceroute / mtr 基礎工具
- ✅ netstat / ss 連接狀態分析
- ✅ tcpdump / wireshark 抓包分析
- ✅ DNS 故障排查
- ✅ 防火牆與 SELinux 問題
- ✅ TCP 連接問題分析
- ✅ 常見問題處理與案例
一、網絡排查方法論
1.1 分層排查法
按照 OSI 模型從下往上排查:
第1層 物理層 → 網線、網卡、端口
第2層 數據鏈路層 → ARP、MAC 地址、VLAN
第3層 網絡層 → IP 地址、路由、ICMP
第4層 傳輸層 → TCP/UDP、端口、連接狀態
第5-7層 應用層 → DNS、HTTP、應用協議排查順序:
1. 檢查本地網絡配置
2. 檢查物理連接
3. 檢查路由表
4. 檢查防火牆
5. 檢查 DNS
6. 檢查應用服務
7. 抓包分析1.2 系統化排查流程
目標:www.example.com 無法訪問
步驟:
1. ping 127.0.0.1 → 檢查本地迴環
2. ping 本機IP → 檢查網卡
3. ping 網關 → 檢查局域網連接
4. ping 8.8.8.8 → 檢查外網連接
5. nslookup example.com → 檢查 DNS
6. curl http://example.com → 檢查應用層二、基礎工具
2.1 ping
# 基本用法
ping 8.8.8.8
ping www.example.com
# 指定次數
ping -c 4 8.8.8.8
# 指定間隔(秒)
ping -i 0.5 8.8.8.8
# 指定數據包大小
ping -s 1500 8.8.8.8
# 不解析域名(更快)
ping -n 8.8.8.8
# 輸出時間戳
ping -D 8.8.8.8結果分析:
| 結果 | 含義 |
|---|---|
| 100% 丟包 | 網絡不通 |
| 高延遲 | 網絡擁塞或路由問題 |
| 不穩定延遲 | 網絡抖動 |
| Destination Host Unreachable | 目標不可達 |
| Unknown host | DNS 解析失敗 |
2.2 traceroute / tracepath
# 追蹤路由
traceroute www.example.com
tracepath www.example.com
# IPv6
traceroute6 www.example.com
# 使用 ICMP
traceroute -I www.example.com
# 使用 TCP
traceroute -T -p 80 www.example.com
# 使用 UDP(默認)
traceroute www.example.com結果分析:
1 192.168.1.1 (192.168.1.1) 0.5ms
2 10.0.0.1 (10.0.0.1) 2ms
3 * * * # 超時,可能被防火牆攔截
4 202.96.128.1 (202.96.128.1) 10ms
...2.3 mtr(結合 ping 和 traceroute)
# 安裝
apt install mtr
yum install mtr
# 使用
mtr www.example.com
# 生成報告
mtr --report www.example.com
# 指定時間
mtr --report --report-cycles 100 www.example.com
# IPv6
mtr6 www.example.com結果分析:
| 列 | 含義 |
|---|---|
| Loss% | 丟包率 |
| Snt | 發送數據包數 |
| Last | 最後延遲 |
| Avg | 平均延遲 |
| Best | 最小延遲 |
| Wrst | 最大延遲 |
| StDev | 標準差 |
三、連接狀態分析
3.1 netstat
# 所有連接
netstat -a
# TCP 連接
netstat -at
# UDP 連接
netstat -au
# 監聽端口
netstat -tnlp
# 查看進程名
netstat -tnlp | grep 80
# 統計連接數
netstat -tn | grep ESTABLISHED | wc -l
# 按狀態統計
netstat -tn | awk '{print $6}' | sort | uniq -c3.2 ss(netstat 替代品)
# 所有連接
ss -a
# TCP 連接
ss -t
# UDP 連接
ss -u
# 監聽端口
ss -tlnp
# 查看進程名
ss -tlnp | grep nginx
# 統計連接數
ss -tn state established | wc -l
# 按狀態統計
ss -tn | awk '{print $1}' | sort | uniq -c
# 查看某個端口的連接
ss -tn sport = :80
# 查看連接到某個IP的
ss -tn dst 192.168.1.100
# 查看連接狀態詳情
ss -tn state established '( dport = :80 or sport = :80 )'3.3 TCP 連接狀態
LISTEN → 等待連接請求
SYN_SENT → 發送 SYN,等待對方確認
SYN_RECV → 收到 SYN,等待 ACK
ESTABLISHED → 連接已建立
FIN_WAIT1 → 主動關閉,發送 FIN
FIN_WAIT2 → 等待對方 FIN
TIME_WAIT → 等待足夠時間確保對方收到 ACK
CLOSE_WAIT → 被動關閉,收到 FIN
LAST_ACK → 發送 FIN,等待 ACK
CLOSED → 連接關閉常見問題:
| 狀態 | 問題 |
|---|---|
| 大量 SYN_RECV | SYN 攻擊或後端服務慢 |
| 大量 TIME_WAIT | 短連接過多,可優化 |
| 大量 CLOSE_WAIT | 應用未正確關閉連接 |
四、抓包分析
4.1 tcpdump
# 安裝
apt install tcpdump
yum install tcpdump
# 抓所有包
tcpdump
# 指定網卡
tcpdump -i eth0
# 指定協議
tcpdump -i eth0 tcp
tcpdump -i eth0 udp
tcpdump -i eth0 icmp
# 指定端口
tcpdump -i eth0 port 80
tcpdump -i eth0 port 80 or port 443
# 指定主機
tcpdump -i eth0 host 192.168.1.100
tcpdump -i eth0 src 192.168.1.100
tcpdump -i eth0 dst 192.168.1.100
# 指定長度(顯示完整包)
tcpdump -i eth0 -s 0
# 保存到文件
tcpdump -i eth0 -w capture.pcap
# 讀取文件
tcpdump -r capture.pcap
# 顯示詳細信息
tcpdump -i eth0 -vvv
# 顯示 ASCII
tcpdump -i eth0 -A
# 顯示十六進制
tcpdump -i eth0 -X
# 過濾 HTTP 請求
tcpdump -i eth0 tcp port 80 -A | grep "GET\|POST"
# 過濾 DNS
tcpdump -i eth0 udp port 53 -vvv
# 過濾 SYN 包
tcpdump -i eth0 'tcp[tcpflags] & tcp-syn != 0'
# 過濾 RST 包
tcpdump -i eth0 'tcp[tcpflags] & tcp-rst != 0'4.2 常見過濾表達式
# TCP 三次握手
tcpdump -i eth0 'tcp[tcpflags] & (tcp-syn|tcp-ack) != 0'
# TCP 四次揮手
tcpdump -i eth0 'tcp[tcpflags] & (tcp-fin|tcp-rst) != 0'
# 丟包檢測
tcpdump -i eth0 'tcp[tcpflags] & tcp-dupack != 0'
# 重傳檢測
tcpdump -i eth0 'tcp[tcpflags] & tcp-retrans != 0'
# 特定協議
tcpdump -i eth0 'tcp port 443 and ssl.handshake.type == 1'4.3 Wireshark(圖形界面)
# 安裝
apt install wireshark
yum install wireshark
# 查看抓包文件
wireshark capture.pcap常用過濾器:
| 過濾器 | 含義 |
|---|---|
http | HTTP 協議 |
https | HTTPS 協議 |
dns | DNS 協議 |
tcp.port == 80 | 端口 80 |
ip.addr == 192.168.1.1 | 指定 IP |
tcp.flags.syn == 1 | SYN 包 |
tcp.analysis.retransmission | 重傳包 |
五、DNS 故障排查
5.1 檢查 DNS 配置
# 查看 /etc/resolv.conf
cat /etc/resolv.conf
# nameserver 8.8.8.8
# nameserver 8.8.4.4
# 查看 DNS 服務狀態(systemd-resolved)
systemctl status systemd-resolved
# 查看 DNS 緩存
systemd-resolve --statistics5.2 nslookup / dig / host
# nslookup
nslookup www.example.com
nslookup www.example.com 8.8.8.8
# dig(更詳細)
dig www.example.com
dig www.example.com @8.8.8.8
dig www.example.com +short
dig www.example.com MX # 郵件記錄
dig www.example.com TXT # 文本記錄
dig -x 8.8.8.8 # 反向解析
# host
host www.example.com
host 8.8.8.85.3 DNS 緩存問題
# 清空 systemd-resolved 緩存
systemd-resolve --flush-caches
# 清空 dnsmasq 緩存
pkill -HUP dnsmasq
# 測試不同 DNS
dig www.example.com @8.8.8.8
dig www.example.com @1.1.1.1
dig www.example.com @223.5.5.55.4 DNS 常見問題
| 問題 | 原因 | 解決 |
|---|---|---|
| 域名解析慢 | DNS 服務器響應慢 | 更換 DNS |
| 解析錯誤 | DNS 緩存過期 | 清空緩存 |
| 無法解析 | DNS 服務器不可達 | 檢查網絡 |
| 解析到錯誤 IP | DNS 汙染 | 使用加密 DNS |
六、防火牆與安全組
6.1 iptables
# 查看規則
iptables -L
iptables -L -n
iptables -L -n -v
# 查看 NAT 規則
iptables -t nat -L
# 查看詳細規則
iptables -S
# 允許端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 允許特定 IP
iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT
# 拒絕特定 IP
iptables -A INPUT -s 10.0.0.1 -j DROP
# 保存規則
iptables-save > /etc/iptables/rules.v4
# 加載規則
iptables-restore < /etc/iptables/rules.v46.2 firewalld(CentOS/RHEL)
# 查看狀態
systemctl status firewalld
# 查看規則
firewall-cmd --list-all
firewall-cmd --list-ports
# 開放端口
firewall-cmd --add-port=80/tcp --permanent
firewall-cmd --add-port=443/tcp --permanent
# 開放服務
firewall-cmd --add-service=http --permanent
firewall-cmd --add-service=https --permanent
# 開放特定 IP
firewall-cmd --add-source=192.168.1.0/24 --permanent
# 重新加載
firewall-cmd --reload6.3 ufw(Ubuntu/Debian)
# 查看狀態
ufw status
# 啟用
ufw enable
# 禁用
ufw disable
# 允許端口
ufw allow 80/tcp
ufw allow 443/tcp
# 允許特定 IP
ufw allow from 192.168.1.0/24
# 拒絕
ufw deny from 10.0.0.1
# 刪除規則
ufw delete allow 80/tcp6.4 SELinux
# 查看狀態
sestatus
getenforce
# 臨時關閉(測試)
setenforce 0
# 永久關閉(不推薦)
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
# 查看 SELinux 策略
ls -Z
# 設置 SELinux 上下文
chcon -R -t httpd_sys_content_t /var/www/html
# 查看 SELinux 日誌
grep "SELinux is preventing" /var/log/audit/audit.log七、路由與網關
7.1 查看路由表
# 查看路由表
route -n
ip route show
# 查看網關
ip route show default
# 查看接口配置
ip addr show
ifconfig
# 查看接口狀態
ip link show
# 查看網絡統計
ip -s link show eth07.2 添加路由
# 添加默認路由
ip route add default via 192.168.1.1
# 添加靜態路由
ip route add 10.0.0.0/8 via 192.168.1.100
# 添加策略路由
ip rule add from 192.168.2.0/24 table 100
ip route add default via 192.168.1.200 table 100
# 刪除路由
ip route del 10.0.0.0/8
# 保存路由
ip route save > /etc/iproute2/rt_tables7.3 常見路由問題
| 問題 | 原因 | 解決 |
|---|---|---|
| 無法訪問外網 | 默認網關錯誤 | 檢查並修復 |
| 只能訪問局域網 | 缺少默認路由 | 添加默認路由 |
| 特定網段無法訪問 | 缺少靜態路由 | 添加靜態路由 |
八、TCP 連接問題
8.1 連接拒絕
# 服務未啟動
ss -tlnp | grep 80
# 端口被佔用
lsof -i :80
fuser 80/tcp
# 防火牆阻止
iptables -L -n | grep 80
firewall-cmd --list-ports | grep 80
# SELinux 阻止
grep "denied" /var/log/audit/audit.log | grep httpd8.2 連接超時
# 檢查網絡連通性
ping target_ip
mtr target_ip
# 檢查端口是否開放
telnet target_ip 80
nc -zv target_ip 80
# 檢查防火牆規則
iptables -L -n | grep DROP
# 檢查網絡 ACL
iptables -L FORWARD -n8.3 慢連接
# 檢查延遲
ping target_ip
# 檢查帶寬
iperf3 -c server_ip
# 檢查 TCP 參數
cat /proc/sys/net/ipv4/tcp_congestion_control
# 檢查網絡擁塞
ss -tn state established | wc -l8.4 TCP 參數調優
# /etc/sysctl.conf
# TCP 超時時間
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 300
# 最大連接數
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
# 內存參數
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
# 緩衝區
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
# 複用 TIME_WAIT
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 0
# 應用修改
sysctl -p九、常見問題案例
9.1 案例一:網站無法訪問
症狀: 訪問網站超時
排查步驟:
# 1. 檢查服務是否運行
ss -tlnp | grep 80
systemctl status nginx
# 2. 檢查本地網絡
ping 127.0.0.1
ping 本機IP
# 3. 檢查防火牆
iptables -L -n | grep 80
ufw status
# 4. 檢查端口連通性
telnet localhost 80
# 5. 檢查外部連接
curl http://localhost
# 6. 檢查 DNS
nslookup www.example.com
# 7. 檢查路由
ip route show default
# 8. 抓包分析
tcpdump -i eth0 port 80 -w capture.pcap9.2 案例二:SSH 連接慢
症狀: SSH 連接需要等待很長時間才能輸入密碼
原因: DNS 反向解析慢
解決:
# /etc/ssh/sshd_config
UseDNS no
GSSAPIAuthentication no
systemctl restart sshd9.3 案例三:TCP 連接數過多
症狀: 服務器響應慢,大量連接堆積
排查:
# 查看連接狀態
ss -tn | awk '{print $1}' | sort | uniq -c
# 查看連接數最多的 IP
ss -tn | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr
# 限制連接數(iptables)
iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 100 -j DROP9.4 案例四:DNS 解析失敗
症狀: 域名無法解析,但 IP 可以訪問
排查:
# 1. 檢查 DNS 配置
cat /etc/resolv.conf
# 2. 測試 DNS
nslookup www.example.com
dig www.example.com
# 3. 測試不同 DNS 服務器
dig www.example.com @8.8.8.8
dig www.example.com @1.1.1.1
# 4. 清空緩存
systemd-resolve --flush-caches
# 5. 更換 DNS
echo "nameserver 8.8.8.8" > /etc/resolv.conf
echo "nameserver 1.1.1.1" >> /etc/resolv.conf十、常用工具速查
# ===== 基礎檢查 =====
ping # 連通性測試
traceroute / tracepath # 路由追蹤
mtr # 連續 ping + 路由追蹤
# ===== 連接狀態 =====
netstat # 傳統連接查看
ss # 現代連接查看(推薦)
lsof # 打開文件/端口查看
# ===== 抓包 =====
tcpdump # 命令行抓包
wireshark # 圖形界面抓包
# ===== DNS =====
nslookup # DNS 查詢
dig # DNS 查詢(更詳細)
host # DNS 查詢
# ===== 網絡配置 =====
ip addr # IP 地址
ip route # 路由表
ip link # 網絡接口
ifconfig # 傳統接口查看
# ===== 防火牆 =====
iptables # 傳統防火牆
ufw # Ubuntu 簡化防火牆
firewalld # CentOS 防火牆十一、總結
網絡排查的關鍵在於系統化和耐心:
- 分層排查:從物理層到應用層逐步排查
- 基礎工具:ping、traceroute、mtr 是起點
- 連接分析:ss 查看連接狀態,識別異常
- 抓包分析:tcpdump 是終極武器
- DNS 問題:nslookup/dig 快速定位
- 防火牆:檢查 iptables/firewalld/ufw
- TCP 參數:適當調優提升性能
🔌 網絡問題不可怕,掌握方法就能快速定位。
相關文章推薦: