天天看點

Linux 2.4 NAT (網絡位址轉換) HOWTO(四)

有些協定是并不想要做 NAT 的。對于每一個這樣的協定而言﹐有兩個延伸設定(extension)是必須要寫清楚的:一個是關于協定之聯機追蹤﹐另一個關于實際的 NAT。

在 netfilter 發行套件裡面﹐有一些關于 ftp 的現行子產品﹕ip_conntrack_ftp.o 與 ip_nat_ftp.o 。如果您把這些插入到您的核心裡面(或您永久性的編譯它們)﹐那麼要在 ftp 聯機上做任何種類的 NAT 都是可行的。如果您不這樣的話﹐那您可以使用被動模式 ftp﹐不過如果您要做一些動作甚于簡單 Source NAT 的話﹐這就可能不那麼可靠了。

如果在一個聯機上做 NAT﹐所有 <b>雙向</b> (傳出和傳入) 的封包﹐都必須要通過 NAT 主機才 行﹐否則并不可靠。尤其在聯機追蹤程式重組碎片 (fragments)的時候﹐也就是說﹐不但聯機追蹤會不可能﹐而且您的封包根本就不能通過﹐因為碎片會被擋下。

<b></b>

如果您要做 SNAT﹐您會想要确定經過 SNAT 封包所傳給的主機會将響應送回給 NAT 主機。例如﹐如果您映對某些傳出封包到來源位址 1.2.3.4 之上﹐那麼� 部的路由器就必須知道要将響應封包(<b>目的地</b>為1.2.3.4 )送回給該主機。這可以用如下方法做到﹕

1.     如果您要在主機自己的位址(路由和其它所有運作皆正常)上面做 SNAT﹐您無需做任何動作。

2.     如果您要在一個在本機網絡上尚未使用的位址做 SNAT(例如﹐映對到在 1.2.3.0/24 網絡上的一個可用 IP 1.2.3.99)﹐您的 NAT 主機就需要響應關于該位址的 ARP 請求﹐一如它自己本身的一樣﹕最簡單的方法就是建立 IP alias﹐例如﹕

3.  # ip address add 1.2.3.99 dev eth0

4.     如果您要在一個完全不同的位址上做 SNAT﹐您就要确定 SNAT 封包抵達的機器能夠路由回該 NAT主機。如果 NAT 主機是它們的預設網關的話﹐是可以做到的﹐否則﹐您就要廣告(advertize )一個路由(如果跑路由協定的話)﹐或是手工的在每一台參與機器上增規則

如果您要做 portforwarding 回到同一個網絡﹐您要确定前向和響應封包雙方都經過該 NAT 主機(這樣它們� 能被修改)。NAT 程式從現在開始(2.4.0-test6以後)﹐會擋掉後面情形所産生的傳出 ICMP 重導向﹕那些已經 NAT 的封包以它所進入的相同界面傳出﹐而接收端伺服器仍嘗試直接響應到用戶端(不認可該響應)。

經典的情形是内部人員嘗試連接配接到您的 `公有(public)' 網站伺服器﹐實際上是從公有位址(1.2.3.4) DNAT 到一個内部的機器(192.168.1.1)去﹐就像這樣﹕

一個方法是跑一台内部 DNS 伺服器﹐它知道您的公有網站的真正(内部) IP 位址﹐而将其它請求轉傳給� 部的 DNS 伺服器。換而言之﹐關于您網站伺服器的記錄會正确地顯示為内部 IP 位址。

而另一個方法是同時讓這台 NAT 主機将該等聯機之來源 IP 位址映對為它自己的位址﹐我們可以像如下那樣做(假設 NAT 主機之内部 IP 位址為 192.168.1.250)﹕

因為 <b>PREROUTING</b> 規則是最先執行的﹐對内部網站伺服器而言﹐封包就已經被定向好了﹕我們可以内定好哪個為來源 IP 位址。

首先感謝在我工作期間相信 netfilter 的構想并支援我的 WatchGuard 和 David Bonn。

以及所有其他幫我指正 NAT 之不足的朋友﹐尤其是那些讀過我的日記的。

Rusty.

本文轉自 makewong 51CTO部落格,原文連結:http://blog.51cto.com/makewong/565362,如需轉載請自行聯系原作者

繼續閱讀