- install iptables
- 2.4 內核 iptables1.2.6a
- yum install -y bzip2
- wget https://netfilter.org/projects/iptables/files/iptables-1.3.1.tar.bz2
遍歷表和鏈
數據包是以什麼順序、如何遍歷不同的鏈和表的。一些組件是iptables 與內核共用的,比如,數據包路由的判斷。數據包爲什麼被路由,一個好的例子是 DNAT 和 SNAT,不要忘了 TOS 的作用。
當一個報文進入防火牆時候,首先觸發硬件,接着被傳遞給內核中的合適設備。在這個報文到最終目的之前,它會在內核中會經歷一系列步驟,
目的爲本機的報文(就是我們自己的機器)
step(步驟) | table(表) | chain(鏈) | comment(註釋) |
---|---|---|---|
1 | 在線路上 | ||
2 | 到了接口上(例如 eth0) | ||
3 | raw | PREROUTING | 這個鏈在連接跟蹤之前處理報文,它能夠設置一條連接不被連接跟蹤處理。 |
4 | 這兒是連接跟蹤處理的點 | ||
5 | mangle | PREROUTING | 這個鏈主要用來修改報文,例如修改TOS等等。 |
6 | nat | PREROUTING | 這個鏈主要用來處理 DNAT,我們應該避免在這條鏈裏面做過濾,因爲可能有一些報文會漏掉。 |
7 | 路由決定,例如決定報文是上本機還是轉發或者其他地方。 | ||
8 | mangle | INPUT | 到了這點,mangle 表的 INPUT 鏈被使用,在把這個報文實際送給本機前,路由之後,我們需要再次修改報文 |
9 | filter | INPUT | 在這兒我們對所有送往本級的報文進行過濾,要注意所有收到的並且目的地址爲本機的報文都會經過這個鏈,而不管哪個接口進來的或者它往哪兒去。 |
10 | 本地進程或者應用程序,例如服務器或者客戶端程序 |
現在數據包是由 INPUT 鏈過,而不是 FORWARD 鏈。這樣更符合邏輯。
源地址是本地主機發出報文
step(步驟) | table(表) | chain(鏈) | comment(註釋) |
---|---|---|---|
1 | 本地進程或者應用程序(例如服務器或者客戶端程序) | ||
2 | 路由選擇,用哪個源地址以及從哪個接口上出去,當然還有其他一些必要的信息。 | ||
3 | raw | OUTPUT | 這兒是你能夠在連接跟蹤生效前處理報文的點,這兒你可以標記某個連接不被連接跟蹤處理。 |
4 | 這兒就是本地發出報文進行連接跟蹤處理的地兒 | ||
5 | mangle | OUTPUT | 這兒是我們修改報文的地方,在這兒做報文過濾是不被推薦的,因爲它可能有副作用 |
6 | nat | OUTPUT | 對於本級發送的報文做目的 NAT(DNAT) |
7 | 路由決定,因爲前面的 mangle 和 nat 表可能修改了 報文的路由信息。 | ||
8 | filter | OUTPUT | 對發送報文做過濾的地方 |
9 | mangle | POSTROUTING | 這條鏈可能被兩種報文遍歷,一種是轉發的報文,另外就是本級產生的報文。 |
10 | nat | POSTROUTING | 在這兒我們做源 NAT(SNAT),我們建議你不要在這兒做報文過濾,因爲有副作用。即使你設置了默認策略,一些報文也有可能溜過去。 |
11 | 在接口上發出(例如 eth0) | ||
12 | 到了線路上(例如 internet) |
報文的目的地址是另外一個網絡
step(步驟) | table(表) | chain(鏈) | comment(註釋) |
---|---|---|---|
1 | 在線路上(例如 internet) | ||
2 | 到了接口(例如 eth0) | ||
3 | raw | PREROUTING | 可以設置不想被連接跟蹤系統處理的連接。 |
4 | 非本地報文的連接跟蹤系統處理,還在後面的狀態匹配裏面詳細解釋。 | ||
5 | mangle | PREROUTING | 主要用來修改報文,例如改變 TOS 等等。 |
6 | nat | PREROUTING | 主要完成 DNAT,SNAT 後面處理。在這條鏈上面不要做報文過濾。 |
7 | 路由決定,例如轉發報文還是上送本機。 | ||
8 | mangle | FORWARD | 包繼續被髮送至 mangle 表的 FORWARD 鏈,這是非常 特殊的情況纔會用到的。在這裏,包被 mangle(還 記得 mangle 的意思嗎)。這次 mangle 發生在最初 的路由判斷之後,在最後一次更改包的目的之前 (譯者注:就是下面的 FORWARD 鏈所做的,因其過 濾功能,可能會改變一些包的目的地,如丟棄 包)。–摘錄自 1.09 版本的中文翻譯。 |
9 | filter | FORWARD | The packet gets routed onto the FORWARD 包被繼續轉發至 filter 表的 FORWARD 鏈,只有轉發 報文纔會到這兒,因此這兒我們做所有報文的過 濾。在你自己制定規則的時候,請考慮這一點。 |
10 | mangle | POSTROUTING | 這個鏈也是針對一些特殊類型的包(譯者注:參考第 6 步,我們可以發現,在轉發包時,mangle 表的兩個鏈都用在特殊的應用上)。這一步 mangle 是在所有更改包的目的地址的操作完成之後做的,但這時包還在本地上。–摘錄自 1.09 版本的中文翻譯。 |
11 | nat | POSTROUTING | 這個鏈只能作爲 SNAT 作用,千萬不要做報文過濾,僞裝(Masquerading)也是在這兒工作的。 |
12 | 到了報文的出接口(例如 eth1) | ||
13 | 有一次到了線路上(例如本地網絡) |
請一定注意這兒沒有爲某一個接口或者與之類似的鏈,FORWARD 鏈會被本機的所有轉發報文遍歷。
mangle表
這個表主要用來進行報文修改,你可以自由的修改報文的 TOS 之類的。
在這個表裏面,千萬不要做過濾/NAT/僞裝這類的事情。
- 只能在 mangle 表裏面使用
- TOS: TOS target 主要用來修改報文的 TOS 字段,這個字段可以設置一個網絡的報文如何被路由這樣的策略。需要注意的是這個實現並不完善,網絡裏面的很多路由器都不處理這個字段。換句話講,不要設置發完網絡報文的 TOS 字段, 除非你準備用 iprouter2 來做路由。
- TTL: TTLtarget 可以用來設置所有的報文都有一個系統的 TTL 這類的操作,一 個很重要的理由就是我們可以欺騙 ISP。一些 ISP 不願意看到用戶幾臺計算機 共享同一個連接,那些 ISP 會查找一臺單獨的計算機是否使用不同的 TTL,並且以此作爲判斷連接是否被共享的標誌。
- MARK: MARK target 可以給報文設置一些其他應用程序可識別的標記,例如iprouter2 程序。這樣它就能夠給予標記完成路由。利用這個標記我們也可以做帶寬限制或者基於類的入隊。
- SECMARK: SECMARK target 主要用在針對報文設置安全標記,這個標記可以被 selinux 或者其他安全系統使用。SCEMARK 和 CONNSECMARK 一起合用可以針對連 接設置標記。
- CONNSECMARK: CONNSECMARK target 用來把一個連接的標記拷貝給單個報文或者相反,然 後這些標記被 selinux 或者其他安全子模塊使用。
nat表
- 這個表只能用來完成 NAT 功能,換句話講,它只能用來完成源/目的地址的轉換。需要注意的是,只有第一個報文會經過這個表,這個連接的其他報文會自動完成轉換。這個表的 target 有:
- DNAT: DNAT target 主要用在我們只有一個公網 IP,然後我們需要把用戶訪問數據重定向到不同的服務器。換句話講我們改變了報文的目的地址,然後重路由 到實際主機。
- SNAT: SNAT target 改變包的源地址,這在很大程度上可以隱藏你的本地網絡或 者 DMZ 等。一個很好的例子是我們知道防火牆的外部地址,但必須用這個地址 替換本地網絡地址。有了這個操作,防火牆就能自動地對包做 SNAT 和 De- SNAT(就是反向的 SNAT),以使 LAN 能連接到 Internet。如果使用類似 192.168.0.0/24 這樣的地址,是不會從 Internet 得到任何迴應的。因爲 IANA 定義這些網絡(還有其他的)爲私有的,只能用於 LAN 內部
- MASQUERADE: MASQUERADE target 的作用和 SNAT 完全一樣,只是計算機的負荷稍微多一 點。因爲對每個匹配的包,MASQUERADE 都要查找可用的 IP 地址,而不象 SNAT 用的 IP 地址是配置好的。當然,這也有好處,就是我們可以使用通過 PPP、 PPPOE、SLIP 等撥號得到的地址,這些地址可是由 ISP 的 DHCP 隨機分配的。
- REDIRECT:
raw表
- RAW表的一個主要用途就是爲了一件事情,那就是對報文設置一個標誌,讓 這個報文不被連接跟蹤系統所跟蹤。我們通過NOTRACK target來實現這個功 能。一個連接在NOTRACK裏面被處理,接着連接跟蹤系統就不會再處理這個報 文。不增加一個表是解決不了前面的問題的,因爲我們其他表都是在連接跟蹤 處理完之後再處理報文,
- 這個表只有 PREROUTING 和 OUTPUT 兩個鏈,只是因爲這兩個地方是他們 hit 連接跟蹤的唯一地方。
- 要讓這個表能夠工作,iptables_raw 模塊需要被加載,加入我 們顯式的制定-t raw 標誌,只要這個模塊可用,它就會被自動 加載。
filter表
- 主要是用來報文過濾的,根據包的內容對包做 DROP 或 ACCEPT 的。
用戶自定義鏈
- 一個報文在處理的時候能夠通過 jump 規則跳轉到本表的另外一個鏈,但是需要指出的是這個新的鏈表必須是用戶自定義的,不能是任何內建的鏈表。這個規則的查詢是逐條的,自上向下的。遍歷結束的條件是被一個 target 終止或 者內建的鏈表結束。
- 用戶自定義的鏈沒有默認策略,只有內建的纔可以配置默認策 略。在用戶自定義的鏈最空有一個空白的規則,它的動作的 return 返回到主鏈。
- 用戶自定義鏈的每個條規則都必須逐一的被檢查,直到有一個規則匹配這 個報文,接着調用這個規則的 target 處理這個報文,處理的結果當然可能結束 或者繼續,另外還有一種可能就是達到了規則鏈的末尾。加入到達了規則鏈的 末尾,那麼報文就會被送回父鏈,父鏈可能是用戶自定義鏈,也有可能是內嵌 的鏈。