跳轉到內容

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

Linux 網絡排查

🔌 網絡問題是運維最常見的挑戰之一。 從簡單的連接失敗到複雜的 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

bash
# 基本用法
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 hostDNS 解析失敗

2.2 traceroute / tracepath

bash
# 追蹤路由
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)

bash
# 安裝
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

bash
# 所有連接
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 -c

3.2 ss(netstat 替代品)

bash
# 所有連接
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_RECVSYN 攻擊或後端服務慢
大量 TIME_WAIT短連接過多,可優化
大量 CLOSE_WAIT應用未正確關閉連接

四、抓包分析

4.1 tcpdump

bash
# 安裝
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 常見過濾表達式

bash
# 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(圖形界面)

bash
# 安裝
apt install wireshark
yum install wireshark

# 查看抓包文件
wireshark capture.pcap

常用過濾器:

過濾器含義
httpHTTP 協議
httpsHTTPS 協議
dnsDNS 協議
tcp.port == 80端口 80
ip.addr == 192.168.1.1指定 IP
tcp.flags.syn == 1SYN 包
tcp.analysis.retransmission重傳包

五、DNS 故障排查

5.1 檢查 DNS 配置

bash
# 查看 /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 --statistics

5.2 nslookup / dig / host

bash
# 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.8

5.3 DNS 緩存問題

bash
# 清空 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.5

5.4 DNS 常見問題

問題原因解決
域名解析慢DNS 服務器響應慢更換 DNS
解析錯誤DNS 緩存過期清空緩存
無法解析DNS 服務器不可達檢查網絡
解析到錯誤 IPDNS 汙染使用加密 DNS

六、防火牆與安全組

6.1 iptables

bash
# 查看規則
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.v4

6.2 firewalld(CentOS/RHEL)

bash
# 查看狀態
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 --reload

6.3 ufw(Ubuntu/Debian)

bash
# 查看狀態
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/tcp

6.4 SELinux

bash
# 查看狀態
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 查看路由表

bash
# 查看路由表
route -n
ip route show

# 查看網關
ip route show default

# 查看接口配置
ip addr show
ifconfig

# 查看接口狀態
ip link show

# 查看網絡統計
ip -s link show eth0

7.2 添加路由

bash
# 添加默認路由
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_tables

7.3 常見路由問題

問題原因解決
無法訪問外網默認網關錯誤檢查並修復
只能訪問局域網缺少默認路由添加默認路由
特定網段無法訪問缺少靜態路由添加靜態路由

八、TCP 連接問題

8.1 連接拒絕

bash
# 服務未啟動
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 httpd

8.2 連接超時

bash
# 檢查網絡連通性
ping target_ip
mtr target_ip

# 檢查端口是否開放
telnet target_ip 80
nc -zv target_ip 80

# 檢查防火牆規則
iptables -L -n | grep DROP

# 檢查網絡 ACL
iptables -L FORWARD -n

8.3 慢連接

bash
# 檢查延遲
ping target_ip

# 檢查帶寬
iperf3 -c server_ip

# 檢查 TCP 參數
cat /proc/sys/net/ipv4/tcp_congestion_control

# 檢查網絡擁塞
ss -tn state established | wc -l

8.4 TCP 參數調優

bash
# /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 案例一:網站無法訪問

症狀: 訪問網站超時

排查步驟:

bash
# 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.pcap

9.2 案例二:SSH 連接慢

症狀: SSH 連接需要等待很長時間才能輸入密碼

原因: DNS 反向解析慢

解決:

bash
# /etc/ssh/sshd_config
UseDNS no
GSSAPIAuthentication no

systemctl restart sshd

9.3 案例三:TCP 連接數過多

症狀: 服務器響應慢,大量連接堆積

排查:

bash
# 查看連接狀態
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 DROP

9.4 案例四:DNS 解析失敗

症狀: 域名無法解析,但 IP 可以訪問

排查:

bash
# 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

十、常用工具速查

bash
# ===== 基礎檢查 =====
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 防火牆

十一、總結

網絡排查的關鍵在於系統化和耐心

  1. 分層排查:從物理層到應用層逐步排查
  2. 基礎工具:ping、traceroute、mtr 是起點
  3. 連接分析:ss 查看連接狀態,識別異常
  4. 抓包分析:tcpdump 是終極武器
  5. DNS 問題:nslookup/dig 快速定位
  6. 防火牆:檢查 iptables/firewalld/ufw
  7. TCP 參數:適當調優提升性能

🔌 網絡問題不可怕,掌握方法就能快速定位。


相關文章推薦:

最後更新於: