NF_HOOK conntrack分析[NAT篇]

在南京看海發表於2016-07-26

一 NF_HOOK 之NAT簡介

    上一節主要是對coontrack的流程和資料模型進行了分析,核心協議棧中有一個重要的應用就是NAT。藉助於核心的NAT功能可以輕鬆的通過一條命令搭建NAT伺服器。NAT功能就是在conntrack的基礎之上實現的基本應用。

    下圖是NAT在協議棧的處理流程。

通過註冊相應的HOOK函式,netfilter會在相應的鉤子函式入口呼叫相應的處理函式,完成NAT的處理。

二 NAT舉例

    搭建一臺linux的路由器,可以簡單的使用下面兩個命令

 

sysctl -w net.ipv4.ip_forward=1

 

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

    網路模型如下圖:

    

    為了簡單化我們的分析,以UDP的NAT穿透舉例,以PC發往8.8.8.8的63埠為例,源埠號為800,如下圖

經過NAT轉換後,變為如下的包(源埠沒有改變的情況)

    

    伺服器迴應的包如下

    在路由器收到迴應包後,再進行NAT的轉換,將包發給PC

    這樣一個UDP的NAT連線就建立完畢,並在核心中建立了相應的NAT穿透,伺服器和PC可以通過這個穿透自由的傳送資料了。

三 NAT的核心實現

    以上圖為例,核心是如何完成NAT的呢。

    在PC的包發往路由器後,路由器對包進行路由和轉發,然後到達POSTROUTING連結串列。此時執行

在masquerade_tg做完相應的結構體資訊採集之後執行nf_nat_setup_info函式。

在conntrack增加下面增加nat結構體,這樣一個conntrack就增加如下:

curr_tuple由reply

tuple->src.u3.ip = 192.168.1.2;

tuple->dst.u3.ip = 8.8.8.8;

new_tuple,根據NAT range更改源地址,新的

new_tuple->src.u3.ip =3.3.3.3

new_tuple->dst.u3.ip = 8.8.8.8

經過此處理之後相應的結構體變為如下

剩下的就是將nat 結構體新增到Hash表中去。

最後退出將包修改完之後,傳送出去。

 包到達的時候,執行

nf_nat_fn進行相應的檢查和結構體的完善之後,呼叫nf_nat_packet(ct, ctinfo, hooknum, skb);,

最後通過manip_pkt,將包修改成

最後轉發到PC,這樣一個UDP包的穿透實現就完成了。對於TCP的包處理,相對來說複雜一些,可以對比UDP分析一下,這裡就不做詳細的分析了。

 

 

轉自 http://blog.sina.com.cn/s/blog_694f2ae70101albl.html

相關文章