NAT通常状况下分为SNAT,DNAT和PNATweb
此篇主要讲述的是使用iptables配置NAT,因此这3种NAT的区别和应用场景就简单的说明一下ubuntu
SNAT:源地址转换后端
目标地址不变,从新改写源地址,并在本机创建NAT表项,当数据返回时,根据NAT表将目的地址数据改写为数据发送出去时候的源地址,并发送给主机安全
目前大多都是解决内网用户用同一个公网地址上网的状况服务器
DNAT:目标地址转换网络
和SNAT相反,源地址不变,从新修改目标地址,在本机创建NAT表项,当数据返回时,根据NAT表将源地址修改成数据发送过来时的目标地址,并发给远程主机并发
在DNAT的基础上,能够根据请求数据包的端口作PNAT(端口转换,也称为端口映射),能够更句请求数据包不一样的端口改写不一样的目标地址,从而发送给不一样的主机tcp
这在用一个公网地址作不一样服务时用的比较多,并且相对来讲,用NAT的方式能够隐藏后端服务器的真实地址,更加的安全ide
在使用iptables实现nat以前,再来回头说说iptables的基础原理post
在这个模型中,完成nat的实现,数据要通过prerouting—forword--postrouting这3个链
分析SNAT的数据流向过程
首先进入prerouting,发现不是本网段的地址,然后开始查找路由表(查找路由的过程在prerouting和forword之间),因而通过forword链进行转发,在经过postrouting时进行NAT转换。
在这个流程中,NAT转换的步骤在postrouting链上实现,之因此再也不prerouting上作nat是由于数据包在进来以前,还不知道是本网段地址仍是外网地址
再分析DNAT的数据流向过程
在DNAT中,NAT要在prerouting链上作。以前提到过,在数据进入主机后,路由选择过程是在prerouting和forword之间的,因此应该先作地址转换以后,再进行路由选择,然后通过forword,最后从postrouting出去
理论说了一堆,接下来用实验环境来验证下(用dia画的图,比较搓。。。在ubuntu下将就用下了。)
其中pc1是我本机,系统是ubuntu12.04,NAT和PC2是vmware虚拟机
nat主机网络配置
SNAT
在作nat以前,要先把路由功能打开,否则数据包连forword都过不了
[root@localhost ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
添加nat表项
[root@localhost ~]# iptables -t nat -A POSTROUTING -s 172.16.93.0/24 -j SNAT --to-source 10.0.0.1
表示在postrouting链上,将源地址为172.16.93.0/24网段的数据包的源地址都转换为10.0.0.1
查看下表项
验证效果:
先看下本机的网络配置
添加一条去往10.0.0.0/24网段的静态路由
lust@host:~$ sudo route add -net 10.0.0.0/24 gw 172.16.93.129
而后在主机上对vmnet1网段进行抓包
lust@host:~$ sudo tcpdump -i vmnet1 –v
在主机上ping 10.0.0.2,观察抓到的包
经过抓包能够发现,去往10.0.0.2的源地址为10.0.0.1,说明nat成功的将源地址改写
以上是实验验证部分
这里再介绍一个SNAT的经常使用选项:MASQUERADE
此选项能够用在动态获取IP地址的主机,经常使用在家庭adsl拨号上
iptables -t nat -A POSTROUTING -s 172.16.93.0/24 -o eth1 -j MASQUEREADE
在这里最好使用 -o 接口来明确指定从哪一个接口出去,MASQUEREADE会调用该接口的地址做为源地址出去(不指定接口也能够,不过在主机上有多个IP地址的状况下最好配置一下)
DNAT
对于DNAT就再也不作实验验证了,和SNAT是差很少的,这里介绍下经常使用的几种用法
在DNAT中,要把规则定义在PREROUTING链中
iptables -t nat -A PREROUTING -d 10.0.0.1 -j DNAT –-to-destination 172.16.93.1
此条规则将请求IP为10.0.0.1的数据包转发到后端172.16.93.1主机上
iptables -t nat -A PREROUTING -d 10.0.0.1 -p tcp –-dport 80 -j DNAT –-to-destination 172.16.93.1
此条规则将请求IP为10.0.0.1而且端口为80的数据包转发到后端的172.16.93.1主机上,经过定义不一样的端口,就能够实现PNAT,将同一个IP不一样的端口请求转发到后端不一样的主机
iptables -t nat -A PREROUTING -d 10.0.0.1 -p tcp –-dport 80 -j DNAT –-to-destination 172.16.93.1:8080
此条规则在上条规则的基础上,发日后端的数据包的目标端口改成8080,在后端主机的web服务器上使用8080端口接收访问, 这样能更好的保护后端主机
iptables系列NAT部分就写到这里,有什么不明白的能够留言探讨。下一篇将会讲述使用iptables的7lay实现7层的访问控制,也就是在第一篇中所说的网关代理型防火墙,能够实现控制qq,bt等应用程序的网络访问