Linux iptables原理--數據包流向


 

IptableNetfilter

在上一篇文章 linux iptables常用命令--配置一個生產環境的iptables 我們知道iptables有好幾個表,如raw,mangle,nat,filter,有好幾條鏈,如PRE_ROUTING、INPUT、OUTPUT、FORWARD、POST_ROUTING,那么它們有什么關系,調用流程是怎樣的。

 

其實Iptables只是一個應用層的程序,它屬於用戶空間,通過iptables配置規則后都會調用 Netfilter開放的接口來對存放在內核空間中的數據進行修改。

Netfilter是Linux操作系統核心層內部的一個數據包處理模塊,它屬於內核空間,有五個掛載點,當數據包到達這些位置的時候會調用這些函數,在這些位置上我們可以對數據包的內容進行修改,達到控制的目的,這5個掛載點分別是PRE_ROUTING、INPUT、OUTPUT、FORWARD、POST_ROUTING。也就是我們常說的五條鏈。

 

 

iptables四表五鏈

鏈是放在表中的,總共有四個表,每個表有不同的優化級:raw>mangle >nat> filter

一個表有若干個鏈,如下所示:

 

raw

mangle

nat

filter

prerouting

Y

Y

Y

 

input

 

Y

 

Y

output

Y

Y

Y

Y

forward

 

Y

 

Y

postrouting

 

Y

Y

 

 

加紅的代表用得相對比較多的。

 

 

四張表的功能

raw

是自1.2.9以后版本的iptables新增的表,主要用於決定數據包是否被狀態跟蹤機制處理,一般在高並發時有可能會用到,來設置一些連接不跟蹤狀態,防止ip_conntrack文件被撐爆。

mangle

主要用於修改數據包的TOS(Type Of Service,服務類型)、TTL(Time To Live,生存周期)指以及為數據包設置Mark標記,以實現Qos(Quality Of Service,服務質量)調整以及策略路由等應用,由於需要相應的路由設備支持,應用並不廣泛。

nat

主要用於修改數據包的IP地址、端口號等信息(網絡地址轉換,如SNAT、DNAT、MASQUERADE、REDIRECT),一般在作為網關服務器上會用到,如果有搭建過openvpn的話,一般也會用到。

filter

主要用於對數據包進行過濾,有DROP、ACCEPT、REJECT、LOG等,一般在input 和forward chain用得最多,也是出現頻率最高的。

 

 

 

iptables數據包流向

一個數據包到達時,是怎么依次穿過各個鏈和表的,是得看看下面這張詳細的流程圖了:

 

 

我們結合上圖舉個例子:

 

假如有數據包從Network IN要通過iptables,數據包流向如下:

1.Network IN數據包到達服務器的網絡接口

2.進入raw表的 PREROUTING 鏈,這個鏈的作用是決定數據包是否被狀態跟蹤。

  進入 mangle 表的 PREROUTING 鏈,在此可以修改數據包,比如 TOS 等。

  進入 nat 表的 PREROUTING 鏈,可以在此做DNAT(目標地址轉換)

3.決定路由,查看目標地址是交給本地主機還是轉發給其它主機。

 

4.到這里分兩種情況,一種情況是數據包要轉發給其它主機(一般情況下它是在擔任網關服務器),數據包會依次經過:

5.進入 mangle 表的 FORWARD 鏈,

  進入 filter 表的 FORWARD 鏈,在這里我們可以對所有轉發的數據包進行過濾。

6.進入 mangle 表的 POSTROUTING 鏈

  進入 nat 表的 POSTROUTING 鏈,在這里一般都是用來做 SNAT (源地址轉換)

7.數據包流出網絡接口,發往network out。

 

8.另一種情況,數據包的目標地址就是發給本地主機的,它會依次穿過:

9.進入 mangle 表的 INPUT 鏈,

  進入 filter 表的 INPUT 鏈,在這里我們可以對流入的所有數據包進行過濾,

  數據包交給本地主機的應用程序進行處理。

10.應用程序處理完畢后發送的數據包進行路由發送決定。

11.進入 raw 表的 OUTPUT 鏈。

   進入 mangle 表的 OUTPUT 鏈,

   進入 nat 表的 OUTPUT 鏈,

   進入 filter 表的 OUTPUT 鏈。

12.進入 mangle 表的 POSTROUTING 鏈,

   進入 nat 表的 POSTROUTING 鏈。

13.進入出去的網絡接口,發送往network out。

 

 

所以,如果我們要過濾控制包的進出,只需要把input chain和forward chain這兩個關口把控住就好了,這也是我們上篇文章把input chain和forward chain默認設置為drop的原因。

 

 

以上這張流程圖值得反復仔細查看,這樣以后制定規則就心里有數,通與不通也才能快速排錯。

 

 

 

 

 

 

 

 

Save

Save

Save

Save

Save

Save

Save

Save

Save

Save


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM