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;规则,来告诉核心哪