首頁 > 軟體

防火牆iptables分析

2020-06-16 17:38:29

防火牆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


IT145.com E-mail:sddin#qq.com