有關NAT和路由之間的先後順序

2021-05-24 01:48:10 字數 1719 閱讀 9078

昨天在模擬器複習nat實驗,對nat時候要設定預設路由的關係去搜了一下,結果搜到一篇講nat和路由先後順序的實驗:http://raulkang.blog.51cto.com/210239/106508  ,看了之後更糊塗了。而且覺得沒有必要搞那麼複雜的實驗,自己用兩個路由器實驗看看。一開始,在後端的路由器上debug ip pack發現開了nat,收到的包源ip就是nat轉換後的ip;關掉nat,收到的包源ip是未轉換的ip。這樣看起來,感覺應該是nat優先順序更高。但是,很多帖子(https://learningnetwork.cisco.com/message/55778)講思科官方文件是先路由後nat,很不明白。

直到找到這篇:http://hi.baidu.com/gotoccie/blog/item/2064600634fa8d7b020881b8.html,看完就很明白了。

在自己的拓撲中,從inside的pc上ping單個包測試, 前端配置了nat的路由器上,debug ip pack, debug ip nat 輸出:

*mar  1 01:28:32.728: ip: tableid=0, s=172.16.8.5 (ethernet0/0), d=63.19.6.1 (ethernet1/0), routed via fib

先查fib確定出口

*mar  1 01:28:32.728: nat: s=172.16.8.5->200.1.8.7, d=63.19.6.1 [37411]

可以理解為在去出口的路上,發現配置了nat,把源ip替換掉

*mar  1 01:28:32.728: ip: s=200.1.8.7 (ethernet0/0), d=63.19.6.1 (ethernet1/0), g=200.1.8.8, len 48, forward

替換源ip後,繼續**包

*mar  1 01:28:32.732: nat*: s=63.19.6.1, d=200.1.8.7->172.16.8.5 [37411]

返回的應答包,目的ip替換回當初傳送時對應的源ip

然後再查路由表**,因為這裡ping的機器是直連,所以沒有這步

在後端路由器上 debug ip pack的輸出:

*mar  1 01:28:32.928: ip: tableid=0, s=200.1.8.7 (ethernet1/0), d=63.19.6.1 (ethernet0/0), routed via rib

*mar  1 01:28:32.933: ip: s=200.1.8.7 (ethernet1/0), d=63.19.6.1, len 48, rcvd 4

收到ping包

*mar  1 01:28:32.933: ip: tableid=0, s=63.19.6.1 (local), d=200.1.8.7 (ethernet1/0), routed via fib

*mar  1 01:28:32.937: ip: s=63.19.6.1 (local), d=200.1.8.7 (ethernet1/0), len 48, sending

應答ping包

先查路由表確定出口,因為目的位址是確定的並且直接決定出口。找到出口後,如果有nat就替換源ip,如果沒有nat就不替換。所以,之前看到的開nat就替換不開nat就不替換,並不是nat優先順序更高,而是nat處於路由**之後,更接近出口的緣故。

這是nat從內向外,先查路由再nat的順序。從外向內的方向,順序相反。因為從外向內的包,如果不先nat把目的ip替換為內部ip的話,是不可能在路由表中查到對應**規則的。

關於 define 定義的先後順序

define定義先後順序 今天檢視 的過程中,看到如下巨集的定義 size of malloc pool define cfg malloc len cfg env size 1024 1024 define cfg env size 0x4000 給我的第一感覺就是,是不是其他地方有cfg env...

Python變數的引用先後順序

python引用變數的順序 當前作用域區域性變數 外層作用域變數 當前模組中的全域性變數 python內建變數 一 global global關鍵字用來在函式或其他區域性作用域中使用全域性變數。但是如果不修改全域性變數也可以不使用global關鍵字。gcount 0 defglobal test p...

Linux 裝置和驅動載入的先後順序

linux驅動先註冊匯流排,匯流排上可以先掛 device 也可以先掛 driver 那麼究竟怎麼控制先後的順序呢。linux 系統使用兩種方式去載入系統中的模組 動態和靜態。靜態載入 將所有模組的程式編譯到 linux 核心中,由 do initcall 函式載入 核心程序 init main.c...