13_網絡管理進階:防火墻與監控
網絡管理進階:防火墻與監控
當 Linux 服務器需要對外提供服務(如 Web、數據庫),或出現 “帶寬莫名跑滿”“端口被占用” 等問題時,僅靠ip addr和ping已無法應對 —— 此時需要用防火墻管控流量、用監控工具定位異常。今天這篇文章,帶你掌握兩大核心能力:用 iptables/nftables 實現端口過濾與地址轉換,用 iftop/nload/netstat 監控流量與端口,再通過實戰解決端口轉發、帶寬跑滿、端口沖突等高頻問題,讓服務器網絡 “可控、可查、可排障”。
一、防火墻進階:iptables/nftables 管控流量
Linux 防火墻的核心是 “過濾或轉發網絡數據包”,傳統用 iptables,新一代用 nftables(性能更強、配置更簡潔)。兩者原理相通,重點掌握 “端口過濾”“SNAT/DNAT 地址轉換”,滿足企業 “對外服務管控”“內網共享上網”“端口轉發” 等需求。
1. 先分清:iptables 與 nftables 的關系
| 對比維度 | iptables | nftables(推薦) | 關鍵差異 |
|---|---|---|---|
| 定位 | 傳統防火墻工具(2001 年發布) | 新一代防火墻工具(2014 年發布,替代 iptables) | nftables 合并表結構、支持批量規則,性能提升 30%+ |
| 配置文件 | /etc/sysconfig/iptables(CentOS)、/etc/iptables/rules.v4(Ubuntu) | /etc/nftables.conf | nftables 配置更簡潔,支持變量和條件判斷 |
| 依賴 | 依賴內核模塊(iptable_filter、iptable_nat 等) | 僅依賴 nft 內核模塊 | 減少內核模塊加載,降低系統開銷 |
| 適用場景 | 老系統兼容、簡單規則配置 | 新系統(CentOS 8+、Ubuntu 20.04+)、復雜規則 | 企業新部署服務器優先選 nftables |
注意:同一系統不要同時啟用 iptables 和 nftables,會導致規則沖突,推薦新系統直接用 nftables。
2. 核心能力 1:端口過濾(允許 / 禁止特定端口訪問)
端口過濾是防火墻最基礎的功能 —— 比如 “只允許外部訪問 80(HTTP)、443(HTTPS)端口,禁止訪問 22(SSH)端口(僅允許內網 IP 訪問)”。
(1)用 iptables 配置端口過濾(CentOS 7 示例)
\# 1. 清空現有規則(首次配置前執行,避免沖突)
sudo iptables -F # 清空filter表規則
sudo iptables -t nat -F # 清空nat表規則(地址轉換用)
\# 2. 配置默認策略(先拒絕所有,再允許特定流量,遵循“最小權限”)
sudo iptables -P INPUT DROP # 默認拒絕所有入站流量
sudo iptables -P OUTPUT ACCEPT # 默認允許所有出站流量
sudo iptables -P FORWARD DROP # 默認拒絕轉發(非路由器場景)
\# 3. 允許回環網卡(本地進程通信必需,如127.0.0.1)
sudo iptables -A INPUT -i lo -j ACCEPT
\# 4. 允許已建立的連接(避免已連接的SSH/HTTP會話被斷開)
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
\# 5. 允許外部訪問80(HTTP)、443(HTTPS)端口
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
\# 6. 僅允許內網IP(192.168.1.0/24)訪問22(SSH)端口
sudo iptables -A INPUT -p tcp --dport 22 -s 192.168.1.0/24 -j ACCEPT
\# 7. 查看規則(驗證配置)
sudo iptables -L -n # -n:IP顯示為數字,不反向解析(更快)
(2)用 nftables 配置端口過濾(CentOS 9 示例)
nftables 用 “表 - 鏈 - 規則” 結構,配置更簡潔:
\# 1. 清空現有規則并創建表(inet表示同時支持IPv4和IPv6)
sudo nft flush ruleset
sudo nft add table inet filter
sudo nft add chain inet filter input { type filter hook input priority 0 \\; policy drop \\; }
sudo nft add chain inet filter output { type filter hook output priority 0 \\; policy accept \\; }
sudo nft add chain inet filter forward { type filter hook forward priority 0 \\; policy drop \\; }
\# 2. 允許回環網卡和已建立連接
sudo nft add rule inet filter input iifname lo accept
sudo nft add rule inet filter input ct state established,related accept
\# 3. 允許80、443端口,僅內網訪問22端口
sudo nft add rule inet filter input tcp dport {80,443} accept
sudo nft add rule inet filter input tcp dport 22 ip saddr 192.168.1.0/24 accept
\# 4. 查看規則
sudo nft list ruleset
3. 核心能力 2:SNAT/DNAT 地址轉換(共享上網與端口轉發)
地址轉換是企業組網的關鍵功能:SNAT(源地址轉換) 實現內網多設備共享一個公網 IP 上網,DNAT(目的地址轉換) 實現 “外部訪問公網 IP 的 80 端口,自動轉發到內網服務器的 8080 端口”(即端口轉發)。
(1)SNAT 配置(內網共享公網 IP,iptables 示例)
場景:內網 192.168.1.0/24 的設備,通過 Linux 服務器的公網網卡(eth0,IP:203.0.113.10)共享上網。
\# 1. 開啟內核IP轉發(臨時生效)
sudo echo 1 > /proc/sys/net/ipv4/ip\_forward
\# 永久生效:編輯/etc/sysctl.conf,添加“net.ipv4.ip\_forward=1”,再執行sudo sysctl -p
\# 2. 配置SNAT規則(將內網源IP轉換為公網IP)
sudo iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 203.0.113.10
(2)DNAT 配置(端口轉發,后續實戰會詳細用)
場景:外部訪問公網 IP(203.0.113.10)的 80 端口,自動轉發到內網 Tomcat 服務器(192.168.1.100:8080)。
\# iptables 配置DNAT
sudo iptables -t nat -A PREROUTING -d 203.0.113.10 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100:8080
二、網絡監控工具:定位流量異常與端口問題
當服務器出現 “帶寬跑滿導致服務卡頓”“端口被占用無法啟動服務” 時,需要用監控工具快速定位根源 —— 核心工具包括:iftop(看帶寬占用)、nload(實時流量)、netstat/lsof(查端口占用)。
1. iftop:可視化查看帶寬占用(誰在 “偷” 帶寬?)
iftop 能實時顯示 “各 IP 之間的帶寬占用”,適合定位 “哪個 IP / 端口占用過多帶寬”。
(1)安裝與基礎用法
\# Ubuntu安裝
sudo apt install iftop -y
\# CentOS安裝
sudo dnf install iftop -y
\# 啟動iftop(默認監控默認網卡,指定網卡加-i參數,如-i eth0)
sudo iftop -i eth0
(2)關鍵界面解讀(啟動后按h顯示幫助)
| 界面元素 | 含義 | 異常判斷標準 |
|---|---|---|
| 左側兩列 | 通信雙方 IP: 端口 | 某 IP 持續占用>50% 帶寬,且非業務 IP(如爬蟲、異常進程) |
| 中間列 | 實時帶寬(Rx:接收,Tx:發送) | Rx/Tx 持續>100Mbps(超出服務器帶寬上限) |
| 右側列 | 累計帶寬與連接狀態 | 某連接累計帶寬遠超正常業務(如 1 小時內 100GB) |
(3)常用操作快捷鍵
-
s:切換顯示源 IP; -
d:切換顯示目的 IP; -
n:顯示 IP 而非主機名(避免反向解析卡頓); -
q:退出 iftop。
2. nload:實時監控網卡流量(上下行趨勢一目了然)
nload 更側重 “網卡整體流量趨勢”,適合快速查看 “當前總帶寬使用情況”,界面簡潔易讀。
(1)安裝與基礎用法
\# Ubuntu安裝
sudo apt install nload -y
\# CentOS安裝
sudo dnf install nload -y
\# 啟動nload(默認監控所有網卡,指定網卡加網卡名,如nload eth0)
sudo nload eth0
(2)界面解讀
-
上半部分:顯示 “Incoming(入站流量)”,包括實時速度(Curr)、平均速度(Avg)、峰值速度(Peak);
-
下半部分:顯示 “Outgoing(出站流量)”,指標同上;
-
右側:顯示網卡 IP 和總流量統計;
-
操作:按
左右箭頭切換網卡,按q退出。
3. netstat/lsof:排查端口占用(誰占了 8080 端口?)
當啟動服務時提示 “Address already in use”(端口被占用),用 netstat 或 lsof 能快速找到占用端口的進程 PID。
(1)netstat 查端口占用(需安裝 net-tools 包)
\# 安裝net-tools(部分系統默認未安裝)
sudo apt install net-tools -y # Ubuntu
sudo dnf install net-tools -y # CentOS
\# 查8080端口的占用情況(-t:TCP端口,-u:UDP端口,-l:監聽中,-n:數字顯示,-p:顯示進程)
sudo netstat -tlnp | grep 8080
\# 輸出示例:tcp 0 0 0.0.0.0:8080 0.0.0.0:\* LISTEN 1234/java
\# 解讀:PID=1234的java進程(Tomcat)占用8080端口
(2)lsof 查端口占用(功能更強,支持更多過濾)
\# 安裝lsof(部分系統默認未安裝)
sudo apt install lsof -y # Ubuntu
sudo dnf install lsof -y # CentOS
\# 查8080端口的占用進程
sudo lsof -i :8080
\# 輸出示例:COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
\# java 1234 ubuntu 42u IPv6 12345 0t0 TCP \*:http-alt (LISTEN)
\# 解讀:java進程(PID=1234)占用8080端口(http-alt是8080的默認服務名)
三、實戰:解決 3 個高頻網絡問題
結合企業真實場景,拆解端口轉發、帶寬監控、端口占用的完整解決流程。
實戰 1:配置端口轉發(80 端口轉發到 8080 的 Tomcat)
場景:內網 Tomcat 服務器(192.168.1.100:8080)需對外提供服務,但運營商封禁 8080 端口,需通過 Linux 網關(公網 IP:203.0.113.10)將 80 端口轉發到 8080。
步驟 1:開啟內核 IP 轉發(必需)
\# 臨時開啟
sudo echo 1 > /proc/sys/net/ipv4/ip\_forward
\# 永久開啟(重啟生效)
sudo echo "net.ipv4.ip\_forward=1" >> /etc/sysctl.conf
sudo sysctl -p # 立即生效
步驟 2:用 iptables 配置 DNAT 規則
\# 1. 清空nat表現有規則(可選,避免沖突)
sudo iptables -t nat -F
\# 2. 配置DNAT:外部訪問203.0.113.10:80,轉發到192.168.1.100:8080
sudo iptables -t nat -A PREROUTING -d 203.0.113.10 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100:8080
\# 3. 配置SNAT(可選,確保Tomcat響應能返回給外部)
sudo iptables -t nat -A POSTROUTING -d 192.168.1.100 -p tcp --dport 8080 -j SNAT --to-source 192.168.1.1(網關內網IP)
步驟 3:驗證轉發效果
\# 1. 本地驗證(在網關服務器上執行)
curl http://203.0.113.10 # 應返回Tomcat默認頁面(同訪問http://192.168.1.100:8080)
\# 2. 外部驗證(用其他公網機器)
curl http://203.0.113.10 # 同樣返回Tomcat頁面,說明轉發成功
步驟 4:保存 iptables 規則(避免重啟丟失)
\# CentOS系統
sudo iptables-save > /etc/sysconfig/iptables
\# Ubuntu系統
sudo iptables-save > /etc/iptables/rules.v4
\# 重啟后恢復規則(CentOS)
sudo iptables-restore < /etc/sysconfig/iptables
實戰 2:監控并解決 “帶寬跑滿” 問題
場景:服務器帶寬為 100Mbps,近期頻繁跑滿,導致 Web 服務卡頓,需定位并處理。
步驟 1:用 iftop 找到占帶寬的 IP / 端口
\# 啟動iftop,監控公網網卡eth0
sudo iftop -i eth0 -n # -n:不解析主機名,速度更快
假設發現 “IP=198.51.100.200” 持續占用 80Mbps 帶寬,且端口為 80(HTTP)。
步驟 2:用 netstat 找到對應進程
\# 查與198.51.100.200的80端口連接對應的進程
sudo netstat -tlnp | grep :80
\# 輸出:tcp 0 0 0.0.0.0:80 0.0.0.0:\* LISTEN 4567/nginx
\# 解讀:Nginx進程(PID=4567)處理80端口連接,198.51.100.200可能是爬蟲或異??蛻舳?
步驟 3:分析 Nginx 日志,確認是否為異常訪問
\# 查看Nginx訪問日志(假設日志路徑為/var/log/nginx/access.log)
sudo grep "198.51.100.200" /var/log/nginx/access.log | wc -l
\# 輸出:10000(1分鐘內有1萬次請求,遠超正常用戶,判定為惡意爬蟲)
步驟 4:處理異常訪問(封禁 IP)
\# 用iptables封禁198.51.100.200
sudo iptables -A INPUT -s 198.51.100.200 -j DROP
\# 驗證:iftop中該IP的帶寬占用降為0,服務器帶寬恢復正常
實戰 3:排查 “Tomcat 端口被占用” 問題
場景:啟動 Tomcat 時提示 “Failed to start connector [Connector [HTTP/1.1-8080]]: Address already in use”,需解決端口占用。
步驟 1:用 lsof 找到占用 8080 端口的進程
sudo lsof -i :8080
\# 輸出:COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
\# java 7890 ubuntu 42u IPv6 56789 0t0 TCP \*:http-alt (LISTEN)
\# 解讀:PID=7890的java進程占用8080端口(可能是殘留的Tomcat進程)
步驟 2:關閉占用進程(優先正常關閉,再強制關閉)
\# 1. 嘗試正常關閉(發送15信號,讓進程保存數據后退出)
sudo kill 7890
\# 2. 等待3秒,驗證端口是否釋放
sudo lsof -i :8080 # 若仍有輸出,執行強制關閉
\# 3. 強制關閉(發送9信號,立即終止,慎用!)
sudo kill -9 7890
步驟 3:驗證端口釋放,重啟 Tomcat
\# 確認8080端口已釋放
sudo lsof -i :8080 # 無輸出,說明端口釋放
\# 重啟Tomcat
sudo /usr/local/tomcat/bin/startup.sh
\# 驗證:訪問http://localhost:8080,能正常顯示Tomcat頁面
四、進階技巧:保存規則與抓包分析
1. 技巧 1:保存 iptables 規則(避免重啟丟失)
不同 Linux 發行版的規則保存路徑不同,需針對性操作:
| 系統類型 | 保存命令 | 恢復命令 | 配置文件路徑 |
|---|---|---|---|
| CentOS/RHEL | sudo iptables-save > /etc/sysconfig/iptables |
sudo iptables-restore < /etc/sysconfig/iptables |
/etc/sysconfig/iptables |
| Ubuntu/Debian | sudo iptables-save > /etc/iptables/rules.v4 |
sudo iptables-restore < /etc/iptables/rules.v4 |
/etc/iptables/rules.v4 |
自動化建議:寫定時任務(crontab)每小時保存一次規則,避免意外重啟丟失:
\# 添加定時任務
sudo crontab -e
\# 添加一行:0 \* \* \* \* /usr/sbin/iptables-save > /etc/sysconfig/iptables # 每小時保存一次(CentOS)
2. 技巧 2:用 tcpdump 抓包分析異常網絡請求
當遇到 “客戶端訪問服務超時,但端口通”“頻繁出現 RST 包” 等問題時,用 tcpdump 抓包分析數據包內容,定位異常原因。
(1)基礎用法:抓 80 端口的 HTTP 請求
\# 安裝tcpdump
sudo apt install tcpdump -y # Ubuntu
sudo dnf install tcpdump -y # CentOS
\# 抓eth0網卡上80端口的TCP請求,保存到文件(便于后續分析)
sudo tcpdump -i eth0 -n tcp port 80 -w http.pcap
\# 選項解讀:
\# -i eth0:監控eth0網卡;
\# -n:不解析IP和端口名;
\# tcp port 80:只抓TCP的80端口;
\# -w http.pcap:保存到http.pcap文件(用Wireshark打開分析)
(2)分析異常請求(如 SYN Flood 攻擊)
SYN Flood 攻擊會發送大量 SYN 包(建立連接請求),但不回復 ACK,導致服務器連接隊列滿,無法處理正常請求。抓包驗證:
\# 抓SYN包,統計數量
sudo tcpdump -i eth0 -n tcp port 80 and 'tcp\[tcpflags] & tcp-syn != 0' | wc -l
\# 輸出:5000(10秒內有5000個SYN包,遠超正常,判定為SYN Flood)
\# 處理:開啟iptables的SYN Cookies防護(echo 1 > /proc/sys/net/ipv4/tcp\_syncookies)
五、避坑指南:3 個常見網絡管理誤區
1. 避坑 1:iptables 規則順序錯誤(先拒絕后允許)
誤區:先配置 “拒絕所有” 規則,再配置 “允許 80 端口”,導致 80 端口也被拒絕。
原理:iptables 規則按順序執行,匹配到第一條規則后不再執行后續規則。
正確順序:先允許 “回環網卡、已建立連接、特定端口”,最后配置默認拒絕:
\# 正確順序示例
sudo iptables -A INPUT -i lo -j ACCEPT # 先允許回環
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 再允許已建立連接
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT # 再允許80端口
sudo iptables -P INPUT DROP # 最后默認拒絕
2. 避坑 2:netstat 提示 “command not found”
誤區:直接執行netstat -tlnp,提示命令不存在,誤以為系統故障。
原因:新系統(如 CentOS 8、Ubuntu 20.04)默認不安裝 net-tools 包(netstat 屬于該包)。
解決:安裝 net-tools 或用 ss 命令(替代 netstat,系統自帶):
\# 方法1:安裝net-tools
sudo dnf install net-tools -y
\# 方法2:用ss命令(功能類似netstat)
sudo ss -tlnp | grep 8080 # 查8080端口占用
3. 避坑 3:同時啟用 iptables 和 nftables
誤區:認為 “多一層防火墻更安全”,同時啟用 iptables 和 nftables。
后果:兩者規則沖突,導致部分流量被錯誤過濾(如 iptables 允許 80 端口,nftables 拒絕 80 端口,最終 80 端口無法訪問)。
解決:二選一,新系統優先用 nftables,老系統用 iptables,禁用另一個:
\# 禁用iptables(CentOS)
sudo systemctl stop iptables
sudo systemctl disable iptables
\# 啟用nftables
sudo systemctl start nftables
sudo systemctl enable nftables
總結:網絡管理進階的 “核心能力鏈”
-
防火墻管控:用 iptables/nftables 實現 “端口過濾(防非法訪問)、SNAT(內網共享上網)、DNAT(端口轉發)”,構建服務器安全邊界;
-
流量監控:iftop 定位 “誰占帶寬”,nload 看 “整體流量趨勢”,netstat/lsof 查 “端口占用”,快速定位異常;
-
問題解決:端口轉發靠 DNAT,帶寬跑滿靠 “iftop+iptables 封禁”,端口占用靠 “lsof+kill”,抓包分析靠 tcpdump;
-
避坑關鍵:規則順序 “先允許后拒絕”,工具缺失補安裝,防火墻二選一不沖突。
掌握這些能力,你就能應對企業服務器的大部分網絡問題 —— 從 “被動排查” 變成 “主動管控”,讓服務器網絡既安全又高效。

浙公網安備 33010602011771號