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.

Chain

State

Policy and target

iptables 輸出格式說明

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

root@server:~ iptables -L -n -v --line-numbers -t filter
Chain INPUT (policy ACCEPT)
 pkts bytes target     prot opt in     out     source               destination

Chain FORWARD (policy ACCEPT)
 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT)
 pkts bytes target     prot opt in     out     source               destination

iptables 應用

參數說明

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

狀況題

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

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

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

# INPUT chain accept port 22
root@server:~ iptables -I INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT

# OUTPUT chain accept port 22
root@server:~ iptables -I OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

# INPUT chain default drop
root@server:~ iptables -P INPUT DROP

還原

# INPUT chain default accept
root@server:~ iptables -P INPUT ACCEPT

# Delete the INPUT chain first rule
root@server:~ iptables -D INPUT 1

# Delete the OUTPUT chain first rule
root@server:~ iptables -D OUTPUT 1
封鎖 INPUT chain 指定的 port
# 拒絕由網卡 eth0 進來的 tcp port 80 所有封包
iptables -A INPUT -p tcp -dport 80 -i eth0 -j REJECT

# 拒絕由網卡 eth0 進來的 tcp port 7000 ~ 7005 所有封包
iptables -A INPUT -p tcp -sport 7000:7005 -i eth0 -j REJECT
封鎖 INPUT chain 指定的 來源
iptables -I INPUT -p tcp --dport 80 -s 1.34.113.121/32 -m state --state ESTABLISHED -j REJECT
刪除 INPUT chain 所有的規則
iptables -F INPUT

Rafances