1. 程式人生 > 其它 >iptables/netfilter

iptables/netfilter

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→PREROUTINGINPUTFORWARDOUTPUTPOSTROUTING
(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的過程為

其規律為

  1. 當一個數據包進入網絡卡時,資料包首先進入PREROUTING鏈,在PREROUTING鏈中我們有機會修改資料包的DestIP(目的IP),然後核心的"路由模組"根據"資料包目的IP"以及"核心中的路由表" 判斷是否需要轉送出去(注意,這個時候資料包的DestIP有可能已經被我們修改過了)
  2. 如果資料包就是進入本機的(即資料包的目的IP是本機的網口IP),資料包就會沿著圖向下移動,到達INPUT鏈。資料包到達INPUT鏈後,任何程序都會收到它
  3. 本機上執行的程式也可以傳送資料包,這些資料包經過OUTPUT鏈,然後到達POSTROTING鏈輸出(注意,這個時候資料包的SrcIP有可能已經被我們修改過了)
  4. 如果資料包是要轉發出去的(即目的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運維開發路上的點點滴滴。。。