連線跟蹤與nat轉換

2021-05-26 17:28:48 字數 2396 閱讀 9245

很長時間沒上來,一時興起只來剪草,卻正巧趕上開博一週年,天意如此,我且順了天,附上點近期所學東西。

連線跟蹤對nat實現的輔助

乙個新建連線的資料報從物理層傳遞到網路層後,連線跟蹤會對其進行跟蹤,記錄下其連線狀態和重要資訊,從指定的內建的處理函式的優先順序enum nf_ip_hook_priorities{}中可以看出連線跟蹤函式的優先順序是在nat處理之前的,是輔助完成nat轉換的,但其不對資料報進行任何實質性處理,所以修改資料報資訊的工作還是由nat完成。

連線跟蹤就是獲取資料報的資料結構sk_buff中ip頭和協議頭的資訊(源ip、埠,目的ip、埠、傳輸協議和網路協議),存放於連線跟蹤特定的多元組tuple中,tuple的成員dir還對資料報的方向進行了記錄,用來區分是進來的包還是發出的包。核心中對本地接受和傳送的資料報的資訊分別用兩個多元組original tuple和reply tuple分開儲存,這個就相當理論所說的napt對映表。original tuple多元組的資訊全從sk_buff中獲取,回包的時候只需對tuple中的源ip和目的ip,源埠和目的埠的值使用函式nf_ct_invert_tuple進行交換處理,賦值給reply tuple這個多元組中的成員,連線跟蹤的任務便完成了,根據前面的原理描述,我們知道網路位址轉換主要是對sk_buff中ip位址和埠號動手腳來實現,這些工作還是由nat模組完成。

連線跟蹤是nat轉換的基礎,下面針對在nat轉換中起關鍵作用的幾個函式進行分析。以接收tcp包為例。

1. 函式nf_ct_get_tuple從sk_buff中獲取源ip、埠,目的ip、埠、傳輸協議和網路協議資訊,之後賦值給多元組tuple。

bool  nf_ct_get_tuple(const struct sk_buff *skb,unsigned int nhoff,unsigned int dataoff,u_int16_t

l3num,u_int8_t

protonum,struct nf_conntrack_tuple *tuple, const struct nf_conntrack_l3proto *l3proto,const struct nf_conntrack_l4proto *l4proto)

memset(tuple, 0, sizeof(*tuple));

/*協議型別賦給tuple成員*/

tuple->src.l3num = l3num;

if (l3proto->pkt_to_tuple(skb, nhoff, tuple) == 0)

return false;

/*網路協議賦值*/

tuple->dst.protonum = protonum;

/*獲取傳輸方向*/

tuple->dst.dir = ip_ct_dir_original;

/*獲取l4層資訊*/

return l4proto->pkt_to_tuple(skb, dataoff, tuple);

export_symbol_gpl(nf_ct_get_tuple);

獲取sk_buff網路層資訊的具體操作如下:

struct nf_conntrack_l3proto

nf_conntrack_l3proto_ipv4

__read_mostly = ;

export_symbol_gpl(nf_conntrack_l4proto_tcp4);

函式tcp_pkt_to_tuple從傳輸頭首位址開始,讀取兩個8位元組的變數,分別賦給tuple中的源埠和目的埠。

static bool

tcp_pkt_to_tuple(const struct sk_buff *skb, unsigned int dataoff,

struct nf_conntrack_tuple *tuple)

2. 最後乙個重要的函式莫過於實現交換處理的函式nf_ct_invert_tuple(),由original tuple經過層層處理從而得到reply tuple,以達到最終目的。

nf_ct_invert_tuple(struct nf_conntrack_tuple *inverse,

const struct nf_conntrack_tuple *orig,

const struct nf_conntrack_l3proto *l3proto,

const struct nf_conntrack_l4proto *l4proto)

export_symbol_gpl(nf_ct_invert_tuple);

從**中可以清楚地看到同樣是l3和l4層分開交換處理,與獲取sk_buff資訊的處理步驟基本一致,此處不再贅述。僅附l4處理**。

static bool

tcp_invert_tuple(struct nf_conntrack_tuple *tuple,

const struct nf_conntrack_tuple *orig)

位址轉換NAT

為了解決ipv4位址短缺的問題,通過內網到外網出口的nat路由器 有nat功能的路由器 將許多的內網ip位址對映為少數的幾個外網ip位址,使得內網只有私有位址的計算機也能上網。內網pc向外網pc傳送請求,途徑某出口nat路由器 該路由器先檢視它自己是公網位址池,取出一條可用的公網位址,將 轉換前的源...

NAT位址轉換

一 nat網路位址轉換 正常資料 時,ip頭部的源和目的位址以及埠號是不會被更改的,而使用了nat 技術後,它將更改頭部內容以達實現隱藏內外部主機真實位址 多台主機共享少量ip訪問內外部網路 解決ip 位址空間重疊 伺服器負載均衡等功能 二 pat埠位址轉換 又叫網路位址埠轉換 napt 或nat的...

連線跟蹤nf conntrack tcp

nf conntrack tcp loose選項如果設定為0,對於未完成三次握手的流,核心連線跟蹤模組將不會為其建立conntrack結構。反之,值為0的話,將為任意收到的tcp報文建立conntrack結構。預設值為一,如下可通過proc檔案nf conntrack tcp loose,獲取其當前...