# iptables 防火牆完整教程
# iptables 是什麼?
iptables 是 Linux 內核中用於設置、維護和檢查 IP 包過濾規則的工具。它允許系統管理員定義哪些網路流量應該被允許或阻止,是構建企業防火牆的基礎。
三個核心概念:
表(Table):按功能分類的規則集合
filter :過濾表(默認,用於決定是否接受數據包)nat :網路地址轉換表(用於修改數據包的源地址或目標地址)mangle :修改表(用於修改數據包的服務質量等標記)raw :原始表(用於定義不被跟蹤的連接)
鏈(Chain):規則的有序列表,代表數據包的不同處理階段
INPUT :入站流量(從外部進入本機的數據包)OUTPUT :出站流量(從本機發往外部的數據包)FORWARD :轉發流量(經過本機轉發給其他主機的數據包)PREROUTING :路由前(nat 表特有)POSTROUTING :路由後(nat 表特有)
規則(Rule):匹配條件和相應動作
ACCEPT :允許通過DROP :丟棄(不回應)REJECT :拒絕(回應拒絕信息)REDIRECT :轉向LOG :記錄
# 基本操作
# 查看規則
| |
| iptables -nL |
| |
| |
| iptables -t nat -nL |
| iptables -t mangle -nL |
| |
| |
| iptables -nL --line-number |
| |
| |
| iptables -nvL |
| iptables -nvL -t nat |
| |
| |
| iptables -nL INPUT |
| iptables -nL FORWARD |
# 添加和刪除規則
| |
| iptables -A INPUT -p tcp --dport 22 -j ACCEPT |
| |
| |
| iptables -I INPUT 2 -p tcp --dport 80 -j ACCEPT |
| |
| |
| iptables -R INPUT 3 -p tcp --dport 443 -j ACCEPT |
| |
| |
| iptables -D INPUT 3 |
| |
| |
| iptables -D INPUT -p tcp --dport 22 -j ACCEPT |
# 清除規則
| |
| iptables -F |
| |
| |
| iptables -F INPUT |
| |
| |
| iptables -t nat -F |
| |
| |
| iptables -X |
| |
| |
| iptables -Z |
# 常用參數說明
| |
| -s, --source |
| -d, --destination |
| -p, --protocol |
| -i, --in-interface |
| -o, --out-interface |
| |
| |
| --sport |
| --dport |
| -m multiport |
| |
| |
| -j, --jump |
| -m, --match |
# 實際應用場景
# 場景 1:允許 SSH 訪問和 HTTP/HTTPS 服務
| |
| iptables -P INPUT DROP |
| iptables -P FORWARD DROP |
| iptables -P OUTPUT ACCEPT |
| |
| |
| iptables -A INPUT -i lo -j ACCEPT |
| |
| |
| iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT |
| |
| |
| iptables -A INPUT -p tcp --dport 22 -j ACCEPT |
| |
| |
| iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT |
| |
| |
| iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT |
# 場景 2:限制特定 IP 訪問
| |
| iptables -A INPUT -s 192.168.100.50 -j DROP |
| |
| |
| iptables -I INPUT -p tcp --dport 22 -s 10.0.0.0/8 -j ACCEPT |
| iptables -A INPUT -p tcp --dport 22 -j DROP |
# 場景 3:端口映射
| |
| iptables -t nat -A PREROUTING -p tcp --dport 8080 -j REDIRECT --to-port 80 |
| |
| |
| iptables -t nat -nL |
# 場景 4:日誌記錄與故障排查
| |
| iptables -A INPUT -p tcp -j LOG --log-prefix "Rejected-TCP: " |
| iptables -A INPUT -p tcp -j DROP |
| |
| |
| iptables -A INPUT -p icmp -j LOG --log-prefix "ICMP-Packet: " |
| |
| |
| tail -f /var/log/syslog | grep Rejected |
# 規則持久化
# 方式 1:導出和導入(推薦)
| |
| iptables-save > /etc/iptables/rules.v4 |
| |
| |
| iptables-restore < /etc/iptables/rules.v4 |
| |
| |
| apt-get install iptables-persistent |
| netfilter-persistent save |
| netfilter-persistent reload |
# 方式 2:創建啟動腳本
在 /etc/init.d/iptables-setup 中添加:
| #!/bin/bash |
| |
| |
| case "$1" in |
| start) |
| iptables-restore < /etc/iptables/rules.v4 |
| echo "iptables rules loaded" |
| ;; |
| stop) |
| iptables -F |
| echo "iptables rules flushed" |
| ;; |
| esac |
然後:
| chmod +x /etc/init.d/iptables-setup |
| update-rc.d iptables-setup defaults |
# 常見錯誤和排查
# 無法連接到服務
| |
| iptables -nL | grep 80 |
| |
| |
| iptables -nvL --line-number |
| |
| |
| iptables -nvL | head -5 |
# 性能問題
- 大規則集時,使用狀態跟蹤可能影響性能
- 考慮使用 UFW(Ubuntu)或 firewalld(CentOS)作為簡化層
# 排查連接故障
| |
| iptables -P INPUT ACCEPT |
| iptables -P FORWARD ACCEPT |
| iptables -P OUTPUT ACCEPT |
| |
| |
# 總結
iptables 雖然學習曲線陡峭,但掌握基本概念後非常強大。建議:
- 從簡單的允許清單開始(允許必要服務,其他拒絕)
- 充分測試規則後再持久化
- 在生產環境前備份工作配置
- 對複雜場景,可考慮使用 UFW 或 firewalld 簡化管理