關於linux中nat實現的一些思考

來源:互聯網
上載者:User

DNAT主要是用於保護nat內側的伺服器,針對外部主動串連內部的情形,而SNAT恰恰相反,為了保護和限制內部的網路客戶機,針對的是內部主動串連外部的情形,在linux中,nat是基於串連跟蹤模組起作用的,串連跟蹤模組將每一個資料包試圖和一個串連關聯,結果就是要麼這個資料包屬於一個已經存在的串連,要麼這個資料包不屬於任何一個已經存在的串連,這種情況下串連跟蹤模組將要為此資料包建立一個串連,顯然該資料包是這個串連的第一個資料包。如果一個串連正好匹配一條nat規則,那麼該規則將附著在表示這個串連的結構體上,在linux中就是ip_conntrack結構體,而這個nat的規則就處於該結構體內,表示為ip_nat_info,其中ip_nat_info_manip類型的數組表示了該串連每一個HOOK點的每一個方向的nat轉換規則,我們知道linux中關於nat一共具有4個HOOK點,post-routing和local-in為snat點,而pre-routing和local-out為dnat點,同時如果一個串連命中了上述的hook點,那麼相反方向的對稱HOOK點自動命中,也就是說,如果在post-routing上執行snat,那麼對於同一個串連,如果有資料進來,那麼就要在pre-routing上執行dnat,因此ip_nat_info_manip類型的數組個數最多為6個,分別為為pre-routing<=>post-routing,local-in<=>local-out,local-out->post-routing,pre-routing->local-in,可以看出,每個HOOK點上是轉換源地址還是轉換目的地址是固定的,並不因為你是配置SNAT還是配置DNAT而有所改變,那為何還要區分snat和dnat呢?詳情請看RFC,這裡說一個顯而易見的原因,因為nat的實現是基於串連的,那麼就有誰發起這條串連的問題,如果nat中不分方向的話,也就是說設定了snat那麼相反方向的dnat自動生效的話,就會導致很多無用的邏輯被執行,舉個例子,外部網路有一個主機想串連內部網路,由於對內部網路設定的snat自動生效了外部存取內部的dnat,那麼串連管理鉤子發現這個串連之後會初始化一個新的串連結構體,然後交給nat鉤子,由於發現了一條規則,於是進行地址轉換,然後繼續傳給別的過濾鉤子,一般情況下,內部客戶主機是不允許被動串連的,因此很多這樣的外部串連內部客戶機的請求都會被防火牆拒絕,因此前面那個地址轉換就沒有任何意義,如果真的需要外部存取內部伺服器,那麼就專門配置一個dnat,而不能依賴snat的回應這種隱式的dnat。
     對於nat還有兩個問題需要注意,第一個是內部客戶機用公網ip訪問內部伺服器的情況,這時就需要在網關配置一個迴環nat,也就是說在內網的介面對於進來的包且訪問內網伺服器的串連同時進行snat和dnat,snat將內網客戶機的ip改為一個公網ip,dnat將公網的伺服器ip改為內網伺服器ip,返回的包做逆向操作,設定迴環nat的原因在於如果不設定迴環nat,那麼客戶機的請求還是可以到伺服器的,但是伺服器通過查看請求的源地址,發現是同一網段的,於是就會直接向客戶機發送回複而不會發給網關,此時客戶機收到伺服器的直接回複之後就會因為源地址不對而丟棄該回複(伺服器的源地址應該是一個公網的地址);第二個問題就是為何在local-in和local-out上會有nat的發生,這是專門為nat網關進程設定的,由於資料包從本地產生或者流向本地,那麼對於本機流出的資料來講,pre-routing其實就是local-out,而對於流向原生資料,post-routing其實就是local-in,那麼為何在pre/post-routing上安裝nat鉤子,這個問題的回答真的不是很容易,需要在路由,過濾,nat之間尋找平衡點,找平衡點的方法就是根據多條資料流向不同的串連,在{路由代價,過濾代價,nat代價}三元組中尋找代價最小的,對於出去的資料,路由和過濾完結後進行nat是一個很好的選擇,對稱的講,dnat就要放在過濾和路由之前,然後snat的應答uu-snat也就是dnat的位置和原始dnat的位置重合是個最簡化的設計,最後為了迎合非foward的資料包,出現了local-in和local-out兩個與pre-routing和post-routing相對於foward對稱的點,從拓撲上看,linux的nat就是一個馬鞍面的設計,這種馬鞍面沒有極值點,但是擁有最平衡點。
    最後,雖然核心的netfilter提供了5個HOOK點,但是對於iptables工具 + 生產力來講這5個HOOK點並不是可以隨意組合的,比如filter就不能在pre-routing和post-routing上掛載鉤子,只能在local-in,local-out,foward上掛載鉤子,另外nat不能在post-routing上掛載dnat,這些限制也不是不可能截除,只是iptables提供了最佳的組合策略,其餘的組合將是沒有多大意義的,另外就是這樣能使得配置防火牆和nat更加簡單一些,一切配置標準完全依照iptables的建議進行,正如上面分析馬鞍面式的nat一樣,整個iptables的建議就是一個更大的馬鞍面,而netfilter只是一個平面,iptables將它折成了馬鞍面。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.