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 都可以在這兒使用。
溫馨提示:
以上文章描述如有不清晰之處,歡迎在評論區評論,如有時間,會第一時間回覆,謝謝!