首页 > 代码库 > 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实现