Iptables guide

iptables 被許多服務廣泛的運用著, 例如 Docker, Kubernetes 都是基於 iptables 來管理網路封包的處理, 所以此篇來研究 iptables 工具, 看看這些服務底層究竟在幹些什麼事.

Linux 核心 Netfilter 模組提供了網路的框架, 用於管理 Linux 主機的封包, 包括了過濾封包NATPort 轉發. 而 Linux 系統上有許多軟體是基於 Netfilter 模組實作網路管理介面, 例如 firewalld、ntw、iptables、nftables.

iptables and ip6tables 分別為 IPv4 and IPv6, 組成包括了 ChainTargetTableMatch, 而規則方面有 PREROUTINGINPUTFORWARDOUTPUTPOSTROUTIONG.

Packet flow

引用 wiki netfilter packet flow 的圖, 可以看到封包在主機中的流量.

Tables 與 chain

下面列出 tables 內建 chain 關係

PREROUTINGINPUTFORWARDOUTPUTPOSTROUTIONG
rawoxxox
mangleooooo
natoxxoo
filterxooox

Tables

優先層級為 raw -> mangle -> nat -> filter.

  • raw: 於處理異常(優先層級最高).
  • mangle: 提供改寫封包的功能.
  • nat(network address translation): IP 轉發; port 轉發.
  • filter: 封包過濾 (此為預設表).

Chain

  • PREROUTING: 數據包進入路由表之前.
  • INPUT: 通過路由表後目的地為本機.
  • FORWARD: 通過路由表後, 目的地不為本機.
  • OUTPUT: 由本機產生, 向外轉發.
  • POSTROUTIONG: 發送到網卡接口之前.

State

  • NEW: 一個新的連線封包 (建立新連線後的第一個封包).
  • ESTABLISHED: 成功建立的連線, 即建立追蹤連線後所有封包狀態 (跟在 NEW 封包後面的所有封包).
  • RELATED: 新建連線,由 ESTABLISHED session 所建立的新獨立連線 (ex. ftp-data 連線).
  • INVALID: 非法連線狀態的封包 (DROP 封包).
  • UNKOWN: 不明連線狀態的封包.

Policy and target

  • ACCEPT: 允許封包移動至目的地或另一個 chain.
  • DROP: 丟棄封包,不回應要求,不傳送失敗訊息.
  • REJECT: 拒絕封包,回應要求,傳送失敗訊息.
  • SNAT: 修改 Source Socket.
  • DNAT: 修改 Destination Socket.
  • MASQUERADE: 動態修改 Source Socket (無法指定 IP,取當時網卡的 IP),較方便但效率較差.
  • REDIRECT: 將連線導至本機行程 (Local Process).
  • RETURN: 結束自行定義的 Chain 然後返回原來的 Chain 繼續跑規則 (rules).
  • QUEUE: 封包排隊等待處理.
  • LOG: 記錄指定的規則封包 (/etc/syslog.conf , default /var/log/messges).

iptables 輸出格式說明

下面指令可以列出表 filter 的規則清單, 可以看到有三條 Chain, 有九個欄位, 說明如下:

  • pkts: 總共通過的封包的數量
  • bytes: 總共通過的流量大小
  • target: 執行的動作, 例如 ACCEPTREJECTRETURNDROPLOG,也可以參照到其他 Chain.
  • port: 使用封包的協定, 例如 alltcpudpicmp
  • opt: 額外的選項說明
  • in: 進入的網路介面
  • out: 出去的網路介面
  • source: 此規則是針對哪個來源進行限制,例如 0.0.0.0/0
  • destination: 此規則是針對哪個目標進行限制,例如 0.0.0.0/0
1root@server:~ iptables -L -n -v --line-numbers -t filter
2Chain INPUT (policy ACCEPT)
3 pkts bytes target     prot opt in     out     source               destination
4
5Chain FORWARD (policy ACCEPT)
6 pkts bytes target     prot opt in     out     source               destination
7
8Chain OUTPUT (policy ACCEPT)
9 pkts bytes target     prot opt in     out     source               destination

iptables 應用

參數說明

  • -P chain target: 變更 chain 的預設政策.
  • -A chain: 加入規則至 chain 的最後.
  • -I chain [rulenum]: 插入規則至 chain.
  • -D chain [rulenum]: 刪除 chain 上的規則.
  • -R chain [rulenum]: 取代 chain 上的規則.
  • -L [chain [rulenum]]: 列出 chain 上的規則.
  • -F [chain]: 刪除 chain 上的所有規則.
  • -Z [chain [rulenum]]: 將計數器歸零.
  • -N chain: 建立使用者定義的 chain.
  • -X [chain]: 刪除使用者定義的 chain.
  • -E old-chain new-chain: 變更 chain 的名稱.

其中 rulenum 是從上至下順序執行,直至匹配的的規則為止,否則執行預設政策。

狀況題

測試主機有網路介面有 lo and eth0.

查看 table filter 的規則
1root@server:~ iptables -L -n -v --line-numbers -t filter
修改 chain 的預設政策

先將 22 port 打開, 以免被擋在家門外. INPUT 預設政策為 DROP.

1# INPUT chain accept port 22
2root@server:~ iptables -I INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
3
4# OUTPUT chain accept port 22
5root@server:~ iptables -I OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
6
7# INPUT chain default drop
8root@server:~ iptables -P INPUT DROP

還原

1# INPUT chain default accept
2root@server:~ iptables -P INPUT ACCEPT
3
4# Delete the INPUT chain first rule
5root@server:~ iptables -D INPUT 1
6
7# Delete the OUTPUT chain first rule
8root@server:~ iptables -D OUTPUT 1
封鎖 INPUT chain 指定的 port
1# 拒絕由網卡 eth0 進來的 tcp port 80 所有封包
2iptables -A INPUT -p tcp -dport 80 -i eth0 -j REJECT
3
4# 拒絕由網卡 eth0 進來的 tcp port 7000 ~ 7005 所有封包
5iptables -A INPUT -p tcp -sport 7000:7005 -i eth0 -j REJECT
封鎖 INPUT chain 指定的 來源
1iptables -I INPUT -p tcp --dport 80 -s 1.34.113.121/32 -m state --state ESTABLISHED -j REJECT
刪除 INPUT chain 所有的規則
1iptables -F INPUT

Rafances

comments powered by Disqus