2021-05-12 14:32:11
防火牆iptables分析
防火牆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防火牆 http://www.linuxidc.com/Linux/2015-05/117473.htm
iptables使用範例詳解 http://www.linuxidc.com/Linux/2014-03/99159.htm
Linux防火牆iptables詳細教學 http://www.linuxidc.com/Linux/2013-07/87045.htm
iptables的備份、恢復及防火牆指令碼的基本使用 http://www.linuxidc.com/Linux/2013-08/88535.htm
Linux下防火牆iptables用法規則詳解 http://www.linuxidc.com/Linux/2012-08/67952.htm
Linux下iptables防火牆設定 http://www.linuxidc.com/Linux/2015-10/123843.htm
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://www.linuxidc.com/Linux/2016-07/133068p2.htm
相關文章