防火牆iptables分析
一、iptables 基本概念
匹配(match):符合指定的條件,比如指定的 IP 地址和端口。
丟棄(drop):當一個包到達時,簡單地丟棄,不做其它任何處理。
接受(accept):和丟棄相反,接受這個包,讓這個包通過。
拒絕(reject):和丟棄相似,但它還會向發送這個包的源主機發送錯誤消息。這個錯誤消息可以指定,也可以自動產生。
目標(target):指定的動作,說明如何處理一個包,比如:丟棄,接受,或拒絕。
跳轉(jump):和目標類似,不過它指定的不是一個具體的動作,而是另一個鏈,表示要跳轉到那個鏈上。
規則(rule):一個或多個匹配及其對應的目標。
鏈(chain):每條鏈都包含有一系列的規則,這些規則會被依次應用到每個遍歷該鏈的數據包上。每個鏈都有各自專門的用途, 這一點我們下面會詳細討論。
表(table):每個表包含有若干個不同的鏈,比如 filter 表默認包含有 INPUT,FORWARD,OUTPUT 三個鏈。iptables有四個表,分別是:raw,nat,mangle和filter,每個表都有自己專門的用處,比如最常用filter表就是專門用來做包過濾的,而 nat 表是專門用來做NAT的。
策略(police):我們在這裡提到的策略是指,對於 iptables 中某條鏈,當所有規則都匹配不成功時其默認的處理動作。
連接跟蹤(connection track):又稱為動態過濾,可以根據指定連接的狀態進行一些適當的過濾,是一個很強大的功能,但同時也比較消耗內存資源。
二、iptables的數據包流程
圖1經過iptables的數據包流程
圖1表達了數據包經過iptables的基本流程,從圖中可將數據包報文的處理過程分為三種類型。
更多iptables相關教程見以下內容:
CentOS 7.0關閉默認防火牆啟用iptables防火牆
iptables使用范例詳解
Linux防火牆iptables詳細教程
iptables的備份、恢復及防火牆腳本的基本使用
Linux下防火牆iptables用法規則詳解
Linux下iptables防火牆設置
1) 目的為本機的報文
報文以本機為目的地址時,其經過iptables的過程為:
1. 數據包從network到網卡
2. 網卡接收到數據包後,進入raw表的PREROUTING鏈。這個鏈的作用是在連接跟蹤之前處理報文,能夠設置一條連接不被連接跟蹤處理。(注:不要在raw表上添加其他規則)
3. 如果設置了連接跟蹤,則在這條連接上處理。
4. 經過raw處理後,進入mangle表的PREROUTING鏈。這個鏈主要是用來修改報文的TOS、TTL以及給報文設置特殊的MARK。(注:通常mangle表以給報文設置MARK為主,在這個表裡面,千萬不要做過濾/NAT/偽裝這類的事情)
5. 進入nat表的PREROUTING鏈。這個鏈主要用來處理 DNAT,應該避免在這條鏈裡面做過濾,否則可能造成有些報文會漏掉。(注:它只用來完成源/目的地址的轉換)
6. 進入路由決定數據包的處理。例如決定報文是上本機還是轉發或者其他地方。(注:此處假設報文交給本機處理)
7. 進入 mangle 表的 INPUT 鏈。在把報文實際送給本機前,路由之後,我們可以再次修改報文。
8. 進入 filter 表的 INPUT 鏈。在這兒我們對所有送往本機的報文進行過濾,要注意所有收到的並且目的地址為本機的報文都會經過這個鏈,而不管哪個接口進來的或者它往哪兒去。
9. 進過規則過濾,報文交由本地進程或者應用程序處理,例如服務器或者客戶端程序。
2) 本地主機發出報文
數據包由本機發出時,其經過iptables的過程為:
1. 本地進程或者應用程序(例如服務器或者客戶端程序)發出數據包。
2. 路由選擇,用哪個源地址以及從哪個接口上出去,當然還有其他一些必要的信息。
3. 進入 raw 表的 OUTPUT 鏈。 這裡是能夠在連接跟蹤生效前處理報文的點,在這可以標記某個連接不被連接跟蹤處理。
4. 連接跟蹤對本地的數據包進行處理。
5. 進入 mangle 表的 OUTPUT 鏈,在這裡我們可以修改數據包,但不要做過濾(以避免副作用)。
6. 進入 nat 表的 OUTPUT 鏈,可以對防火牆自己發出的數據做目的NAT(DNAT) 。
7. 進入 filter 表的 OUTPUT 鏈,可以對本地出去的數據包進行過濾。
8. 再次進行路由決定,因為前面的 mangle 和 nat 表可能修改了報文的路由信息。
9. 進入 mangle 表的 POSTROUTING 鏈。這條鏈可能被兩種報文遍歷,一種是轉發的報文,另外就是本機產生的報文。
10. 進入 nat 表的 POSTROUTING 鏈。在這我們做源 NAT(SNAT),建議你不要在這做報文過濾,因為有副作用。即使你設置了默認策略,一些報文也有可能溜過去。
11. 進入出去的網絡接口。
3) 轉發報文
報文經過iptables進入轉發的過程為:
1. 數據包從network到網卡
2. 網卡接收到數據包後,進入raw表的PREROUTING鏈。這個鏈的作用是在連接跟蹤之前處理報文,能夠設置一條連接不被連接跟蹤處理。(注:不要在raw表上添加其他規則)
3. 如果設置了連接跟蹤,則在這條連接上處理。
4. 經過raw處理後,進入mangle表的PREROUTING鏈。這個鏈主要是用來修改報文的TOS、TTL以及給報文設置特殊的MARK。(注:通常mangle表以給報文設置MARK為主,在這個表裡面,千萬不要做過濾/NAT/偽裝這類的事情)
5. 進入nat表的PREROUTING鏈。這個鏈主要用來處理 DNAT,應該避免在這條鏈裡面做過濾,否則可能造成有些報文會漏掉。(注:它只用來完成源/目的地址的轉換)
6. 進入路由決定數據包的處理。例如決定報文是上本機還是轉發或者其他地方。(注:此處假設報文進行轉發)
7. 進入 mangle 表的 FORWARD 鏈,這裡也比較特殊,這是在第一次路由決定之後,在進行最後的路由決定之前,我們仍然可以對數據包進行某些修改。
8. 進入 filter 表的 FORWARD 鏈,在這裡我們可以對所有轉發的數據包進行過濾。需要注意的是:經過這裡的數據包是轉發的,方向是雙向的。
9. 進入 mangle 表的 POSTROUTING 鏈,到這裡已經做完了所有的路由決定,但數據包仍然在本地主機,我們還可以進行某些修改。
10. 進入 nat 表的 POSTROUTING 鏈,在這裡一般都是用來做 SNAT ,不要在這裡進行過濾。
11. 進入出去的網絡接口。
更多詳情見請繼續閱讀下一頁的精彩內容:
http://xxxxxx/Linuxjc/1141588.html TechArticle