萬盛學電腦網

 萬盛學電腦網 >> Linux教程 >> Linux 2.4 NAT HOWTO

Linux 2.4 NAT HOWTO

class="22221"> 作者:Rusty;Russell,;mailing;list;[email protected]
譯者:網中人;[email protected]
v1.0.1;Mon;May;1;18:38:22;CST;2000;


--------------------------------------------------------------------------------
本文件描述如何用;2.4;Linux;核心去做;masquerading、transparent;proxying、port;forwarding、和其它類型的;Network;Address;Translations;。;
--------------------------------------------------------------------------------



--------------------------------------------------------------------------------

1.;Introduction
親愛的讀者,歡迎您!;


您將要探索的是引人入勝(有時蠻恐怖)的;NAT(Network;Address;Translation);世界,同時,您甚至可以把這份;HOWTO;當成;Linux;2.4;核心及以後版本的精確指南呢。;


在;Linux;2.4;裡面,有一個叫;`netfilter';的東東,它是專門撕裂;(mangling*;)封包的。在它再上一個層級,就是提供;NAT;功能的了,則是完全由以往的核心實作而成的。;


(譯者注:很奇怪,原作者用;mangle;這一詞,似乎在過往的中文文件中都沒碰到過,查過好多字典都不知道怎麽翻譯好。這裡暫時勉強用‘撕裂’這個詞代替,不過後面我就不嘗試翻譯這詞了,讓讀者自己去理解吧。);



--------------------------------------------------------------------------------


--------------------------------------------------------------------------------

2.;官方的網站和通信論壇何處覓?
目前有三個官方網站可供浏覽:;

感謝;Filewatcher;(http://netfilter.filewatcher.org).;
感謝;The;Samba;Team;and;SGI;(http://www.samba.org/netfilter).;
感謝;Jim;Pick;(http://netfilter.kernelnotes.org).;

而官方的;netfilter;郵件論壇,則可以到這裡看:;Samba's;Listserver;(http://lists.samba.org).;


2.1;何為;Network;Address;Translation?;
一般來說,在網路上封包從其來源(比方您家中的電腦)出去,然後到達目的地(比方www.kernelnotes.org),會經過許許多多個不同的連接(links):就我所在的澳洲來說就大約有;19;個之多。沒有任何一個連接會真的去更改您的封包:他們僅僅是將之傳送出去而已。;


假如其中一個連接會做;NAT;的話,然後它們就會更改那些經它而過的封包之來源或目的地地址。誠如您能想像得到的,這並非系統被設計成這樣的,而是;NAT;所做的手腳而已。通常要做;NAT;的連線會記住它如何;mangled;封包的,然後當回應封包從另一方向過來的時候,然後就反過來;mangling;那個回應封包,所以所有東西都工作起來了。;


2.2;為什麽我要做;NAT;呢?;
在完美的世界裡,您無需這樣做啦。在目前來說,還是有其理由的:;


用;modem;撥接上網
大多數的;ISP;在您連上去的時候只會給您一個單一;IP;地址。您喜歡的話,以任何來源地址把封包送出去都行,但只有回應到這個來源地址的封包才可以回到您那裡。如果您想用多台不同主機(例如家中網路)透過該連接上;internet;的話,那您就要;NAT;了。;


這也就是今天;NAT;最常用之處,而在;Linux;世界最為人知的就是所謂的;`masquerading(封包偽裝術)';了。我稱之為;SNAT,因為您改變了第一個封包的;source(來源);地址的緣故。;


多重伺服器
有時候,您會想去改變那些進入您網路的封包之路向。這最常是因為(如上述)您只有一個;IP;地址,但您卻想讓別人能夠連接到;`真實';IP;地址後面的主機去。如果您重寫這些內送封包的目的地址,這樣您就可以管理它們了。;


一個常見的變動是負載分擔(load-sharing),也就是在一組機器上面為封包做映對(mapping)的動作。這類型的;NAT;,在以前的的;Linux;版本中也就被稱為;port-forwarding;。;


透明代理(Transparent;Proxying)
有時候,您或許想要每一個經過您的;Linux;主機的封包送至主機本身的一個程式去。這就需要進行透明代理的動作了:一個代理就是一個位於您的網路和外部網路的程式,為彼此雙方負起溝通的任務。而所謂的透明,則是因為您的網路甚至無須知道在和一個代理對講,當然了,除非代理不再工作了吧。;


Squid;可以配置成這樣的工作方式,這就是在過往的;Linux;版本中所謂的重導向(redirection)、或透明代理了。;



--------------------------------------------------------------------------------


--------------------------------------------------------------------------------

3.;兩種類型的;NAT
我將;NAT;分為兩種不同的類型:;Source;NAT;(SNAT);與;Destination;NAT;(DNAT);


Source;NAT;就是您將改變第一個封包的來源地址:例如,您為傳入的連線做;caching;的動作。Source;NAT;永遠會在封包傳出網線之前就做好;post-routing;的動作。封包偽裝(Masquerading)就是一個;SNAT;特例。;


Destination;NAT;就是您將改變第一個封包的目的地地址:例如您要為傳出的連線做;caching;的動作。Destination;NAT;永遠會在封包從網線進入之後就馬上做好;pre-routing;的動作。Port;forwarding、負載分擔、以及透明代理,都屬於;DNAT。;



--------------------------------------------------------------------------------


--------------------------------------------------------------------------------

4.;從;2.0;到;2.2;核心的快速轉變
非常抱歉,假如您仍然忙於從;2.0(ipfwadm);到;2.2(ipchains);的轉型的話。不過,這也是個喜憂參半的消息啦。;


首先,您可以輕易的一如往昔地使用;ipchains;和;ipfwadm。要這樣做的話,您需要將最新的;netfilter;套件中的;`ipchains.o';或;`ipfwadm.o';核心模組載入。它們是相互排斥的(您應已獲警告了),同時也不能和其它;netfilter;模組同時整合在一起。;


一旦其中一個模組被載入,您就可以如常使用;ipchains;和;ipfwadm;了,但也有如下一些變化啦:;


用;ipchains;-M;-S,或是;ipfwadm;-M;-s;作偽裝逾時將不再有效。因為逾時設定已經移至新的;NAT;架構中,所以這裡也就沒什麽所謂了。;
在偽裝列表中顯示的;ini_seq、delte、和;previous_delta;欄位,將永遠為零。;
同時歸零(zeroing)和列示記數器(counter)的;`-Z;-L';已無作用:記數器將不能再歸零了。;
Hacker;們仍要留意之處:;


您現在可以捆綁;61000-65095;之間的埠口,而無需理會您是否使用封包偽裝技術。在過去,封包偽裝程式會把此值域內的所有東西捕獲進來,所以其它程式就不可用之了。;
至於(尚未成文之);getsockname;破解,在過去,透明代理程式可以找出那些不再有效連線之真正目的地。;
至於(尚未成文之);bind-to-foreign-address;破解,同樣尚未實作;這在過去用以完善透明代理的構想。;

4.1;救命啊!我只想要封包偽裝而已!;
沒錯,這也是大多數朋友之需。如果您用;PPP;撥接獲得的動態;IP;(如果您不了解的話,那您應該是了),您或許只想單純告訴您的主機讓所有來自您內部網路的封包,看起來如來自該;PPP;撥接主機一樣。;


#;Load;the;NAT;module;(this;pulls;in;all;the;others).
modprobe;iptable_nat

#;In;the;NAT;table;(-t;nat),;Append;a;rule;(-A);after;routing
#;(POSTROUTING);for;all;packets;going;out;ppp0;(-o;ppp0);which;says;to
#;MASQUERADE;the;connection;(-j;MASQUERADE).
iptables;-t;nat;-A;POSTROUTING;-o;ppp0;-j;MASQUERADE

#;Turn;on;IP;forwarding
echo;1;>;/proc/sys/net/ipv4/ip_forward

注:您這裡並沒做任何封包過濾:如要的話,請參考;Packet;Filtering;HOWTO:將;NAT;和封包過濾合並起來就是了。;


4.2;那;ipmasqadm;怎麽了?;
這個其實取決於使用者而已,所以我並不是很為向後兼容問題而擔心。您可以單純使用;iptables;-t;nat;做;port;forwarding;的動作。例如,在;Linux;2.2;您或許已經這樣做了:;


#;Linux;2.2
#;Forward;TCP;packets;going;to;port;8080;on;1.2.3.4;to;192.168.1.1's;port;80
ipmasqadm;portfw;-a;-P;tcp;-L;1.2.3.4;8080;-R;192.168.1.1;80

而現在,如此則可:;


#;Linux;2.4
#;Append;a;rule;pre-routing;(-A;PREROUTING);to;the;NAT;table;(-t;nat);that
#;TCP;packets;(-p;tcp);going;to;1.2.3.4;(-d;1.2.3.4);port;8080;(--dport;8080)
#;have;their;destination;mapped;(-j;DNAT);to;192.168.1.1,;port;80
#;(--to;192.168.1.1:80).
iptables;-A;PREROUTING;-t;nat;-p;tcp;-d;1.2.3.4;--dport;8080;
-j;DNAT;--to;192.168.1.1:80

假如您想讓這條規則同時修改本機連線的話(如,即使在;NAT;主機本身,要連接;1.2.3.4;的;8080;埠口之;telnet;連線,會幫您連接至;192.168.1.1;的;80;埠口),您就可以插入相同的規則至;OUTPUT;鏈中(它只適用於本機傳出的封包):;


#;Linux;2.4
iptables;-A;OUTPUT;-t;nat;-p;tcp;-d;1.2.3.4;--dport;8080;
-j;DNAT;--to;192.168.1.1:80



--------------------------------------------------------------------------------

--------------------------------------------------------------------------------

5.;控制哪些要;NAT
您需要建立一些;NAT;規則,來告訴核心哪
copyright © 萬盛學電腦網 all rights reserved