一篇文章搞懂 iptables
1. 什麼是 iptables
netfilter/iptables
一般指 Linux 自帶的包過濾防火牆,有兩個元件:
- netfilter
: 屬於 核心空間 的防火牆管理體系,是核心的一部分,一般不以 程式 或 檔案 的形式存在,由一些資訊包過濾表組成,這些表包含核心用來控制資訊包過濾處理的規則集。
- iptables
: 屬於 使用者空間 的防火牆管理體系,位於 /sbin/iptables
目錄下,用來管理 Linux 防火牆的命令程式。
2. 四表五鏈
總體說來,iptables是由 四表五鏈 組成。
四表 分別是
- raw : 主要用來決定是否對資料包進行狀態跟蹤,包括的規則鏈有:output
、prerouting
。
- mangle : 主要用來修改資料包的服務型別,生存週期,為資料包設定標記,實現流量整形、策略路由等,包括的規則鏈有:input
,output
、 forward
,prerouting
,postrouting
。
- nat : 用於網路地址轉換(IP、埠),包括的規則鏈有:prerouting
,postrouting
和 output
。
- filter : 用於過濾資料包,包括的規則鏈有:input
,output
和forward
。
優先順序:raw→mangle→nat→filter
五鏈 分別是
input
:當收到訪問防火牆本機地址的資料包時,將應用此鏈中的規則。output
:當防火牆本機向外傳送資料包時,將應用此鏈中的規則。forward
:當收到需要通過防火中轉發給其他地址的資料包時,將應用此鏈中的規則。prerouting
:在對資料包做路由選擇之前,將應用此鏈中的規則。postrouting
:在對資料包做路由選擇之後,將應用此鏈中的規則。
3. 資料包過濾的匹配流程
入站資料流向
: 從外界到達防火牆的資料包,要先被prerouting
鏈處理 (是否修改資料包地址等)。之後,會進行路由選擇,確認資料包的目標地址是否是防火牆本機。如果是,將傳給INPUT
鏈進行處理 (決定是否允許通過等),通過以後再交給應用服務程式(比如 nginx)進行響應。轉發資料流向
: 從外界到達防火牆的資料包,要先被prerouting
鏈處理。之後,會進行路由選擇,資料包的目標地址是其他非本機的地址時,將傳給forward
鏈進行處理 (是否轉發或攔截),最後將交給postrouting
鏈行處理 (是否修改資料包的資訊等)。出站資料流向
: 防火牆本機向外部地址傳送的資料包,首先被output
鏈處理,然後在postrouting
鏈查進行處理(是否修改資料包的資訊等)。
4. 規則鏈內部的匹配原則
- 按照第一條規則、第二條規則……的順序進行匹配和處理。
- 按照
匹配到停止
的方式,如找到一條匹配的規則,將不再執行本鏈中後續的其他規則。 - 如果對比整個鏈也
找不到匹配的規則
時,將按照該規則鏈的預設策略進行處理。
5. 規則編寫
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 | 顯示規則在鏈中的順序號 |
匹配條件
其他匹配方式
| 匹 配 方 式 | 選 項 示 例 |
| ---------- | ------------------ |
| 多埠匹配 | -m multiport --dports <埠列表>
-m multiport --sports <埠列表> |
| IP 範圍匹配 | -m iprange --src-range
-m iprange --dst-range
控制型別
| 觸發動作 | 功 能 |
| ---------- | ------------------ |
| 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 < 檔名稱