防火墙软件Netfilter之NAT技术本文档主要描述怎样进行IP伪装(masquerading)、透明代理(transparent proxying)、端口转发(port forwarding)和其他形式的网络地址翻译技术。 1.什么是网络地址翻译NAT(Network Address Translation)? 当一个包在网络上传输时,从它的源地址(例如你自己的主机)到达目的地址(例如www.yahoo.com),中间经过很多节点和网络。这些节点通常不会改变你的包。他们仅仅转发你的包。 如果一个节点执行NAT,他将会修改包的源或目的地址。通常这个节点会记住他怎样修改了这个包,因此当相应的应答包从另一个方向到达时,他知道如何反向修改这个应答包。 2.为什么要使用NAT? 2.1.用modem上网 大多数的ISPs只给你提供一个IP地址。你可以以任何源地址发出包,但是只有包含这个IP地址的包的应答包才会到达你的网络。如果你想使用多台机器(比如有个自己的网络)利用这个IP地址上网。需要NAT。 这是NAT使用得最为常见的情况,在linux的世界里称为IP伪装(masquerading)。又称之为SNAT,因为你要改变包的源地址。 2.2.Multiple Servers 有时候你想改变到达你的网络的包的去向。通常因为你只有一个IP地址,但是你又想用户到达这个真实IP地址之后的各个机器。方法是修改这些包的目的地址,让他们到达不同的机器。 还有就是用于负载均衡。这种类型的NAT在linux上叫做端口转发(port-forwarding)。 2.3.Transparent Proxying(透明代理) 透明代理是在你的网络和外部世界之间的程序,所有的进或出都要经过这个代理。之所以叫做“透明”,因为你的网络无需考虑他的存在。 例如,squid软件能够配置为透明代理。 3.两种类型的NAT NAT有两种类型:Source NAT(SNAT)和Destination NAT(DNAT)。 源NAT是指改变连接的第一个包的源地址。他是在路由之后做,即在包到达网线之前处理。IP伪装属于源NAT。 目的NAT是指改变连接的第一个包的目的地址。他是在路由之前做。端口转发、负载均衡、透明代理都属于目的NAT。 4.仅仅需要IP伪装 这是大多数用户的要求。如果你有一个动态分配IP地址的PPP拨号连接,你仅仅想让你的内部网络发出的包发生改变,就像是从这个PPP拨号所分配的IP地址所发出的。如下: # 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 这里假设你没有做包过滤。 5.端口转发 例如,要将1.2.3.4:8080变为192.168.1.1:80: # 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 如果想让本地网络的机器适用于上面的规则,例如,本地机telnet 1.2.3.4 8080,就转变为telnet 192.168.1.1 80。可以在OUTPUT chain中插入规则: iptables -A OUTPUT -t nat -p tcp -d 1.2.3.4 --dport 8080 -j DNAT --to 192.168.1.1:80 6.控制NAT 你可以创建NAT规则来告诉内核改变哪些连接,以及怎么改变。同样,我们使用iptables工具。用选项“-t nat”来表示需要修改NAT表。 NAT表中包括3个chain:PREROUTING(用于目的NAT)、POSTROUTING(用于源NAT)、OUTPUT(用于本地产生的包的目的NAT)。如下图: _____ _____ / / PREROUTING -->[Routing ]----------------->POSTROUTING-----> D-NAT/ [Decision] S-NAT/ | ^ | __|__ | / | | OUTPUT| | D-NAT/ | ^ | | --------> Local Process ------ 更多相关文章
|
推荐文章
精彩文章
|