一篇文章搞懂 iptables

語言: CN / TW / HK

1. 什麼是 iptables

netfilter/iptables 一般指 Linux 自帶的包過濾防火牆,有兩個元件: - netfilter : 屬於 核心空間 的防火牆管理體系,是核心的一部分,一般不以 程式檔案 的形式存在,由一些資訊包過濾表組成,這些表包含核心用來控制資訊包過濾處理的規則集。 - iptables : 屬於 使用者空間 的防火牆管理體系,位於 /sbin/iptables 目錄下,用來管理 Linux 防火牆的命令程式。

2. 四表五鏈

總體說來,iptables是由 四表五鏈 組成。

table.png

四表 分別是 - raw : 主要用來決定是否對資料包進行狀態跟蹤,包括的規則鏈有:outputprerouting。 - mangle : 主要用來修改資料包的服務型別,生存週期,為資料包設定標記,實現流量整形、策略路由等,包括的規則鏈有:inputoutputforwardpreroutingpostrouting。 - nat : 用於網路地址轉換(IP、埠),包括的規則鏈有:preroutingpostroutingoutput。 - filter : 用於過濾資料包,包括的規則鏈有:inputoutputforward

優先順序:raw→mangle→nat→filter

五鏈 分別是

  • input:當收到訪問防火牆本機地址的資料包時,將應用此鏈中的規則。
  • output:當防火牆本機向外傳送資料包時,將應用此鏈中的規則。
  • forward:當收到需要通過防火中轉發給其他地址的資料包時,將應用此鏈中的規則。
  • prerouting:在對資料包做路由選擇之前,將應用此鏈中的規則。
  • postrouting:在對資料包做路由選擇之後,將應用此鏈中的規則。

3. 資料包過濾的匹配流程

  • 入站資料流向 : 從外界到達防火牆的資料包,要先被 prerouting 鏈處理 (是否修改資料包地址等)。之後,會進行路由選擇,確認資料包的目標地址是否是防火牆本機。如果是,將傳給 INPUT 鏈進行處理 (決定是否允許通過等),通過以後再交給應用服務程式(比如 nginx)進行響應。
  • 轉發資料流向 : 從外界到達防火牆的資料包,要先被 prerouting 鏈處理。之後,會進行路由選擇,資料包的目標地址是其他非本機的地址時,將傳給 forward 鏈進行處理 (是否轉發或攔截),最後將交給postrouting 鏈行處理 (是否修改資料包的資訊等)。
  • 出站資料流向 : 防火牆本機向外部地址傳送的資料包,首先被output 鏈處理,然後在 postrouting 鏈查進行處理(是否修改資料包的資訊等)。

1652346145(1).png

4. 規則鏈內部的匹配原則

  • 按照第一條規則、第二條規則……的順序進行匹配和處理。
  • 按照 匹配到停止的方式,如找到一條匹配的規則,將不再執行本鏈中後續的其他規則。
  • 如果對比整個鏈也找不到匹配的規則時,將按照該規則鏈的預設策略進行處理。

5. 規則編寫

image.png

iptables [-t 表名] 管理選項 [鏈名] [匹配條件] [-j 控制型別]

  • 表名 : 指定命令所操作的表,未指定表名時將預設使用filter
  • 管理選項 : 表示規則的操作方式,比如:插入增加刪除檢視
  • 鏈名 : 指定命令所操作的鏈
  • 匹配條件:指定要處理的資料包的特徵,不符合指定條件的資料包不在處理;
  • 控制型別:指資料包的處理方式,比如:允許拒絕丟棄等;

管理選項

選 項 | 功 能 | | --- | ------------ | | -A | 新增防火牆規則 | | -D | 刪除防火牆規則 | | -I | 插入防火牆規則 | | -N | 新建(new-chain)一條使用者自己定義的規則鏈 | | -F | 清空防火牆規則 | | -L | 列出新增防火牆規則 | | -R | 替換防火牆規則 | | -E | 重新命名使用者定義的鏈,不改變鏈本身 | | -Z | 清空防火牆資料表統計資訊 | | -X | 刪除指定表中使用者自定義的規則鏈(delete-chain) | | -P | 設定鏈預設規則 | | -c | 檢視規則表詳細資訊(verbose)的資訊 | | -n | 使用數字形式(numeric)顯示輸出結果 | | --line-numbers | 顯示規則在鏈中的順序號 |

匹配條件

image.png

其他匹配方式

| 匹 配 方 式 | 選 項 示 例 | | ---------- | ------------------ | | 多埠匹配 | -m multiport --dports <埠列表>
-m multiport --sports <埠列表> | | IP 範圍匹配 | -m iprange --src-range
-m iprange --dst-range | | MAC 地址匹配 | -m mac --mac-source | | 狀態匹配 | -m conntrack --ctstate <連線狀態> | | ipset 匹配 | -p tcp -m set --match-set dst -j REDIRECT --to-port |

控制型別

| 觸發動作 | 功 能 | | ---------- | ------------------ | | ACCEPT | 允許資料包通過 | | DROP | 丟棄資料包,且不給任何迴應資訊 | | REJECT | 拒絕資料包,必要時會給資料傳送端一個響應資訊 | | LOG | 在/var/log/messages檔案中記錄日誌資訊,然後將資料包傳遞給下一個地址 | | DNAT | 目標地址轉換 | | SNAT | 源地址轉換 | | MASQUERADE | 地址欺騙 | | REDIRECT | 重定向

6. 實際案例

  • 檢視規則列表(預設 filter 表), iptables -L --line-numbers
  • 清空所有規則(預設 filter 表), iptables -F
  • 內網(192.168.0.0/16) 開放 22/tcp, iptables -t filter -A INPUT -p tcp -s 192.168.0.0/16 --dport 22 -j ACCEPT
  • 替換規則 iptables -t filter -R INPUT 1 -s 192.168.0.0/16 -j ACCEPT
  • 設定預設策略 DROP (謹慎設定!!!) sh iptables -P INPUT DROP iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # 放行已建立的連結
  • 設定 ipset DNAT sh iptables -t nat -I PREROUTING -p tcp -m set --match-set vpn dst -j REDIRECT --to-port 1080 iptables -t nat -I PREROUTING -p udp -m set --match-set vpn dst -j REDIRECT --to-port 1080

其他

  • 啟動服務, systemctl start iptables
  • 配置檔案位置, /etc/sysconfig/iptables
  • 批量匯出 Linux 防火牆規則, iptables-save > 檔名稱
  • 批量匯入 Linux 防火牆規則, iptables-restore < 檔名稱

其他參考文章: