iptables--轉發流程

1.術語

名稱 定義
DNAT Destination Network Address Translation 目的網絡地址轉換。 DNAT是一種改變數據包目的 ip 地址的技術,經常和 SNAT 聯用,以使多臺服務器能共享一個 ip 地址連入 Internet,並且繼續服務。通過對同一個 ip 地址分配不同的端口,來決定數據的流向。
SNAT Source Network Address Translation 源網絡地址轉換。這是一種改變數據包源 ip 地址的技術,經常用來使多臺計算機分享一個 Internet 地址。這隻在 IPv4 中使用,因爲 IPv4 的地址已快用完了,IPv6 將解決這個問題。
Stream 是指發送和接收的數據包和通信的雙方都有關係的一種連接
State 指明數據包處於什麼狀態。狀態在 RFC 793 - Transmission Control Protocol 中定義,或由用戶在 Netfilter/iptables 中自定義。需要注意的是 Netfilter 設定了一些關於連接和數據包的狀態,但沒有完全使用使用RFC 793 的定義。
User space 用戶空間,指在內核外部或發生在內核外部的任何東西。例如,調用 iptables -h 發生在內核外部,但 iptables -A FORWARD -p tcp -j ACCEPT(部分地)發生在內核內部,因爲一條新的規則加入了規則集。
Kernel space 內核空間 ,與用戶空間相對,指那些發生在內核內部。
target 表示對匹配的數據包所做的操作。

2.內核配置

爲了運行 iptables,需要在內核配置期間,選擇以下一些選項。

定義
CONFIG_PACKET 允許程序直接訪問網絡設備,例如tcpdump功能
CONFIG_NETFILTER 允許計算機作爲網關或防火牆。這個是必需的。
CONFIG_IP_NF_CONNTRACK 連接跟蹤模塊,用於 NAT(網絡地址轉換)和Masquerading(ip地址僞裝)。
CONFIG_IP_NF_FTP 這個選項提供針對 FTP 連接進行連接跟蹤的功能。
CONFIG_IP_NF_IPTABLES 使用過濾、僞裝、NAT。它爲內核加入了 iptables 標識框架。沒有它,iptables 毫無作用。
CONFIG_IP_NF_MATCH_LIMIT 提供匹配 LIMIT 的功能,以便於使用一個適當的規則來控制每分鐘要匹配的數據包的數量。比如, -m limit --limit 3/minute的作用是每分鐘最多匹配三個數據包。這個功能也可用來消除某種 DoS 攻擊。
CONFIG_IP_NF_MATCH_MAC 可以根據 MAC 地址匹配數據包。
CONFIG_IP_NF_MATCH_MARK 這個選項用來標記數據包。對數據包做 MARK(標記)操作。
CONFIG_IP_NF_MATCH_MULTIPORT 選擇這個模塊我們可以使用端口範圍來匹配數據包。
CONFIG_IP_NF_MATCH_TOS 可以設置數據包的 TOS(Type Of Service 服務類型)。這個工作也可以用命令 ip/tc 完成,還可在 mangle 表中用某種規則設定。
CONFIG_IP_NF_MATCH_TCPMSS 可以基於 MSS 匹配 TCP 數據包。
CONFIG_IP_NF_MATCH_STATE 對數據包做狀態匹配,比如,在某個 TCP 連接的兩個方向上已有通信,則這個連接上的數據包就被看作 ESTABLISHED(已建立連接)狀態。
CONFIG_IP_NF_MATCH_UNCLEAN 匹配那些不符合類型標準或無效的 P、TCP、UDP、ICMP 數據包。
CONFIG_IP_NF_MATCH_OWNER 根據套接字的擁有者匹配數據包。
CONFIG_IP_NF_FILTER 這個模塊爲 iptables 添加基本的過濾表,其中包含INPUT、FORWARD、OUTPUT 鏈。通過過濾表可以做完全的 IP 過濾。只要想過濾數據包,不管是接收的還是發送的,也不管做何種過濾,都必需此模塊。
CONFIG_IP_NF_TARGET_REJECT 這個操作使我們用 ICMP 錯誤信息來回應接收到的數據包,而不是簡單地丟棄它。有些情況必須要有迴應的,比如,相對於 ICMP和 UDP 來說,要重置或拒絕 TCP 連接總是需要一個 TCP RST 包。
CONFIG_IP_NF_TARGET_MIRROR 這個操作使數據包返回到發送它的計算機。例如,我們在 INPUT 鏈裏對目的端口爲 HTTP 的包設置了 MIRROR 操作,當有人訪問HTTP 時,包就被髮送回原計算機,最後,他訪問的可能是他自己的主頁。
CONFIG_IP_NF_NAT 提供 NAT 功能。這個選項使我們有權訪問 nat 表。端口轉發和僞裝是必需此模塊的。
CONFIG_IP_NF_TARGET_MASQUERADE 提供 MASQUERADE(僞裝)操作。如果我們不知道連接 Internet 的 IP,首選的方法就是使用 MASQUERADE,而不是 DNAT 或SNAT。換句話說,就是如果我們使用 PPP 或 SLIP 等連入Internet,由 DHCP 或其他服務分配 IP,使用這個比 SNAT 好。因爲 MASQUERADE 不需要預先知道連接Internet 的 IP,雖然對於計算機來說 MASQUERADE 要比 NAT 的負載稍微高一點。
CONFIG_IP_NF_TARGET_REDIRECT 這個操作和代理程序一起使用是很有用的。它不會讓數據包直接通過,而是把包重新映射到本地主機,也就是完成透明代理。
CONFIG_IP_NF_TARGET_LOG 爲 iptables 增加 LOG(日誌)操作。通過它,可以使用系統日誌服務記錄某些數據包,這樣我們就能瞭解在包上發生了什麼。這對於我們做安全審查、調試腳本的幫助是無價的。
CONFIG_IP_NF_TARGET_TCPMSS 可以對付一些阻塞 ICMP 分段信息的ISP(服務提供商)或服務。沒有 ICMP 分段信息,一些網頁、大郵件無法通過,雖然小郵件可以,還有,在握手完成之後,ssh 可以但 scp 不能工作。我們可以用 TCPMSS 解決這個問題,就是使 MSS(Maximum Segment Size)

3.轉發流程

當數據包到達防火牆時,如果 MAC 地址符合,就會由內核裏相應的驅動程序接收,然後會經過一系列操作,從而決定是發送給本地的程序,還是轉發給其他機子,還是其他的什麼。
例如以本地(如路由器的服務程序或客戶程序)爲目標的包流程如下:

Step(步驟) Table(表) Chain(鏈) Comment(註釋)
1 在線路上傳輸(比如,Internet)
2 進入接口 (比如, wan接口ppp0)
3 mangle PREROUTING 這個鏈用來 mangle 數據包,比如改變TOS 等
4 nat PREROUTING 這個鏈主要用來做 DNAT。不要在這個鏈做過濾操作,因爲某些情況下包會溜過去。
5 路由判斷,比如,包是發往本地的(爲本例子流程),還是要轉發的。
6 mangle INPUT 在路由之後,被送往本地程序之前,mangle 數據包。
7 filter INPUT 所有以本地爲目的的包都要經過這個鏈,不管它們從哪兒來,對這些包的過濾條件就設在這裏。
8 到達本地程序了(比如,服務程序或客戶程序)

例如以本地(如路由器的服務程序或客戶程序)爲源的包流程如下:

Step(步驟) Table(表) Chain(鏈) Comment(註釋)
1 本地程序(比如,服務程序或客戶程序)
2 路由判斷,要使用源地址,外出接口,還有其他一些信息。
3 mangle OUTPUT 在這兒可以 mangle 包。建議不要在這兒做過濾,可能有副作用哦。
4 nat OUTPUT 這個鏈對從防火牆本身發出的包進行DNAT操作。
5 filter OUTPUT 對本地發出的包過濾。
6 mangle POSTROUTING 這條鏈主要在包 DNAT 之後(譯者注:作者把這一次 DNAT 稱作實際的路由,雖然在前面有一次路由。對於本地的包,一旦它被生成,就必須經過路由代碼的處理,但這個包具體到哪兒去,要由 NAT代碼處理之後才能確定。所以把這稱作實際的路由。),離開本地之前,對包mangle。有兩種包會經過這裏,防火牆所在機子本身產生的包,還有被轉發的包。
7 nat POSTROUTING 在這裏做 SNAT。但不要在這裏做過濾,因爲有副作用,而且有些包是會溜過去的,即使你用了 DROP 策略。
8 離開接口(比如: ppp0)
9 在線路上傳輸(比如,Internet)

例如一個包的目的是另一個網絡中的一臺機子,被轉發的包流程如下:

Step(步驟) Table(表) Chain(鏈) Comment(註釋)
1 在線路上傳輸(比如,Internet)
2 進入接口(比如, eth0)
3 mangle PREROUTING mangle數據包,比如改變 TOS 等。
4 nat PREROUTING 這個鏈主要用來做 DNAT。不要在這個鏈做過濾操作,因爲某些情況下包會溜過去。稍後會做 SNAT。
5 路由判斷,比如,包是發往本地的,還是要轉發的(爲本例子流程)。
6 mangle FORWARD 包繼續被髮送至 mangle表的FORWARD鏈,這是非常特殊的情況纔會用到的。在這裏,包被 mangle(還記得 mangle的意思嗎)。這次 mangle 發生在最初的路由判斷之後,在最後一次更改包的目的之前(譯者注:就是下面的 FORWARD鏈所做的,因其過濾功能,可能會改變一些包的目的地,如丟棄包)。
7 filter FORWARD 包繼續被髮送至這條 FORWARD 鏈。只有需要轉發的包纔會走到這裏,並且針對這些包的所有過濾也在這裏進行。注意,所有要轉發的包都要經過這裏,不管是外網到內網的還是內網到外網的。在你自己書寫規則時,要考慮到這一點。
8 mangle POSTROUTING 這個鏈也是針對一些特殊類型的包(譯者注:參考第 6 步,我們可以發現,在轉發包時,mangle 表的兩個鏈都用在特殊的應用上)。這一步 mangle 是在所有更改包的目的地址的操作完成之後做的,但這時包還在本地上。
9 nat POSTROUTING 這個鏈就是用來做 SNAT 的,當然也包括Masquerade(僞裝)。但不要在這兒做過濾,因爲某些包即使不滿足條件也會通過。
10 離開接口(比如: BR_LAN)
11 又在線路上傳輸了(比如,LAN)

所有要經防火牆/ 路由器轉發的包都要經過FORWARD鏈,不要在 INPUT 鏈上做過濾,INPUT 是專門用來操作那些以我們的機子爲目的地址的包的,它們不會被路由到其它地方的。具體流程圖如下:
轉發流程圖

4.表

4.1 mangle表

這個表主要用來 mangle包,你可以使用mangle匹配來改變包的 TOS 等特性。建議你不要在這個表裏做任何過濾,不管是 DANT,SNAT或者MASQUERADE。以下是mangle表中僅有的幾種操作:

操作 定義
TOS 用來設置或改變數據包的服務類型域。這常用來設置網絡上的數據包如何被路由等策略。注意這個操作並不完善,有時得不所願。它在 Internet 上還不能使用,而且很多路由器不會注意到這個域值。換句話說,不要設置發往Internet 的包,除非你打算依靠 TOS 來路由,比如用 iproute2。
TTL 用來改變數據包的生存時間域,我們可以讓所有數據包只有一個特殊的TTL。它的存在有一個很好的理由,那就是我們可以欺騙一些 ISP。爲什麼要欺騙他們呢?因爲他們不願意讓我們共享一個連接。那些 ISP 會查找一臺單獨的計算機是否使用不同的 TTL,並且以此作爲判斷連接是否被共享的標誌。
MARK 用來給包設置特殊的標記。iproute2 能識別這些標記,並根據不同的標記(或沒有標記)決定不同的路由。用這些標記我們可以做帶寬限制和基於請求的分類。

4.2 nat表

此表僅用於 NAT,也就是轉換包的源或目標地址。只有流的第一個包會被這個鏈匹配,其後的包會自動被做相同的處理。以下是 nat表中僅有的幾種操作:

操作 定義
DNAT 主要用在這樣一種情況,你有一個合法的 IP 地址,要把對防火牆的訪問重定向到其他的機子上(比如 DMZ)。也就是說,我們改變的是目的地址,以使包能重路由到某臺主機。
SNAT 改變包的源地址,這在極大程度上可以隱藏你的本地網絡或者 DMZ 等。一個很好的例子是我們知道防火牆的外部地址,但必須用這個地址替換本地網絡地址。有了這個操作,防火牆就能自動地對包做 SNAT 和 De-SNAT(就是反向的 SNAT),以使 LAN 能連接到 Internet。如果使用類似 192.168.0.0/24 這樣的地址,是不會從 Internet 得到任何迴應的。因爲 IANA 定義這些網絡(還有其他的)爲私有的,只能用於 LAN 內部。
MASQUERADE 作用和SNAT完全一樣,只是計算機的負荷稍微多一點。因爲對每個匹配的包,MASQUERADE 都要查找可用的 IP 地址,而不象 SNAT 用的 IP地址是配置好的。當然,這也有好處,就是我們可以使用通過 PPP、 PPPOE、SLIP等撥號得到的地址,這些地址可是由 ISP 的 DHCP 隨機分配的。

4.3 filter表

filter 表用來過濾數據包,我們可以在任何時候匹配包並過濾它們。我們就是在這裏根據包的內容對包做 DROP 或 ACCEPT 的。當然,我們也可以預先在其他地方做些過濾,但是這個表纔是設計用來過濾的。幾乎所有的 target 都可以在這兒使用。

溫馨提示:
以上文章描述如有不清晰之處,歡迎在評論區評論,如有時間,會第一時間回覆,謝謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章