l 用modem上网
大多数的ISPs只给你提供一个IP地址。你可以以任何源地址发出包,但是只有包含这个IP地址的包的应答包才会到达你的网络。如果你想使用多台机器(比如有个自己的网络)利用这个IP地址上网。需要NAT。
这是NAT使用得最为常见的情况,在linux的世界里称为IP伪装(masquerading)。又称之为SNAT,因为你要改变包的源地址。
l Multiple Servers
有时候你想改变到达你的网络的包的去向。通常因为你只有一个IP地址,但是你又想用户到达这个真实IP地址之后的各个机器。方法是修改这些包的目的地址,让他们到达不同的机器。
还有就是用于负载均衡。这种类型的NAT在linux上叫做端口转发(port-forwarding)。
l Transparent Proxying(透明代理)
透明代理是在你的网络和外部世界之间的程序,所有的进或出都要经过这个代理。之所以叫做“透明”,因为你的网络无需考虑他的存在。
例如,squid软件能够配置为透明代理。
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