iptables/netfilter
阿新 • • 發佈:2021-10-11
iptables/netfilter
iptables是一個配置Linux核心防火牆的命令列工具,它基於核心的netfilter機制。新版本的核心(3.13+)也提供了nftables,用於取代iptables。
netfilter
netfilter是Linux核心的包過濾框架,它提供了一系列的鉤子(Hook)供其他模組控制包的流動。這些鉤子包括
NF_IP_PRE_ROUTING
:剛剛通過資料鏈路層解包進入網路層的資料包通過此鉤子,它在路由之前處理NF_IP_LOCAL_IN
:經過路由查詢後,送往本機(目的地址在本地)的包會通過此鉤子NF_IP_FORWARD
:不是本地產生的並且目的地不是本地的包(即轉發的包)會通過此鉤子NF_IP_LOCAL_OUT
:所有本地生成的發往其他機器的包會通過該鉤子NF_IP_POST_ROUTING
:在包就要離開本機之前會通過該鉤子,它在路由之後處理
iptables
iptables通過表和鏈來組織資料包的過濾規則,每條規則都包括匹配和動作兩部分。預設情況下,每張表包括一些預設鏈,使用者也可以新增自定義的鏈,這些鏈都是順序排列的。這些表和鏈包括:
- raw表用於決定資料包是否被狀態跟蹤機制處理,內建PREROUTING和OUTPUT兩個鏈
- filter表用於過濾,內建INPUT(目的地是本地的包)、FORWARD(不是本地產生的並且目的地不是本地)和OUTPUT(本地生成的包)等三個鏈
- nat用表於網路地址轉換,內建PREROUTING(在包剛剛到達防火牆時改變它的目的地址)、INPUT、OUTPUT和POSTROUTING(要離開防火牆之前改變其源地址)等鏈
- mangle用於對報文進行修改,內建PREROUTING、INPUT、FORWARD、OUTPUT和POSTROUTING等鏈
- security表用於根據安全策略處理資料包,內建INPUT、FORWARD和OUTPUT鏈
Tables↓/Chains→ | PREROUTING | INPUT | FORWARD | OUTPUT | POSTROUTING |
---|---|---|---|---|---|
(routing decision) | ✓ | ||||
raw | ✓ | ✓ | |||
(connection tracking enabled) | ✓ | ✓ | |||
mangle | ✓ | ✓ | ✓ | ✓ | ✓ |
nat(DNAT) | ✓ | ✓ | |||
(routing decision) | ✓ | ✓ | |||
filter | ✓ | ✓ | ✓ | ||
security | ✓ | ✓ | ✓ | ||
nat(SNAT) | ✓ | ✓ |
所有鏈預設都是沒有任何規則的,使用者可以按需要新增規則。每條規則都包括匹配和動作兩部分:
- 匹配可以有多條,比如匹配埠、IP、資料包型別等。匹配還可以包括模組(如conntrack、recent等),實現更復雜的過濾。
- 動作只能有一個,通過
-j
指定,如ACCEPT、DROP、RETURN、SNAT、DNAT等
這樣,網路資料包通過iptables的過程為
其規律為
- 當一個數據包進入網絡卡時,資料包首先進入PREROUTING鏈,在PREROUTING鏈中我們有機會修改資料包的DestIP(目的IP),然後核心的"路由模組"根據"資料包目的IP"以及"核心中的路由表" 判斷是否需要轉送出去(注意,這個時候資料包的DestIP有可能已經被我們修改過了)
- 如果資料包就是進入本機的(即資料包的目的IP是本機的網口IP),資料包就會沿著圖向下移動,到達INPUT鏈。資料包到達INPUT鏈後,任何程序都會收到它
- 本機上執行的程式也可以傳送資料包,這些資料包經過OUTPUT鏈,然後到達POSTROTING鏈輸出(注意,這個時候資料包的SrcIP有可能已經被我們修改過了)
- 如果資料包是要轉發出去的(即目的IP地址不再當前子網中),且核心允許轉發,資料包就會向右移動,經過FORWARD鏈,然後到達POSTROUTING鏈輸出(選擇對應子網的網口傳送出去)
iptables示例
檢視規則列表
iptables -nvL
允許22埠
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
允許來自192.168.0.4的包
iptables -A INPUT -s 192.168.0.4 -j ACCEPT
允許現有連線或與現有連線關聯的包
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
禁止ping包
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
禁止所有其他包
iptables -P INPUT DROP
iptables -P FORWARD DROP
MASQUERADE
iptables -t nat -I POSTROUTING -s 10.0.0.30/32 -j MASQUERADE
NAT
iptables -I FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -t nat -I OUTPUT -d 55.55.55.55/32 -j DNAT --to-destination 10.0.0.30
iptables -t nat -I PREROUTING -d 55.55.55.55/32 -j DNAT --to-destination 10.0.0.30
iptables -t nat -I POSTROUTING -s 10.0.0.30/32 -j SNAT --to-source 55.55.55.55
埠對映
iptables -t nat -I OUTPUT -d 55.55.55.55/32 -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.10.10.3:80
iptables -t nat -I POSTROUTING -m conntrack ! --ctstate DNAT -j ACCEPT
iptables -t nat -I PREROUTING -d 55.55.55.55/32 -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.10.10.3:80
重置所有規則
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X
nftables
nftables 是從核心 3.13 版本引入的新的資料包過濾框架,旨在替代現用的 iptables 框架。nftables引入了一個新的命令列工具nft
,取代了之前的iptables、ip6iptables、ebtables等各種工具。
跟iptables相比,nftables帶來了一系列的好處
- 更易用易理解的語法
- 表和鏈是完全可配置的
- 匹配和目標之間不再有區別
- 在一個規則中可以定義多個動作
- 每個鏈和規則都沒有內建的計數器
- 更好的動態規則集更新支援
- 簡化IPv4/IPv6雙棧管理
- 支援set/map等
- 支援級連(需要核心4.1+)
跟iptables類似,nftables也是使用表和鏈來管理規則。其中,表包括ip、arp、ip6、bridge、inet和netdev等6個型別。下面是一些簡單的例子。
# 新建一個ip型別的表
nft add table ip foo
# 列出所有表
nft list tables
# 刪除表
nft delete table ip foo
# 新增鏈
nft add table ip filter
nft add chain ip filter input { type filter hook input priority 0 \; }
nft add chain ip filter output { type filter hook output priority 0 \; }
# 新增規則
nft add rule filter output ip daddr 8.8.8.8 counter
nft add rule filter output tcp dport ssh counter
nft insert rule filter output ip daddr 192.168.1.1 counter
# 列出規則
nft list table filter
# 刪除規則
nft list table filter -a # 查詢handle是多少
nft delete rule filter output handle 5
# 刪除鏈中所有規則
nft delete rule filter output
# 刪除表中所有規則
nft flush table filter
IT運維開發路上的點點滴滴。。。