【IT168 专稿】前文(点击)介绍了NAT原理以及NAT在Linux应用环境下的实现,下面笔者将结合具体应用情况构建Linux下的NAT服务器。
一、 Linux 下NAT用途
1. 连接到Internet,但却没有足够的公用Internet地址分配给内部主机。中小企业内部机器数量较少,可以通过NAT方式接入INTERNET,这时,仅仅需要一个合法的IP地址。
2. 接到一个需要重新分配地址的ISP。企业合并,两个使用同一IP地址网段的企业合并,可以使用NAT而不用重新规划IP地址,保留了以前的投资。但不可避免的是,采用NAT可能使NAT路由器出现IP报文转发效率的损失。
3. 支持多重服务器和负载均衡。通过给一个服务器集群一个逻辑IP地址(10.10.10.100),在路由 器上配置NAT可以做到负载分担。常见的例子是TCP load balancing,将外部网络对10.10.10.100的访问顺序定位到不同的服务器。
二、 NAT应用举例
1. 带动局域网上网
(1)网络结构
网络地址翻译和IP伪装都可以实现多台主机共享一个Internet连接,而这个局域网可以是Linux和Windows系统组成的多系统局域网。假设现在我们有一台机器有两个网卡,其中eth0为“公共”网卡,eth1为“私有”网卡。换句话说,eth0被分配了一个静态的,可路由的IP地址,而eth1则被分配给了一个私有的、不能路由的IP,也就是说该IP是属于该局域网子网的。网络拓扑结构如图1 。
![]() |
假设局域网中的客户机A eth0网络接口的IP地址:192.168.1.1;
NAT路由器连接局域网的eth0网络接口的IP地址:192.168.1.254;
NAT路由器连接internet的eth1网络接口的IP地址:199.10.42.1;
Internet上的一个WWW 服务器的IP地址:100.1.1.1;
(2)客户机使用NAT路由器访问互联网的过程
首先将客户机A的默认网关IP地址设置为:192.168.1.254,
以root用户为例,执行下面的命令:
# route add default gw 192.168.1.254
如果用户想更改网关,编辑/etc/sysconfig/network-scripts/ifcfg-eth0文件,将对应的网关设置修改之后,执行下面的命令即可:
#/etc/init.d/network restart
然后客户机A访问互联网必须通过NAT路由器,过程如下:
客户机A-NAT路由器。客户机A将访问WWW服务器的请求封包发送到NAT路由器。
SNAT。此书请求封包在NAT路由器上实施SNAT,此时源IP地址转化为199.10.42.1,同时 NAT 路由器并且会记忆这个联机的封包是由哪一个 ( 192.168.1.1 ) 客户机端传送来的。
NAT路由器-WWW服务器。经过SNAT转化的数据封包通过互联网发送到WWW服务器。
WWW服务器-NAT路由器。WWW服务器将回应封包发送到NAT路由器。
UN-SNAT。NAT 服务器会去查询原本记录的路由信息,并将目标 IP 由的公共 IP 改回原来的 192.168.1.1 ;
NAT路由器-客户机A。NAT路由器将通过UN-SNAT转化的数据封包发送到客户机A。
以上过程如图2 所示。
![]() |
| 图2客户机使用NAT路由器访问互联网的过程 |
以后所有的客户机访问WWW服务器的数据封包都要经过上述步骤。
(3)配置SNAT带动简单的局域网使用互联网资源脚本
以RHEL 4.0为例,在安装NAT服务器前,必须确定系统上已安装iptables程序,如果不知是否已经安装iptables,可以使用以下的方法来判断:# rpm-qa iptables
如果尚未安装iptables,可以在第一张安装光盘中的/Red Hat/RPMS目录下,找到名为“iptables-1.2.7a-2.i386.rpm”的安装程序,然后按照以下的方法进行安装:rpm –ivh iptables-1.2.7a-2.i386.rpm
为了使开机时能自动运行iptablas,可以在终端机窗口中输入“ntsysv”指令,然后在出现的画面中,利用上下方向键将光标移到菜单中的“iptables”项目(同时确定ipchains选项没有被选中),然后按空格键以选择,最后利用Tab键将光标移到“确定”按钮并按Enter键即完成设置。其他具体操作如下,#是说明中文部分是说明:
#touch /etc/rc.d/snat.sh “首先在/etc/rc.d/目录下生成空的脚本文件”
#chmod u+x /etc/rc.d/snat.sh “添加可执行权限”
#echo "/etc/rc.d/filter-firewall">>/etc/rc.d/rc.local “使脚本能在系统启动时自动执行”
#vi /etc/rc.d/ snat.sh
#!/bin/bash
#开启内核转发
echo“1” > /proc/sys/net/ipv4/ip-forward
#定义外部接口变量,若使用PPP连接,将eth1换成ppp0
INET_IFACE= “eth1’’
INET_IP= “XXX.XXX.XXX.XXX“
#定义局域网相关变量
LAN_IFACE= “eth1’’
LAN_IP= “192. 168. 1.254”
LAN_IP_RANGE= “192. 168. 1.0/24”
IPT= “sbin/iotables”
#理内核所支持的模块清单
/sbin/depmod -a
#载所用模块
/sbin/modprobe ip_tables
/sbin/modprobe iptables_nat
/sbin/modprobe ip_nat_ftp
/sbin/modprobe ip_LOG
清除已设规则,还原到不设防火墙的状态
$IPT -p INPUT ACCEPT
$IPT -p FORWARD ACCEPT
$IPT -p OUTPUT ACCEPT
$IPT -t nat -p PREROUTING ACCEPT
$IPT -t nat -p POSTROUTING ACCEPT
$IPT -t nat -p OUTPUT ACCEPT
for TABLE in filter nat mangle;do
$IPT -t $TABLE -F清除预设表filter中所有规则链中的规则
$IPT -t $TABLE -X清除预设表filter使用者自定义链中规则
done
#根据接口决定使用SNAT或是IP伪装
if [ "$INET_IFACE" = ppp0 ] ; then
$IPT -t nat -A POSTROUTING -o $INET_IFACE -j MASQUERADE
else
$IPT -t nat -A POSTROUTING -o $INET_IFACE -j SNAT --to $INET_IPi
(4)NAT和代理服务器访问互联网的对比
我们知道Linux支持(Squid 或者Apache等)代理服务器和NAT 2种常见的Internet共享连接方式。NAT和Proxy方式两者各有所长,具体的优缺点参见附表所示。其中,NAT更加易于使用,软件的兼容性及运行速度更好; 而Proxy则在可配置性和安全性方面更为强大。比较而言,NAT可以说是一种“透明”网络访问方式,它只重写数据包中很少的一部分,由此保证了访问的高速度。此外,使用NAT方式几乎无需设置客户端应用程序,且可应用在几乎所有常用的操作系统,例如Windows、Mac OS、UNIX和Linux等。也正是由于NAT的众多特性,使其成为了用户普遍选择的Internet连接共享方式。
![]() |
| 表-1是NAT与代理特性比较 |
2. 在局域网对外发布网络服务
(1)互联网客户通过NAT路由器访问局域网内服务器的过程。
假设局域网中WWW 服务器的eth0接口的IP地址为192.168.1.100,NAT路由器的局域网接口ethl的IP地址为192.168.1.254,与互联网连接的接口的IP地址是219.243.69.10,互联网上客户机B的IP地址为111.111.111.111。
(2)互联网上客户机B要与隐藏在NAT后的www 服务器建立连接需要经过NAT,过程如下:
客户机B-NAT路由器。客户机B将访问WWW服务器的请求封包发送到NAT路由器。客户机使用的拨号上网获得的IP地址:111.111.111.111。(也就是说客户机B并不知道111.111.111.111没有运行WWW服务器,互联网客户对这个访问是透明的。)
DNAT。此请求封包在NAT路由器上实施DNAT,此时将封包地址重新定向到IP地址192.168.1.10。
NAT路由器-WWW服务器。经过DNAT转化的数据封包通过互联网发送到WWW服务器。
WWW服务器-NAT路由器。WWW服务器将回应封包发送到DNAT路由器。
UN-DNAT。NAT 服务器将回收的封包的源地址修改为eth1接口的 IP地址: 111.111.111.111 ;
NAT路由器-客户机 B。NAT路由器将通过UN-DNAT转化的数据封包发送到客户机B。
以上过程如图3 所示。
![]() |
| 图3 互联网上客户通过NAT路由器访问局域网内服务器的过程 |
以后所有的客户机访问WWW服务器的数据封包都要经过上述步骤。
(3)在局域网对外发布服务的脚本
作如下假设:在局域网中有2台WWW 服务器,实现简单的负载均衡。IP地址分别是:192.168.1.10、162.168.1.11。另外在局域网中有一台FTP服务器,IP地址
为:192.168.1.13
#touch /etc/rc.d/snat.sh “首先在/etc/rc.d/目录下生成空的脚本文件”
#chmod u+x /etc/rc.d/dnat.sh “添加可执行权限”
#echo "/etc/rc.d/filter-firewall">>/etc/rc.d/rc.local “使脚本能在系统启动时自动执行”
#vi /etc/rc.d/ dnat.sh
#!/bin/bash
#开启内核转发
echo“1” > /proc/sys/net/ipv4/ip-forward
#定义外部接口变量
INET_IFACE="eth1"
INET_IP="192.168.0.114"
#定义局域网相关变量
LAN_IFACE="eth1"
LAN_IP="192.168.1.14"
LAN_IP_RANGE="192.168.1.0/24"
#
IPT="/sbin/iptables"
###################################
# 定义与内部服务器相关的变量
WWW_IP_RANGE="192.168.1.10-192.168.1.12"
FTP_IP="192.168.1.14"
#各种服务的端口
HTTP="80"
HTTPS="443"
FTP="21"
FTP_DATE="20"
#################################
#加载内核模块
/sbin/depmod -a
/sbin/modprobe ip_tables
/sbin/modprobe iptable_nat
/sbin/modprobe ip_nat_ftp
/sbin/modprobe ipt_LOG
######################################
#清除已设规则,还原到不设防火墙的状态
$IPT -P INPUT ACCEPT
$IPT -P FORWARD ACCEPT
$IPT -P OUTPUT ACCEPT
$IPT -t nat -P PREROUTING ACCEPT
$IPT -t nat -P POSTROUTING ACCEPT
$IPT -t nat -P OUTPUT ACCEPT
for TABLE in filter nat mangle ; do
$IPT -t $TABLE -F
$IPT -t $TABLE -X
done
###############################
############ 规则设置 #################
###################################
#所有已经初始化了的回应数据包&&允许DNS服务&&允许主机的FTP服务(POST模式)
#$IPT -A INPUT -p tcp -j REJECT --reject-with tcp-reset
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
for DNS in $(grep ^n /etc/resolv.conf|awk ''{print $2}''); do
$IPT -A INPUT -p udp -s $DNS --sport domain -j ACCEPT
done
$IPT -A INPUT -p tcp -m multiport --dport 21,20 -j ACCEPT
$IPT -A INPUT -p tcp -j REJECT --reject-with tcp-reset
############################################
#允许访问开放的服务
$IPT -A INPUT -p tcp --sport $HTTP -j ACCEPT
$IPT -A INPUT -p tcp --sport $HTTPS -j ACCEPT
$IPT -A INPUT -p tcp --sport $FTP -j ACCEPT
###########################################
#拒绝所有(除了lo接口)新建立的或无效的连接请求并记入LOG
$IPT -N LOGDENY
$IPT -A LOGDENY -j LOG --log-prefix "iptables:"
$IPT -A LOGDENY -j DROP
$IPT -A INPUT -i ! lo -m state --state NEW,INVALID -j LOGDENY
######################################
#根据接口决定使用SNAT或是IP伪装
if [ "$INET_IFACE" = ppp0 ] ; then
$IPT -t nat -A POSTROUTING -o $INET_IFACE -j MASQUERADE
else
$IPT -t nat -A POSTROUTING -o $INET_IFACE -j SNAT --to $INET_IP
fi
#######################################
# 对防火墙的服务请求重定向到局域网内部
$IPT -t nat -A PREROUTING -p tcp -d $INET_IP --dport $HTTP -j DNAT --to $WWW_IP_RANGE:$HTTP
$IPT -t nat -A PREROUTING -p tcp -d $INET_IP --dport $HTTPS -j DNAT --to $WWW_IP_RANGE:$HTTPS
$IPT -t nat -A PREROUTING -p tcp -d $INET_IP --dport $FTP -j DNAT --to $FTP_IP:$FTP
####################END##################
总结:NAT的优点和缺陷
NAT方案在一定程度上减缓了IP地址耗尽的周期和路由表规模越来越大的问题,提供了一种非常方便的方式来解决私有网络与Internet的互连问题。
NAT的优点:
终端用户可以透明地访问Internet。
利用NAT可以做到对外部网络隐藏内部网络的体系结构,从外部网络无法知道究竟是哪台主机发送或接收数据,从另一个角度,它也是一个缺点。
为已建成的私有网络方便地建立与Internet的连接,而不必去修改每台主机的地址以及内部路由器的配置。
在实现NAT时,可以加入一些服务器代理和包过滤的功能,可以获得很好的安全性及其它性能,而不用增加管理的开销。
以极少的全局地址实现一个较大型的私有网络与Internet的互连。
但NAT方案含有很多消极特征,决定了它只能是一个临时的解决方案,包括:
如果网络规模增大,访问Internet的主机增多,地址对应表的规模必然会越来越大,这将导致效率的降低。
它会增加错误寻址的可能性。
它隐藏了发送报文的主机的有关信息,使得外部网络难于对它们进行管理,例如,若内部网络中某台主机在Internet上违反安全规则,Inter—net就无法查处“元凶”。
由于NAT要修改相应的IP地址,这使得不能对包含IP地址或有关IP地址信息的内容(如
TCP报文头的校验和)进行加密,降低了安全性。
那些使用到IP地址的高层应用将受到限制,除非NAT有可能修改其中包含的IP地址信
息,即便如此,对这些高层应用还是有所限制,如不能加密等。
ICMP,SNMP,DNS等等各种网络上使用的协议在进行地址翻译时所带来的问题,难予考虑周全。
使用NAT网络地址转换技术可以通过“私有地址” 来扩充IP地址空间,解决目前IPV4地址资源不足的问题。文中介绍了Linux 下NAT的工作原理与实现SNAT和DNAT两种方式。
