iptables 指南
iptables 是 Linux 核心整合的防火牆系統, 幾乎所有 Linux 發行版都會內建 iptables。
iptables 對進出的 IP 資料報進行處理和過濾, 過濾規則(rule)儲存在4個表(table)中, 表中的規則又組成了數條完整的規則鏈(chain)。
iptables 可以追蹤資料包所屬的連線(TCP/UCP/ICMP協議)及其狀態,允許根據連線狀態進行處理和過濾。
表與規則鏈
iptables 中有四張表, 優先順序從高到低是:
- raw: 某個鏈上一旦使用了raw表將會跳過 NAT 和連線跟蹤處理。
- mangle: 用於修改資料包的內容
- nat: 用於網路地址轉換,可以修改資料包的源地址或目標地址
- filter: iptables 的預設表, 可以拋棄或接受資料包
表中的規則構成了鏈:
-
PREROUTING: 來自網路介面(網絡卡)的資料包首先會經過 PREROUTING 鏈,經過 raw, mangle, nat 表中規則的處理然後進行路由判斷。
- 若資料包的目的地址為本機則會進入INPUT鏈
- 若資料包的目的地址為其它地址則進入FORWARD鏈進行轉發
- INPUT: 處理目標為本機的資料包, 經過 mangle,filter 表中規則的處理然後發給 nginx、mysql等上層程序處理 (此處存疑: nat 表中似乎也包括INPUT鏈, 望大佬指正)
- FORWARD: 處理轉發的資料包,經過 mangle, filter 表中規則處理後進入POSTROUTING鏈
- OUTPUT: 處理本地程序發出的資料包, 經過 raw, mangle, nat, filter 表中規則的處理然後進入POSTROUTING鏈
- POSTROUTING: 處理來自 FORWARD 和 OUTPUT 鏈的資料包併發送給網路介面發出,可在 raw, mangle, nat 表中配置規則
在執行中 iptables 可能處理三種場景:
- 入站資料流: 網路介面 -> PREROUTING -> INPUT -> 本地
- 轉發資料流: 網路介面 -> PREROUTING -> FORWARD -> POSTROUTING -> 網路介面
- 出站資料流: 本地 -> OUTPUT -> POSTROUTING -> 網路介面
雖然我們通常將 iptables 視為單個實體, 但實際上它由兩部分組成: 執行資料包過濾處理的核心模組 netfilter 和運行於使用者空間的過濾規則配置工具 iptables。
連線跟蹤
iptables 是有狀態的防火牆,使用 ip_conntrack 模組進行連線跟蹤。ip_conntrack 可以實時追蹤本機的 ICMP/TCP/UDP 流並儲存在記憶體中。
根據資料包在連線中的角色,將資料包分為四種狀態:
- NEW: 連線的第一個包比如TCP的SYN包
- ESTABLISHED: 只要連線被回覆那麼連線的狀態就是 ESTABLISHED, 比如TCP中第一個回答 ACK/SYN 包
- RELATED: 當包和某個 ESTABLISHED 狀態有關係時即處於 RELATED 狀態。 比如 FTP-Data 會被標記為與 FTP-control 有關。
- INVALID: 無法識別包所屬的連線或沒有任何狀態,通常會丟棄這些包
連線追蹤允許我們根據包的連線狀態進行過濾。比如我們只允許本地 80 埠的 HTTP 伺服器進行響應而不允許通過 80 埠主動向外請求,那麼在本地 80 埠的出方向上只允許 ESTABLISHED 狀態的包不允許 NEW 狀態資料包即可。(通常情況下 HTTP 伺服器程序是可以主動向外請求的,但是本地地址不會是 80 埠)
入站資料流和轉發資料流是在 PREROUTING 鏈中進行連線追蹤的(即標記所屬連線和狀態), 出站資料流在 OUTPUT 鏈中進行狀態追蹤。使用 RAW 表可以配置資料流繞過狀態追蹤。
配置規則
iptables -h
可以檢視 iptables 自帶的幫助手冊。
我們將 iptables 命令分解為幾部分:
iptables -t <table> <cmd> <pattern> <action>
-t <table>
或--table <table>
選項用來指定要檢視或修改的表(raw, mangle, nat, filter)。
常用的 iptables 命令選項(上文中的<cmd>
部分)包括:
-
-L <chain>
/--list <chain>
: 列出某條規則鏈中所有規則, 不指定chain
引數則列出指定表中所有鏈上的規則。iptables 會按照列出的順序依次嘗試匹配規則並執行匹配的動作。規則可用鏈上的序號來描述,第一條規則的序號為1(不是程式語言常見的0)。-
-L -V
/-L --verbose
會顯示更詳細的內容
-
-
-A <chain>
/--append <chain>
: 在規則鏈的末尾新增規則, 規則的內容由後面的匹配選項<pattern>
和動作<action>
兩部分來描述 -
-I <chain> <index>
/--insert <chain> <index>
: 在規則鏈的指定位置插入規則。-i INPUT 2
會在INPUT鏈第2個位置插入一條規則,原第2條及以後的規則均後移一位 -
- R <chain> <index> /
/--replace <chain> <index>
: 替換規則鏈指定位置上的規則 -
-D <chain>
/--delete <chain>
: 刪除鏈上某條規則,可以使用序號指定某條規則或者使用匹配和動作完整描述規則進行刪除 -
-F <chain>
/--flush <chain>
: 刪除鏈上的全部規則 -
-P <chain> <action>
/--policy <chain> <action>
: 修改某條鏈的預設策略, 示例iptables -P filter ACCEPT
iptables 的規則(<pattern>
)包含匹配條件和動作兩部分。可以根據網路介面、地址、協議等進行匹配:
-
-i
/--in-interface
: 進入的網路介面,如乙太網eth, 本地迴環lo。 -
-o
/--out-interface
: 輸出的網路介面 -
-s
/--source
: 輸入IP地址, 格式為address[/mask]
, 如192.168.1.1
,192.168.1.0/24
-
-d
/--destination
: 目標IP地址 -
-p
/---proto
: 協議型別, 包括TCP/UCP/ICMP等 -
--sport
: 源埠號 -
--dport
: 目標埠號 -
–-state
: 連線跟蹤狀態, 需要-m state
啟動連線跟蹤模組。示例:--state NEW,ESTABLISHED
ifconfig
命令可以檢視本機可用的網路介面
iptables 常用規則的動作(<action>
)包括:
- ACCEPT: 允許資料包通過,進入下一條規則
-
REJECT: 攔截資料包併發送回執資料包通知傳送方,可用的回執有:
ICMP port-unreachable
,ICMP echo-reply
,tcp-reset
示例:iptables -AINPUT -p TCP --dport 22 -j REJECT --reject-with tcp-reset
拒絕22埠的tcp連線 - DROP: 丟棄資料包不返回回執,不繼續執行過濾
-
SNAT: 源地址轉換(Source Network Address Translation), 將包的源地址改寫為指定地址。完成此動作後將直接跳往下一條規則鏈(如POSTROUTING)
示例:iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -j SNAT --to-source 192.168.1.1-192.168.1.100:2000-3000
連線跟蹤功能會使連線後續的應答資料包送達傳送者 -
MASQUERADE: 將資料包的源地址改寫為防火牆的地址但可以指定埠號, 與SNAT相比更適合防火牆工作在 DHCP 等動態地址網路環境中的情況。完成此動作後將直接跳往下一條規則鏈(如POSTROUTING)
示例:iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -j MASQUERADE --to-ports 2000-3000
-
DNAT: 目的地址轉換, 將包目的地址改寫到指定地址,完成此動作後將直接跳往下一條規則鏈。此功能可以為其它服務進行反向代理
示例:iptables -t nat -A PREROUTING -s 192.168.1.10 --sport 80 -j DNAT --to-destination 192.168.1.11:80
-
REDIRECT: 重定向到另一個埠,可以為本地服務提供反向代理
示例:iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
將對本地80埠的資料包重定向到8080 - MIRROR: 回聲, 將源地址與目的地址對換位置後傳送給原發送者
儲存規則
iptables 命令修改後規則只存在於記憶體中, 使用service iptables save
儲存規則到配置檔案。
預設配置檔案地址一般為/etc/sysconfig/iptables
。
修改/etc/sysconfig/iptables-config
中的配置項:
IPTABLES_SAVE_ON_STOP=yes
在 iptables 服務停止時儲存規則。
iptables-save
iptables -L
只能逐表檢視規則,iptables-save
命令將 netfilter 核心模組中的規則匯出到標準輸出。
我們可以使用 iptables-save 檢視所有規則, 或將其備份到檔案中。
iptables-save 命令執行讀取操作,不會更改 iptables 配置請放心使用。
iptables-save -t <table>
僅匯出指定表的內容。
iptables-save -c
將會匯出位元組計數器和包計數器的值。
示例
檢視規則:
iptables -L iptables -t nat -L iptables -t nat -L PREROUTING
攔截特定流量:
iptables -t filter -A INPUT -s 11.11.11.11 -j DROP iptables -t filter -D INPUT -s 11.11.11.11 -j DROP iptables -t filter -A INPUT -p tcp -sport 445 -j DROP iptables -t filter -A INPUT -p icmp --icmp-type echo-request -j REJECT ---reject-with icmp-host-prohibited iptables -t filter -A OUTPUT -p tcp --dport 80 -m state --state NEW -j DROP
作為閘道器提供NAT服務:
iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -j SNAT --to-source 192.168.1.1 iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -j MASQUERADE iptables -t nat -A PREROUTING -d 192.168.1.1/24 --dport 80 -j DNAT --to-destination 192.168.1.11:80 iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080