看過講的最精闢的NAT,不懂的人馬上也能懂!

看過講的最精闢的NAT,不懂的人馬上也能懂!
 
看過很多NAT的相關知識,也用過不少,最近又一次接觸了NAT.
回味了一下相關NAT的知識,發現還是這篇關於NAT的文章,講解最爲人性,精闢,通俗易懂!

現在進入正文

nat翻譯成中文就是網絡地址轉換,顧名思義也就是把一個IP地址轉換成另一個IP地址,有人問爲什麼轉換,我們就來看看。
    數據包中的IP頭部包含源IP地址,也就是發出這個包的源節點的IP地址,和目的IP地址,也就是這個包最終會被誰收到。
    舉個例子,有一夥犯罪團伙,有三名成員,毒蛇,老虎,老狼,爲了作案方便,他們都辦了×××,毒蛇成了毛蟲,老虎成了小白,老狼則辦了一張綿羊的×××。他們在窩點內部,直接用各自的真名來通話,作案的時候,他們對其他人來說,就是毛蟲,小白和綿羊,別人稱呼他們也是這三個名字。
    實際中,如果想隱藏自己的真實身份,那麼可以人爲的把源IP地址改成一個其他的IP地址,對方接受到之後,以爲消息就是從這個IP發了的,那麼他迴應的時候也使用這個地址作爲迴應消息的目的地址。目的地址處的nat設備,一旦收到這個消息,就把消息中的目的地址替換成發信人的真實ip地址,然後轉交給發信人。
   nat的出現其實最初是爲了解決IP地址不夠用的問題的,我們知道,IP地址中有一類私有地址,也就是大家誰都可以用的地址,就類似比如鼕鼕,娜娜這種名字,大家誰都可以用,但是你如果去辦×××,就不會讓你用這個名字。IP地址就2的32次方那麼多個,如果再有多餘的節點要分配地址,就不夠用了。那麼就提出用nat類解決。也就是,如果犯罪團伙中有10名匪徒,但是匪頭只成功地辦了5張×××,那麼每次只能有5個人拿着×××出去作案。剩下5個人只能在窩裏呆着。如果剩下的5個人想作案,那麼只能等到出去的5個人回來交班。一旦有外界要和匪幫聯繫,統統用假名字,匪頭根據×××假名字和真名字的對應,然後點匪(點名),讓對應的匪徒出去和外界交涉。但是有一天匪頭一想,這樣太浪費了,得找個機制,讓所有人都出動,他冥思苦想之後,出來一種辦法:讓多個人都用同一個×××,但是給他們再區分一下,比如綿羊:80和綿羊:8000就不是一個人,找綿羊80的,匪頭就告訴A匪,找綿羊8000的,匪頭就告訴B匪。這樣,終於全部出動了。這樣匪頭就可以只用一個×××,讓全體成員出動,呵呵。
   咱們還是別在這匪徒作案了,一會警察來抓我了呵呵。我們回到現實。目前企業申請一個IP,需要付錢給網通電信這樣的壟斷霸王,因爲負擔不起給企業中每個辦公室的每臺pc都配一個公網IP,也就是internet上每個人都能找到你的IP,通常企業都只申請一個IP,就像剛纔說的,那麼企業內部如果有多個人想和外界聯繫,他們用的源IP地址怎麼辦,那麼剛纔說過,大家都用這個IP做源IP地址,是個集體戶,那麼剛纔也說了,得有個區分機制,不能集體了就全部集體,那麼用什麼來做這個區分符號呢?冥思苦想,是否可以更改IP頭部結構,就像vlan id一樣,加入一個東西來區分?可以,但是全世界所有機器上運行的IP協議程序都要改,不行。對了,tcp不是有端口號的麼?而且和外界聯繫的時候,除了IP這一層,一定有一個傳輸層內容,比如tcp或者udp,而他們都有個端口號,也就是說除了源和目的IP地址,還要有源和目的tcp/udp端口號,我們就用這個已經存在在數據包中的端口號爲第二區分符。
   nat一共有4種具體實現,剛纔說的那種,10個人,5個×××,5個人幹活,5個人永遠呆在窩裏處理內務那種,叫做靜態nat,也就是一個對一個,如果有100個×××,10個匪徒,那麼這個匪頭比較歷害,10個匪徒都能出去作案。 第二種情況,也是剛纔那種情況,10個人,5個×××,但是大家都可以用,誰先搶來,誰就拿着出去作案,回來之後放到桌子上,沒輪到的再去搶,搶着了就出去,搶不着還呆着,這樣也就是同時只能有5名匪徒出去作案,但是全局意義上,每個匪徒都有機會出去。這叫做動態nat。第三種,10個匪徒,1個×××,大家都用這一個×××,但是可以同時出去作案,因爲他們還有二級區分符:端口號。這種叫做PAT,端口地址轉換,或者複用的nat轉換。第四種,動態nat+PAT,也就是10個人,5個×××,其中前4張×××用動態nat,大家來搶,誰先搶着是誰的,但是剩下一張,就給沒搶到的用pat方式共享,當然效果沒有一對一來的爽了。

我們來看看具體實現機制。
   看ppt:一個路由器,兩個接口,一個接外網,也就是isp接過來的,一個接內網,也就是和內網交換機連接。比如我現在就是內網的10。1。1。1這臺機器,我現在打算訪問[url]www.sina.com.cn[/url],大家說第一步是做什麼?對,是先進行dns解析,由於我機器上配置的dns,比如是202。102。134。68,我的機器判斷,這個dns服務器地址和本機地址不同在一個IP子網,那麼他準備先把這個包發給網關,然後讓網關來轉發到這個dns服務器上,所以我的機器會先發arp請求我設置的網關10。1。1。254的mac地址,請求到之後,機器立即組包,包的目的ip就是dns服務器的地址202。102。134。68,源地址就是本機IP地址:10。1。1。1,有了這個還不夠,IP只是定義了發信人和收信人的目的地,但是數據包到達之後提交給哪個上層應用來處理,必須利用tcp或者udp層的端口號來區別,所以IP頭部之上,我機器附加了一層udp層,因爲dns查詢數據包標準情況下使用udp來傳輸,比如我隨即選了一個我的源端口號,udp5555,那麼目的端口號,必須設定爲dns標準端口,也就是說對方一收到這個數據包就知道這個包是給dns程序使用的,需要提交給dns程序進行處理,所以目的udp端口設定爲:udp53,就是53號端口是dns程序的,傳輸層頭結束之後就是上三層的內容了,屬於應用特定的內容,隨應用不同而不同,我們就不必深究了。包組好了,下一步就是通過交換機發給網關了,這個步驟交換機會做,我們也不管。話說網關收到之後,提交給路由器中的程序進行處理,如果此時,路由器上沒有配置nat,那麼路由器直接查找路由表,發現這個地址應該從連接isp的接口發送出去,做轉發處理,路由轉發前面的課程已經說過,大家應該知道,如果包被直接轉發出去,那麼包將攜帶這10。1。1。1的源IP地址而出去。然後isp根據包的目的IP地址來路由該包,最終這個dns查詢包會被正確傳送到dns服務器。然後服務器應答的時候,以10。1。1。1作爲目的IP地址,同樣的過程,包發給dns服務器上配置的網關,此時問題發生了,那個網關是不會知道10。1。1。1這個地址怎麼走的,因爲10網段的地址被internet地址分配機構定義爲私用地址,就像要去廣播電臺尋人啓事,我用要找的人的小名可以麼?當然不行!一個道理!比如現尋找名爲鼕鼕的小朋友,這樣電臺雖然可以這樣廣播,但是電臺會麼?不會,電臺必須讓你說出大名,也就是×××上的名字。所以以目的地址10。1。1。1的包,是進制被傳送到internet上做路由的,因爲大家都不會用這個地址暴露在internet上,你就算路由出去,又有什麼用?沒用!我說一個有趣的例子,我曾經用adsl撥號上網的時候,獲得的地址和網關都是公網地址,但是我ping 192。168。1。3,竟然通了,所以說不要人爲私有地址是不可internet路由的,這個理解是錯誤,正確說法是一般情況下禁止在internet上路由私有地址(mpls之類的特殊技術可以路由私有地址),剛纔那個例子,就是典型的isp路由器上配置沒有過濾掉這些私有地址造成的,過了一段時間之後,再ping就不通了。
  好拉回話題來,剛纔說了,私有地址禁止在公網出現,那麼10。1。1。1最終怎麼查詢到dns的?答案就是nat。我們看看配置了nat的路由器怎麼處理這個包。10。1。1。1發出的dns查詢包被路由器收到之後,路由器首先檢查nat配置,這裏我們用靜態nat爲例。靜態nat需要手動提前配置好,比如我們這裏配置成:211。64。208。2-----10。1。1。1,入端口爲內網口,出端口爲外網口,注意,端口很重要,nat必須依託於端口!也就是說,路由器收到包之後先根據目的IP做路由查找,找出這個包將要發送到哪個端口,如果那個端口上配置有nat,那麼這個包還必須經過nat處理,nat處理的時候,路由器會查看源IP而不是目的IP,由於我們配置了211。64。208。2-----10。1。1。1,所以路由器一看源IP地址是10。1。1。1,就把10。1。1。1替換成211。64。208。2,然後通過那個端口轉發出去,那麼經過nat轉換的包,源地址變成了211。64。208。2,這樣dns迴應的時候用這個地址作爲目的IP地址,就可以被髮送到本地路由器接收了。接受到的包,和發送包時候順序恰好相反,路由器一看該端口上配置有nat,那麼對接受到的包,現作nat檢查,因爲211。64。208。2-----10。1。1。1,所以他把包的目的(注意,不是源)地址逆向替換,也就是將211。64。208。2替換成10。1。1。1,然後再做路由查找,找到出接口,也就是內網接口,然後發送給10。1。1。1,結束。
   以上講了靜態nat,動態nat和靜態差不多,就是誰先誰用的原則。
下面講講pat,也就是利用傳輸層端口來區分同IP地址的不同數據流。
    同樣是上面的例子,如果此時我只買了一個公網地址,也就是211。64。208。1,那麼只能大家公用了。我們來看看流程。同樣,10。1。1。1這個節點發出dns查詢包,源地址10。1。1。1,目的地址爲dns服務器地址202。102。134。68,然後目的端口號udp53,源端口號udp5555。我們知道,路由器,一般情況下,他是不關心IP層之上的內容的,就像剛纔靜態nat的例子,沒有涉及到傳輸層的內容,但是在pat中,必須檢查。接着說,路由器收到這個包之後,首先根據目的IP做路由查找,找到將要發送出去的出口,爲外網口,然後因爲做了pat在內網口和外網口之間,那麼路由器就要將這個包pat一下,具體動作是:將源IP10。1。1。1替換成211。64。208。1,然後再將源端口號,如果這個端口號已經被其他人佔用,那麼就替換成隨即選擇的,如果還沒有被佔用,那麼保持不變,看ppt中的圖示。大家可以看到10。1。1。2已經佔用了211。64。208。1的8790端口,那麼雖然10。1。1。1發出包的源端口是8790,但是路由器收到之後,就不能用8790,得隨即選擇一個,這裏他選擇了211。64。208。1:8000端口,然後將這個事件記錄到pat表中。經過這樣處理的包,最終被髮送出去,在isp中路由,最終路由到目的:dns服務器,然後dns服務器迴應包,利用211。64。208。1作爲目的IP,源IP還是dns服務器地址,目的端口,就是收到包時候的端口號:udp8000,原端口,就是udp53。然後這個迴應包被本地路由器收到,他一看是從配置了pat的接口上進來的,那麼他先反pat處理,參照pat表,將目的IP變爲10。1。1。1,然後目的端口變爲8790,然後做路由查找,找到10。1。1。1對應的出接口,也就是內網接口,然後發送給10。1。1。1,結束。
至此,nat和pat講完了,至於動態nat+pat,完全是程序做了一些修改而已,原理剛纔也說了,具體過程就不多講述了。
最後強調一點:nat不僅僅可以私有地址到公網地址的轉換,任何兩個IP之間都可以轉換,什麼地址都行。不要形成思維定勢。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章