首页 > 代码库 > iptables之NAT实现
iptables之NAT实现
nat的优点:
防护内网中的主机,保护主机的安全
解决c类地址短缺的情况
SNAT和DNAT的区分是根据请求的源地址转换还是目标地址转换而决定的
以下实验中,内网的主机,将网关指向192.168.100.1这个地址
SNAT:源地址转换
拓扑:
过程解析:
报文的源地址为192.168.100.2,目标地址为外面主机地址211.70.160.16
但是到达nat服务器的eth0后,将报文的源地址改变成eth0的地址211.70.160.1
这个地址是一个公网地址
外网的web服务器接收到报文时,发现报文的目标地址是自己,然后就接收了报文
之后,web服务器对请求进行响应,根据来源的地址为211.70.160.1响应
web服务器构建响应报文,报文的源地址为自己,即211.70.160.16,报文的目标
地址为211.70.160.1,是我们这个内网所拥有的外网地址
返回报文到达nat服务器后,发现报文的目标地址是自己,然后接收报文,在路由决策
之前,将报文的目标地址改成发起请求的内网的主机的地址,目标地址仍是web服务器的
地址,因为内网主机请求的地址就是web服务器的地址
snat的过程中,只有前半段被转换,后半段由服务器自动完成
由于nat服务器在内存中维护着一张追踪表,(由nf_conntrack模块完成)
在nat服务器上操作
iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -p tcp –dport 80 -j SNAT
–to-source 211.70.160.1
表示内网内的任意主机访问外面的web服务时,都转换成211.70.160.1这个地址
对于ADSL拨号的状况:MARSUEREAD(地址伪装)
iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -p tcp –dport 80 -j MARSUERADE
SNAT的应用场景,主要是代理内网客户端访问互联网
实验过程:
现在web主机上启动web服务,并为其提供主页,内容如下:
<h1> This is a internet web : 211.70.160.16</h1>
此时,我们在内部的主机上,是无法访问这台web主机的,
须在nat服务器上开启源地址转换功能
iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -p tcp –dport 80 -j SNAT
–to-sourece 211..70.160.1
重要的一步,要打开网络转发功能
echo 1 > /proc/sys/net/ipv4/ip_forward
然后在内网主机,访问外网的web服务器
curl http://211.70.160.16
效果如图所示
在我们的外网web服务器上,查看我们的访问日志
tail /var/log/httpd/access_log
效果如图所示
可以看出,访问web时,内网主机的地址被转换成外网的211.70.160.1这个地址了
效率较低,只有在动态获取地址的时候才会使用
################################################################################
DNAT:目标地址转换
拓扑:
一般,情况下,例如学校,他们会有一个到两个公网地址,但是为了安全,会把服务器放在
自己的内网中,但是,如何能放外面的用户访问呢,这就用到了目标转换
学校这种机构,会把自己的网站解析成自己所拥有的公网的ip地址
过程解析:
当外面的用户来访问学校的主页时,通过DNS解析,得到了公网地址,比如,211.70.160.1
然后,他就向这台服务器发送请求报文,报文的目标地址为211.170.160.1,源地址为211.70.160.16
当报文到达到nat服务器时,即上面eth0网卡,到达路由决策之前,nat服务器将报文的目标地址进行了
转换,改为192.168.100.2,源地址不变
内部的web服务器收到报文后,发现报文的目标地址是自己,是一个请求报文
对这个请求报文进行响应,发送响应报文,报文的源地址为192.168.100.2,目标地址为
211.70.160.16
当这个响应报文快要离开内网时,经由nat服务器的eth0,在路由决策之前,将报文的源地址
改为211.70.160.1,目标地址仍然为211.70.160.16
外面的请求主机接收到响应报文时,发现目标地址是自己的,而源地址是211.70.160.1,是自己
发送请求报文的目标地址,就接收了这个响应报文
snat的过程中,只有前半段被转换,后半段由服务器自动完成
内网的服务器上的日志显示的请求者仍为外网主机的地址
iptables -t nat -A PREROUTING -d 211.70.160.1 -p tcp –dport 80 -j DNAT –to-destination
192.168.100.2
实验过程:
在内网的web服务器上提供主页,如下内容,并重启web服务
<h1>This is local area network 192.168.100.2</h1>
然后再到我们的nat服务器上,将原来的SNAT删除,开启目标地址转换功能
iptables -t nat -D POSTROUTING 1
iptables -t nat -A PREROUTING -d 211.70.160.1 -p tcp –dport 80 -j DNAT –to-destination
192.168.100.2
首先,我们先到外网的主机上,对局域网所有的公网地址发起web请求,如下
然后,回到我们的内网web服务器上,查看访问日志,如下
可以看出,访问的就是内网的主机的web页面,web主机记录的源ip也为外网请求主机的ip
#########################################################
NAT:端口转换,只与DNAT有关
以目标地址转换继续
假设,www.365lsy.com这个网站对外宣称监听在80端口,但是,它的web服务器在内网中,
监听在8800这个端口,但是,外部的用户访问时,如何才能访问到正确的web服务器呢,这里
就用到了端口转换的概念
过程解析
外网的主机向这个机构宣称的网站对应的ip地址的80端口发起请求报文,报文的目标地址为
211.70.160.1,端口为80,源地址为211.70.160.16,端口为任意一个端口
当请求报文到nat服务器时,在进行路由决策之前,将报文进行转换,源地址和源端口都不变
目标地址改为192.168.100.2,端口改为8800
内网的web服务器收到请求报文后,进行响应,响应报文的目标地址为请求服务的主机的地址,即
211.70.160.16,端口为请求时的端口,源地址为192.168.100.2,端口为8800
响应报文无法到达外网,当报文将要离开网卡时,路由决策之前,将源地址改变成211.70.160.1,
端口改变成80,目标地址端口不变
请求的主机接收到web服务器发送的响应报文
这个过程用到了目标地址转换,端口地址转换,内网的web主机被隐藏,加强了安全
###########################################################
FULL NAT:全转换,源、目标都转换
在DNAT的基础上,在路由决策之前,改变报文信息
将报文中的目标地址改为192.168.100.2,不同的是,将源地址改变成192.168.100.1
即内网的网关的网卡地址
假设,请求内网的web主机和192.168.100/24不在一个网段时使用,内网中跨局域网
总结:nat转换的过程,要弄清楚的是,报文从哪一端到哪一端,而且,还有了解,在源地址转换和目标地址转换时,发生在哪条链上,搞清楚后才能很好的将规则写出来
本文出自 “牛叉的孩子光着屁屁” 博客,请务必保留此出处http://cshang.blog.51cto.com/6143980/1565663
iptables之NAT实现