詳解網路知識:iptables規則

华为云开发者联盟發表於2024-02-19

本文分享自華為雲社群《【理解雲容器網路】1-基礎篇-iptables介紹》,作者: 可以交個朋友。

iptables規則

下圖為資料包到達linux主機網路卡後,核心如何處理資料包的大致流程

image.png

什麼是規則

規則是管理員對資料包制定的一種觸發機制,即當資料包達到某種條件,就執行指定的動作。
條件:可以是資料包源地址、目的地址、協議等
動作:可以是拒絕、接受、丟棄等;詳細介紹見下表

動作說明
ACCEPT 將封包放行,進行完此處理動作後,將不再比對其它規則,直接跳往下一個規則鏈(nat:postrouting)
REJECT 攔阻該封包,並傳送封包通知對方,可以傳送的封包有幾個選擇:ICMP port-unreachable、ICMP echo-reply 或是 tcp-reset(這個封包會要求對方關閉聯機),進行完此處理動作後,將不再比對其它規則,直接 中斷過濾程式。
DROP 丟棄封包不予處理,進行完此處理動作後,將不再比對其它規則,直接中斷過濾程式。
MASQUERADE 改寫封包來源 IP 為防火牆 NIC IP,可以指定 port 對應的範圍,進行完此處理動作後,直接跳往下一個規則煉(mangle:postrouting)。這個功能與 SNAT 略有不同,當進行 IP 偽裝時,不需指定要偽裝成哪個 IP,IP 會從網路卡直接讀取,當使用撥接連線時,IP 通常是由 ISP 公司的 DHCP 伺服器指派的,這個時候 MASQUERADE 特別有用。
SNAT 改寫封包來源 IP 為某特定 IP 或 IP 範圍,可以指定 port 對應的範圍,進行完此處理動作後,將直接跳往下一個規則煉(mangle:postrouting)。
DNAT 改寫封包目的地 IP 為某特定 IP 或 IP 範圍,可以指定 port 對應的範圍,進行完此處理動作後,將會直接跳往下一個規則煉(filter:input 或 filter:forward)。
MARK 將封包標上某個代號,以便提供作為後續過濾的條件判斷依據,進行完此處理動作後,將會繼續比對其它規則。
RETURN 結束在目前規則煉中的過濾程式,返回主規則煉繼續過濾,如果把自訂規則煉看成是一個子程式,那麼這個動作,就相當於提早結束子程式並返回到主程式中。

使用iptables命令寫入規則示例:

iptables -t filter -A INPUT -i eth0 -p tcp -s 192.168.1.0/24 -m multiport --dports 443,80 -j ACCEPT
#-t:操作那個表
#-A:在表末追加規則;-I為表首插入規則、-D為刪除規則
#INPUT:鏈名稱;該規則在那條鏈上生效
#-j:資料包處理動作;比如接受、拒絕等

整條命令解釋:允許經過本機網路卡eth0,訪問協議是TCP,源地址是192.168.1.0/24 段的資料包訪問本地埠是80和443的服務

什麼是表

表主要用來存放具體的防火牆規則,而規則具有功能性,比如修改資料包源/目的ip、拒絕來自某個網段的資料包訪問本機等;所以我們可以對規則進行分類,不同的功能存入不同的表

  • raw表:主要用於決定資料包是否被狀態跟蹤機制處理
  • mangle表:主要用於拆解報文修改資料包的 IP 頭資訊
  • nat表:主要用於修改資料包的源地址和目的地址、埠號等資訊(實現網路地址轉換,如SNAT、DNAT、MASQUERADE、REDIRECT)。
  • filter表:主要用於對過濾流入和流出的資料包,根據具體的規則決定是否放行該資料包
  • security 表:最不常用的表,用在 SELinux 上;用於強制訪問控制(MAC)網路規則,由Linux安全模組(如SELinux)實現
    其中nat表和filter表最常用

什麼是鏈

上文提到表主要存放具體的規則,但是規則什麼時候生效呢?比如客戶端訪問VIP,資料包到達本機後必須先用DNAT(網路地址轉換)將vip轉換成實際的後端例項ip,然後才能路由判斷,因為後端例項可能有多個且分佈在不同主機,直接用vip進行路由判斷肯定是不行的。所以規則有生效時機,根據生效時機可以分為:

  • PREROUTING:在資料包到達防火牆時,進行路由判斷之前執行的規則
  • INPUT:路由判斷之後確定資料包流入本機,應用其規則
  • FORWARD:路由判斷之後確定資料包要轉發給其他主機,應用其規則;linux主機需要開啟ip_forward功能才支援轉發,在/etc/sysctl.conf檔案中配置引數net.ipv4.ip_forward=1
  • OUTPUT:本機應用向外發出資料包時,應用其規則
  • POSTROUTING:在資料包離開防火牆時進行路由判斷之後執行的規則
    在每條鏈中,規則按照從上到下的順序進行匹配,當一個資料包與某個規則匹配成功後,就會按照該規則的動作進行處理,並且後續的規則將不再被考慮。

表、鏈、規則三者的關係是什麼

表是區分相同鏈的上下順序,規則在每條鏈中的上下順序確定規則執行順序:

  • 如果規則來自不同表,透過表的優先順序確定鏈的優先順序: 比如完整的PREROUTING鏈中有來自raw表、mangle表、nat標的PREROUTING鏈規則,透過表優先順序 (raw>mangle>nat>filter>security) 區分優先順序。所以一個報文傳送到某臺虛擬機器後,被虛擬機器網路卡接收,會進入的虛擬機器網路協議棧處理,先經過PREROUTING鏈處理,具體來說先走raw表的PREROUTING規則、再走mangle表、最後在走nat表PREROUTING規則。
  • 如果規則來自同一個表,則按規則插入表的順序自上而下。

資料包文進/出節點經過哪些規則

  • 對於客戶端來說,傳送報文過程
    先進入OUTPUT鏈處理(raw、mangle、nat、filter、security表對應的PREROUTING規則依次匹配),如果沒有被攔截則根據路由選擇出網口,再進入POSTROUTING鏈處理(mangle、nat表對應的POSTROUTING規則依次匹配),最後從網路卡出去

  • 對於服務端來說,傳送報文過程
    先進入PREROUTING鏈處理(raw、mangle、nat表對應的PREROUTING規則依次匹配),根據路由判斷資料包文發給本機,報文進入INPUT鏈處理(mangle、nat、filter、security表對應的INPUT規則依次匹配),如果沒有被攔截則報文被應用程式處理

  • 對於轉發場景,傳送報文過程
    先進入PREROUTING鏈處理(raw、mangle、nat表對應的PREROUTING規則依次匹配),根據路由判斷資料包文不是發給本機,報文進入FORWARD鏈處理(mangle、filter、security表對應的FORWARD規則依次匹配),如果沒有被攔截則進入POSTROUTING鏈處理(mangle、nat表對應的POSTROUTING規則依次匹配),最後從網路卡出去

    *補充:轉發場景需要Linux開啟轉發功能,否則資料包文進入FORWARD鏈直接丟棄;臨時開啟執行命令sysctl net.ipv4.ip_forward=1或者echo "1" >/proc/sys/net/ipv4/ip_forward;永久生效需要修改/etc/sysctl.conf,增加內容net.ipv4.ip_forward = 1儲存,再執行命令:sysctl -p

NAT(網路地址轉換)介紹

NAT應用最廣的場景就是解決區域網內裝置訪問網際網路的問題。
SNAT(源地址轉換) 主要用於修改資料包的源IP和源埠,一般在nat表的PREROUTING鏈中增加規則:區域網內所有裝置要上外網,如果每個裝置都分配一個公網ip成本太大,可以在路由器出口分配一個公網ip,區域網內的裝置訪問外網時統一走路由器出口,路由器此時需要做兩件事:

  1. 資料包從出口出去之前,將資料包的源地址和源埠改成公網ip和隨機埠
  2. 同時將轉換關係記錄儲存,響應資料包返回時根據記錄轉發給區域網內的裝置

SNAT示例:

iptables -t nat -A POSTROUTING -d 192.168.1.11 -p tcp --dport 88 -j SNAT --to-source 122.9.3.47:88
# -j:值為SNAT需要靜態指定修改後的值,值為MASQUERADE表示動態修改源地址為出口網路卡地址
# --to-source:將資料包的源地址轉換成指定值
# 整條命令解釋:將發給192.168.1.11:88的資料包,其源地址改為122.9.3.47

DNAT(目的地址轉換) 主要用於修改資料包目的地址和埠路由器,一般在nat表中的PREROUTING鏈中增加規則:接收到資料包後,將目的地址和目的埠根據轉換規則修改為實際的內網地址,規則需要提前在路由器上手動新增,如下圖:將訪問公網ip 100...155:10022的資料包轉發給內網裝置172.30.100.136:22

image.png

DNAT示例:

iptables -t nat -A PREROUTING -d 202.12.10.100 -p tcp --dport 20022 -j DNAT --to-destination 192.168.10.11:22
# --to-destination:修改資料包的目的地址
# 整條命令解釋:將發給202.12.10.100:20022的資料包,其目的地址改為192.168.10.11:22

注意:linux核心使用CONNTRACK表(連線跟蹤)記錄NAT轉換關係,一個連線僅在首次經過iptables鏈條時會計算nat表,一旦conntrack記錄下這次的改寫關係,後續無論是去程包還是回程包都是依據conntrack表進行改寫關係的處理,不會再重複執行nat表中的DNAT/SNAT規則

點選關注,第一時間瞭解華為雲新鮮技術~

相關文章