伺服器管理必學 100 招|Part 4:網路通訊與防火牆調校
前言
「明明服務啟動了,外部卻連不上?」、「主機頻寬被默默吃光,不知道流量往哪裡跑?」網路層的通透與邊界管控,是伺服器穩定運作的基石。本篇精選 10 個核心網路診斷與防火牆調校技巧,從全面捨棄過時指令、精準使用 UFW/iptables 建立白名單,到線上抓包排錯與 Linux 核心網路堆疊優化,助你快速理清封包路徑,堵住未授權的連線缺口。
技巧 031:淘汰老舊 netstat!改用極速 ss 掌握 Port 監聽狀態
- 痛點場景:
在連線數達數萬的高負載伺服器上執行netstat,指令經常卡死數十秒甚至耗盡記憶體,排查效率低落。 - 解決方案:
使用直接從 Linux 核心取得 TCP 資訊的現代化工具ss(Socket Statistics):
# 檢視所有處於監聽(Listening)狀態的 TCP/UDP 連接埠與對應 PID
sudo ss -tulnp
# 僅列出目前對外建立中的已連線(ESTABLISHED)TCP 連線
ss -tan state established
# 統計當前各種連線狀態的數量總和
ss -s
- 專家提醒:
若要快速篩選特定 Port(如 80 或 443),可直接使用原生過濾語法ss -tuln 'sport = :http or sport = :https',比透過管道送給grep更高效。
技巧 032:UFW 防火牆起手式:貫徹「預設全擋、按需放行」原則
- 痛點場景:
初學者往往在安裝防火牆時,沒先放行 SSH 埠就直接啟用,導致終端機連線中斷,直接將自己反鎖在雲端主機之外。 - 解決方案:
嚴格遵循安全順序配置 UFW(Uncomplicated Firewall):
# 1. 設定全域基礎策略:預設阻擋所有連入、允許所有連出
sudo ufw default deny incoming
sudo ufw default allow outgoing
# 2. 啟用前務必先放行管理連接埠(若有變更 SSH 埠請替換 22)
sudo ufw allow 22/tcp comment 'SSH Access'
sudo ufw allow 80/tcp comment 'HTTP Web'
sudo ufw allow 443/tcp comment 'HTTPS Web'
# 3. 確認規則無誤後再啟用
sudo ufw enable
# 4. 帶編號檢視規則(方便後續精準刪除)
sudo ufw status numbered
- 專家提醒:
若日後要刪除特定規則,直接依照編號執行sudo ufw delete <編號>,避免記錯原始指令參數。
技巧 033:限制特定 IP 或私有網段存取後台管理埠
- 痛點場景:
資料庫(如 MySQL 3306、Redis 6379)或內部管理面板(如 8080)若因設定失誤暴露至公網,極易被掃描工具暴力破解。 - 解決方案:
透過防火牆鎖定僅允許特定來源 IP 或辦公室網段存取敏感埠:
# 僅允許固定辦公室 IP 存取 MySQL 3306
sudo ufw allow from 203.0.113.50 to any port 3306 proto tcp
# 僅允許同機房內網(VPC)網段存取 Redis
sudo ufw allow from 10.0.1.0/24 to any port 6379 proto tcp
# 立即重新載入驗證
sudo ufw reload
- 專家提醒:
資料庫配置本體(如my.cnf或redis.conf)建議預設綁定bind 127.0.0.1或內網 IP,搭配防火牆形成雙層縱深防禦。
技巧 034:用 dig 與 +trace 追蹤 DNS 解析,排除域名假死
- 痛點場景:
使用者回報網站打不開,但伺服器本體一切正常,工程師難以確認是 DNS 伺服器故障、快取污染,還是尚未全球生效。 - 解決方案:
安裝dnsutils,使用dig從根伺服器層層追蹤權威解析鏈:
sudo apt install dnsutils -y
# 追蹤完整委託鏈,找出是哪一層的 NS 紀錄發生中斷
dig +trace example.com A
# 跳過本機快取,直接向指定的公共 DNS(如 Cloudflare 1.1.1.1)查詢
dig @1.1.1.1 example.com A +short
- 專家提醒:
若更換了 DNS 紀錄但特定地區遲未生效,可用dig example.com +nssearch檢查所有負責該網域的權威 NS 伺服器其 Serial Number 是否已同步。
技巧 035:線上連線終端體檢:告別 telnet,善用 nc 與 curl -Iv
- 痛點場景:
當後端連線超時,需要快速判斷「目標主機網路不通」、「連線被防火牆阻斷(Drop)」還是「服務根本未啟動(Connection Refused)」。 - 解決方案:
使用nc(Netcat)測試指定埠連通性,或用curl -Iv取得包含 SSL 握手在內的完整請求歷程:
# 測試遠端主機的 443 埠是否可連通(逾時設為 3 秒)
nc -zv -w 3 203.0.113.10 443
# 查看詳細 HTTP 握手、憑證鏈校驗與重導向標頭
curl -Iv https://example.com
# 僅查看耗時細節(DNS 解析耗時、TCP 握手耗時、首字節響應 TTFB)
curl -w "DNS: %{time_namelookup}s | TCP: %{time_connect}s | TTFB: %{time_starttransfer}s | Total: %{time_total}s\n" -o /dev/null -s https://example.com
- 專家提醒:
若nc回傳Connection refused,代表網路通暢但目標伺服器上該埠沒有程式在監聽;若指令卡住直到逾時,則 90% 是封包被中間的防火牆或安全群組默默拋棄。
技巧 036:抓包排錯不用裝 GUI!tcpdump 終端精準截取封包
- 痛點場景:
API 互相呼叫回傳異常或連線中斷,但在應用程式端看不到具體的網路底層封包細節。 - 解決方案:
使用tcpdump針對特定網卡、IP 或 Port 實施動態過濾抓包:
# 監聽 eth0 網卡,僅抓取來源或目的為 80 埠的封包(不解析主機名,加速輸出)
sudo tcpdump -i eth0 -nn 'port 80'
# 抓取特定客戶端 IP 的連線,並顯示 ASCII 明文內容(適合排查純文字協議)
sudo tcpdump -i any -nn -A 'host 198.51.100.25 and port 8080'
# 將流量寫入 pcap 檔案,方便下載到本地用 Wireshark 深入剖析
sudo tcpdump -i eth0 -w /tmp/debug.pcap 'port 443' -c 1000
- 專家提醒:
在生產環境執行抓包時,務必加上-c 1000限制擷取數量,或搭配明確的過濾條件,避免大流量瞬間塞滿硬碟空間。
技巧 037:頻寬被吃光?用 iftop 揪出吃流量的遠端 IP 與連線
- 痛點場景:
雲端監控儀表板顯示頻寬對外噴出幾百 Mbps、費用暴增,但不知道是哪一台主機或哪一個外部 IP 正在大量消耗流量。 - 解決方案:
安裝並開啟即時網路流量監控儀表iftop:
sudo apt install iftop -y
# 監聽指定網卡,預設顯示雙向傳輸頻寬
sudo iftop -i eth0 -n -P
- 實用操作指令:
- 按
P:顯示對應的連接埠號(Port)。 - 按
N:切換顯示 IP 代號或網域名稱。 - 按
T:切換單行顯示或同時顯示傳入/傳出流量。 - 按
L:輸入過濾字串(如特定網段)。
- 按
- 專家提醒:
配合nethogs指令(sudo nethogs eth0),可直接從「程序(Process)」角度查看是哪個 PID 在狂吃上傳或下載頻寬。
技巧 038:Linux 核心 TCP 效能與高併發調校(sysctl.conf)
- 痛點場景:
高流量網站面臨大量連線時,常遇到TCP: time wait bucket table overflow或連線佇列排滿,導致新請求被核心直接丟棄。 - 解決方案:
調整核心參數/etc/sysctl.d/99-network-tuning.conf:
# 允許重用處於 TIME_WAIT 狀態的通訊端(適合前端高併發反向代理)
net.ipv4.tcp_tw_reuse = 1
# 加大連線積壓佇列長度,防止尖峰流量丟包
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 16384
# 擴展本機可用臨時通訊埠範圍(對外連線叢集專用)
net.ipv4.ip_local_port_range = 1024 65535
# 調降 TCP KeepAlive 偵測間隔,加速釋放失效死連線
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_keepalive_probes = 5
- 讓設定立即生效:
sudo sysctl --system
- 專家提醒:
千萬不要開啟過時的tcp_tw_recycle(在 Linux 4.12 以後已廢棄且可能導致 NAT 後端使用者無法連線)。
技巧 039:開啟 Google BBR 擁塞控制演算法,大幅改善跨國延遲與掉包
- 痛點場景:
伺服器跨國連線時,傳統 Cubic 演算法在遇到些微網路掉包時會劇烈調降傳輸速度,導致跨國傳輸速度變慢。 - 解決方案:
開啟 Linux 核心內建的 BBR(Bottleneck Bandwidth and RTT)演算法:
# 檢查當前核心版本(需 Linux 4.9 以上,現代系統大多已支援)
uname -r
# 寫入 BBR 配置
sudo bash -c 'cat <<EOF >> /etc/sysctl.d/99-bbr.conf
net.core.default_qdisc=fq
net.ipv4.tcp_congestion_control=bbr
EOF'
# 套用生效
sudo sysctl --system
# 驗證 BBR 是否已啟動(輸出應包含 bbr)
sysctl net.ipv4.tcp_congestion_control
- 專家提醒:
啟用 BBR 在高延遲、有輕微丟包的公網線路上特別顯著,能使靜態資源與影音串流的下載速度獲得明顯提升。
技巧 040:防止網路環路與異常封包!設定反向路徑過濾(RP Filter)
- 痛點場景:
多網卡環境下,外網封包若偽造來源 IP 發起欺騙攻擊(IP Spoofing),容易導致伺服器成為 DDoS 反射放大跳板。 - 解決方案:
啟用 Linux 嚴格反向路徑過濾(Strict Reverse Path Filtering),強制核心檢查封包來源是否與路由表回程路徑一致:
# 編輯 /etc/sysctl.d/99-security.conf
# 1 代表 Strict Mode:若回程網卡與進來網卡不同,直接拋棄該封包
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.rp_filter = 1
# 忽略所有 ICMP 廣播請求(防範 Smurf 放大攻擊)
net.ipv4.icmp_echo_ignore_broadcasts = 1
- 立即套用:
sudo sysctl --system。 - 專家提醒:
若你的伺服器採用非對稱路由(Asymmetric Routing,例如流量從網卡 A 進、網卡 B 出),則rp_filter需設為2(Loose Mode),否則會導致合法封包被核心誤殺。