表和鏈

  • 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 處理這個報文,處理的結果當然可能結束 或者繼續,另外還有一種可能就是達到了規則鏈的末尾。加入到達了規則鏈的 末尾,那麼報文就會被送回父鏈,父鏈可能是用戶自定義鏈,也有可能是內嵌 的鏈。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章