# 搞懂 Linux Iptables


# 基礎知識


# 封包處理規則

  • INPUT 從網卡 進入 的封包
  • OUTPUT 從網卡 出去 的封包
  • FORWARD 從網卡 進去再轉送 的封包
  • PREROUTING 改變網卡 進入 的封包 (DNAT/REDIRECT)
  • POSTROUTING 改變網卡 出去 的封包 (SNAT/MASQUERADE)

# 過濾規則鍊

  • filter 是預設的規則鍊,可處理 INPUT/OUPTUT/FORWARD
  • nat 可以處理 OUTPUT/PREROUTING/POSTROUTING
  • mangle 可以處理 INPUT/OUTPUT/FORWARD/PREROUTING/POSTROUTING

# 封包狀態

  • NEW 一個新的連線封包
  • ESTABLISHED 成功建立的連線
  • RELATED 新建連線,透過 ESTALBLISHED session 所建立的獨立連線
  • INVALID 非法連線狀態封包 (DROP 封包)
  • UNKNOWN 未知連線狀態封包

# 封包處理政策與目標

  • ACCEPT 允許
  • DROP 丟棄 不回應要求 不傳送失敗訊息
  • REJECT 拒絕 會回應要求 傳送失敗訊息
  • SNAT 修改來源 Socket
  • DNAT 修改目標 Socket
  • MASQUERADE 動態修改來源 Socket 無法指定 IP 取網卡當下的 IP
  • REDIRECT 將連線導向本機 Process
  • RETURN 結束自定義鍊返回至原本的鍊
  • QUEUE 封包排隊等待處理
  • LOG 技術特定的規則封包

# 指令總表


# iptables 規則指令

  • -h 幫助手冊
  • -V 顯示 iptables 當前版本
  • -I 將該規則插入至最前面,也可以後面加入編號到指定位置
  • -A 將規則加入到最後面
  • -R 取代指定規則 要給予原先規則編號
  • -D 刪除指定規則 要給予原先規則編號
  • -F 刪除所有規則

# iptables 規則鍊參數

  • -N 建立新規則鍊
  • -X 刪除指定規則鍊
  • -E 更改指定規則鍊名稱
  • -P 更改指定規則鍊的政策
  • -Z 將 iptables counter 歸零

# 其餘參數

  • -L 列出 iptables 規則 使用 DNS 解析
  • -n 不使用 DNS 解析
  • -v 顯示目前 iptables 規則處理封包數量
  • -x 顯示完整封包數量

# 操作規則用參數

  • -i 輸入網路介面 像是 eth0
  • -o 輸出網路介面 像是 eth0
  • -m 模組
  • -p 通訊協定
  • -s 來源 IP 網段 網域
  • –sport 封包來源 port,port range
  • -d 目的 IP 網段 網域
  • –dport 封包目的 port,port range
  • -j 政策 / 目標 ACCEPT/DROP/REJECT 等

# 查看


# 轉發


# 本地 port 轉發

假設要把本地端的 7777 轉發到 6666

1
2
iptables -t nat -A PREROUTING -p tcp --dport 7777 -j REDIRECT --to-port 6666


# 遠端 port 轉發

假設要從本機 6666 port 轉發到 192.168.1.8 的 7777 port

1
2
3
sysctl -w net.ipv4.ip_forward=1 # 如果 /etc/sysctl.conf 已經設定過就不需要再輸入了
iptables -t nat -A PREROUTING -p tcp --dport 6666 -j DNAT --to-destination 192.168.1.8:7777
iptables -t nat -A POSTROUTING -p tcp -d 192.168.1.8 --dport 7777 -j SNAT --to-source 192.168.1.168

# SSH 轉發

將本機的 2210 port 轉發到 192.168.100.218 的 ssh port
這樣外部就可以透過 本機固定 IP 的 2210 port 連線到 LAN 裡面的電腦了

1
iptables -t nat -A PREROUTING -p tcp --dport 2210 -j DNAT --to 192.168.100.218:22

# 刪除 port 轉發

1
2
3
iptables -t nat -nL --line # 刪除所有規則
iptables -t nat -D PREROUTING 1 # 刪除編號 1 的規則
iptables -t nat -D PREROUTING -p tcp --dport 2210 -j DNAT --to 192.168.100.218:22 # 刪除指定規則

# 刷新


# 刷新 Iptables

1
iptables -F

# 刷新 Iptables 附加鍊

1
iptables -F [鍊名稱]

就會刷新 [鍊名稱] 內的所有規則


# 刷新 Iptables 特定資源

刷新 NAT 表

1
iptables -t nat -F

# 直接操作 iptables 服務

1
2
3
4
5
iptables start # 啟動
iptables stop # 停止
iptables restart # 重新啟動
iptables status # 查看規則
iptables save # 儲存規則

# 參考資料

  • 如何刷新 iptables 并清除防火墙规则
  • SSH 转发和 iptables 端口转发
  • IPTables - Linux 的防火牆