Linux之防火墙篇二DNAT与SNAT


一:DNAT与SNAT讲解及准备工作


   SNAT:源地址转换,代理内部客户端访问外部网络

   目标地址不变,重新改写源地址,并在本机建立NAT表项,当数据返回时,根据NAT表将目的地址数据改写为数据发送出去时候的源地址,并发送给主机,目前基本都是解决内网用户用同一个公网IP地址上网的情况。


   DNAT:目标地址转换,将内部服务器发布至外部网络

   和SNAT相反,源地址不变,重新修改目标地址,在本机建立NAT表项,当数据返回时,根据NAT表将源地址修改为数据发送过来时的目标地址,并发给远程主机在DNAT的基础上,可以根据请求数据包的端口做PNAT(端口转换,也称为端口映射),可以根据请求数据包不同的端口改写不同的目标地址,从而发送给不同的主机这在用一个公网地址做不同服务时用的比较多,而且相对来说,用NAT的方式可以隐藏后端服务器的真实地址,比较安全。


   wKioL1M0Hc7D8rNVAACD7FVCLJY849.jpg


上图中,完成了NAT的实现,数据要经过PREROUTING-->FORWARD-->POSTROUTING这三个链


   SNAT的数据流向过程

   首先进入PREROUTING,发现不是本网段的地址,而后开始查找路由表(查找路由的过程在PREROUTING和FORWARD之间),于是经过FORWARD链进行转发,在通过POSTROUTING时进行NAT转换。在这个流程中,NAT转换的步骤在POSTROUTING链上实现,之所以不再PREROUTING上做NAT是因为数据包在进来之前,还不知道是本网段地址还是外网地址。


   DNAT的数据流向过程

   在DNAT中,NAT要在PREROUTING链上做。在数据进入主机后,路由选择过程是在PREROUTING和FORWARD之间的,所以应该先做地址转换之后再进行路由选择,而后经过FORWARD链,最后从POSTROUTING链出去。



下面我们通过一个案例来讲解DNAT与SNAT:


wKiom1M1KX6Bwo65AACS37wxfhE513.jpg


这里三台计算机都使用的VMware来实现,172.16.的系统都是CentOS6.4_x86_64,192.168.是windows XP。


PC1地址:172.16.251.185 网关指向:172.16.251.186

route add default gw 172.16.251.186


wKioL1M1J9aBxgVzAAHumIyln7s406.jpg

route

wKiom1M1KeDBT33iAACM-fIYL6s921.jpg


NAT服务器地址:172.16.251.185

wKiom1M1KlCCWdhJAALli_xbv4U916.jpg


PC2地址

wKiom1M1MVDAgX7sAAC56n2VxtY835.jpg



二、SNAT的实现:


   1、在我们做NAT之前,首先要把NAT服务器的路由功能打开,不然数据包过不了FORWARD链


sysctl -w net.ipv4.ip_forward=1
######也可以使用文件永久生效,下面值改为1即可
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
######执行如下命令让其生效
sysctl -p


   2、在NAT服务器添加iptables规则如:


iptables -t nat -A POSTROUTING -s 172.16.0.0/16 -j SNAT --to-source 192.168.254.61
//在POSTROUTING链上面,将来自源地址为172.16.0.0/16网段的数据包的源地址都转换为192.168.254.61

   查看iptables规则:

iptables -t nat -L -n -v

wKiom1M1LR3yNdGSAAFFzIGlE9g251.jpg

   

   3、下面我们在PC1上做测试,PC1现在就可以Ping通PC2主机了,如下图:

   wKiom1M1MbHg1DvRAAE3vMMomjQ544.jpg

   4、PC1 ping PC2,在PC1主机上抓包来测试:

tcpdump -i eth0 -v | grep 192

wKioL1M1NT7CX5DbAADQ8tr754E611.jpg



三、DNAT的实现:


   1、在NAT服务器添加iptables规则如:

iptables -t nat -A PREROUTING -d 192.168.254.61 -j DNAT --to-destination 172.16.251.185
//在PREROUTING链上面,将请求地址NAT服务器 eth1 192.168.1.254的数据包全部转发到PC1 172.16.251.185主机上

   查看iptables规则:

iptables -t nat -L -n -v

wKiom1M1Sa_jeNfKAADONRUq-os171.jpg


   测试:PC1上面做了WEB服务,我们在PC2上看是否能请求到WEB页面:

       请求防火墙eth1地址,192.168.254.61

wKioL1M1StvjazifAAICaf3ZZDA470.jpg


   2、在NAT服务器添加iptables规则如:

iptables -t nat -A PREROUTING -d 192.168.254.61 -p tcp --dport 80 -j DNAT --to-destination 172.16.251.185:8080
//此条规则是将所有请求NAT服务器eth1 192.168.254.61地址的80号端口都转发到172.16.251.185主机上8080端口,当然前提必须在PC1上面监听8080端口

查看iptables规则:

wKiom1M1TvfxjUnaAADaT55r_mE131.jpg

wKioL1M1T7uB7Du1AAA8Vy4QnEk574.jpg

   

   测试:在PC2主机上面远程连接NAT服务器eth1接口的80端口测试如下图:

wKioL1M1UJPgtWQgAAMQ0llTtpQ355.jpg



   我们在想一个问题,上面做的NAT都是基于静态IP地址来实现的,如果用的是ADSL动态获取的IP地址那么我们该怎么办呢,总不能看看获取到什么IP地址就手动的修改一下防火墙规则吧,那样岂不是很麻烦吗?下面我们来说明怎么基于动态IP地址来做NAT代理内部客户端来上网


       如果IP地址是动态获取的ADSL宽带来做NAT代理上网实现方式

iptables -t nat -A POSTROUTING -s 172.16.0.0/16 -o eth1 -j MASQUEREADE

 

注释:这里最好使用"-o"选项来指定出口,MASQUEREADE会自动调用该接口的地址作为源地址出去。



 到此iptables的基本配置告一段落,如果有哪地方不理解可以留言。下一篇博文将会讲解编译内核来实现iptables的layer7实现7层访问过滤;可以实现控制QQ、迅雷、酷狗等应用程序的网络访问,当然也可以实现控制网络协议如:HTTP、FTP等...


你可能感兴趣的:(Linux防火墙,SNAT,DNAT)