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两种方式。
