又乙個Linux的雙向stateless NAT

2021-08-27 12:33:01 字數 2011 閱讀 3308

如果看一下iproute2的help,就會發現在route section中有乙個nat action,其中via的引數給出了轉換的位址。具體的配置就不說了,只提出兩點,第一,iproute2的stateless nat需要policy routing的參與,第二,它在2.6核心中被去除了;具體資訊可以參見

文件。在2.6核心中,核心協議棧將一切的擴充套件都留給了netfilter來實現,自己只實現標準的最小集。

為什麼要提到2.4核心的nat route呢?既然已經被掃除了,既然在netfilter中實現nat具有哲學意義,既然我自己也基於netfilter實現了乙個

雙向的stateless nat,那舊事重提又有什麼意義呢?我對老婆說,我說出的任何話,做出的任何事,背後都有一套可以自圓其說的理論,不管它多麼荒謬,但是可以自圓!因此我現在又想實現乙個stateless nat時,也需要乙個理論支撐,就是:將nat塞入路由表中是合理的,因為nat受影響的就是路由(不管是本地路由還是遠端的路由),直接在路由中做掉會更好。由於pre/post-routing的中間點就是路由,何不把nat統一合併在路由中來呢?雖然這不太符合netfilter的哲學,然而對於實用主義來說,這太好不過了!2.4核心實現的nat route之所以不好,除了哲學原因之外還有**的原因,那段實現**太亂了!

如果按照上述的思路來實現nat route,根本不用policy routing,不需要配置ip rule,不需要配置兩條規則,它的流程圖如下,**也比較好修改:

可以看出,這個實現使用了遞迴路由查詢這個linux根本就沒有實現的東西。因此需要修改路由插入的部分**,而我使用了幾個flag來識別該條路由是做nat用的,由於是stateless的雙向nat,因此當你插入一條nat路由的時候,另外乙個方向的就必須自動生成,比如你插入了一條以下的路由:

ip route add dnat x via y

指示所有的目標是x的都要轉換成y,那麼以下的路由必須自動生成:

ip route add snat y via x

指示所有源位址為y的都要轉換為x。當然以下的這一條不應該手工配置,應該用auto標號指名它是自動生成的。

以上的需要說明是snat,原則上snat是在路由之後進行的,否則可能會做無用功,那流程圖為何在路由前snat呢?這是為了最小化查詢,否則也會做很多無用的查詢,將要對所有的資料報都進行是否需要snat的查詢,這裡用到的乙個技巧就是路由查詢是基於最長字首匹配的,如果有需要snat的,那麼肯定會有一條明細的32位字首的snat路由,如果沒有,那就說明沒有需要snat的。當然上面的流程圖還可以優化,因為我們認識到,由於是雙向的nat,那麼只要有乙個dnat,就會有乙個snat,反過來也一樣,都是成對出現的,基於這點是否能做點優化呢?

提到了遞迴查詢,不得不多說一點,既然已經引入了snat,dnat標誌,那麼能否再引入乙個

recursion標誌用於指示常規的遞迴路由呢?我覺得是可以的,這樣實現的遞迴路由更加簡單了,一切都在插入時決定,由於nat是遞迴的一種,那麼可以如下定義:

#define rtn_

recu

rtn_snat|rtn_dnat|rtn_***

遞迴路由的插入演算法流程如下:

2.4核心還在的nat route如今不在了,想實現乙個還要重新編譯核心,不過還好,還是實現了!這種nat route不需要netfilter支援,不需要在核心中引入其它的map,在非路由查詢層面不需要對每乙個資料報進行匹配,完全是一條路由表項,可以借助於核心中的各種路由查詢演算法來優化。不過cisco的官方ccie教程中說,使用遞迴路由查詢需要權衡,並且明確指名,遞迴查詢無疑會消耗更多的cpu!

然而這個基於遞迴路由查詢實現的nat是多麼的簡單又多麼的對稱,雖然將nat塞入路由表比較有爭議,但是試試看之後,結果還是不錯的。linux本來就是逐漸試出來的,根本就沒有什麼背後的哲學,和學院派的bsd相比,linux的特點和優勢不就是不拘一格麼?

又乙個迷宮

有乙個迷宮,迷宮裡有乙個人,迷宮是規格為 n n 的方格,房內特定位置上有障礙物,人處於某一位置,可以選擇向上下左右方向前進,但是要保證面對的不是牆壁或是障礙物,否則無法向前行走。輸入迷宮的規格,乙個正整數 n 2 n 100 佔一行,代表矩陣大小 輸入方形矩陣 n 行 n 列,由 0 和 1 組成...

又乙個通宵

敲了一晚上的 閒下來摸魚寫了下字是孟浩然的 宿業師山房期丁大不至 宿業師山房待丁大不至 夕陽度西嶺,群壑倏已暝。松月生夜涼,風泉滿清聽。樵人歸欲盡,煙鳥棲初定。之子期宿來,孤琴候蘿徑。描寫詩人在山中等候遲遲未到的友人的場景 可以看看古詩詞網的賞析 傳送門 想起來這首詩也是我與師弟最後一起寫的呢 雖說...

又乙個WordPress部落格

經過兩天的折騰,終於初步搞定了wordpress。wordpress是一款基於php的內容發布系統,或者說部落格系統,所以,首先得配置乙個php的環境。先從網上下了x86版本的php安裝包,但還不能馬上安裝,因為php在iis中有三種擴充套件方式 cgi isapi fastcgi,據說最後乙個是最...