SNAT
说起NAT我在上学的时候就知道了,NAT的配置太简单了,没有深入的思考的过,其实仔细的思考一下,会发现NAT其实很有意思。NAT分为SNAT和DNAT,其实就是源NAT和端口映射。
先来说一说SNAT。
SNAT是什么?SNAT是源地址转换。
为什么要做源地址转换?因为私网地址不允许出外网,需要将私网的地址转换为公网地址,这样才能出外网,换句话说这样才能上网,否则不能上网;不能上网的原因是倒不是因为数据包没有被网络出口设备发出去,而是因为被运营商的路由设备给丢弃了,公网的路由器会丢弃所有源IP不是公网IP的数据包,所以我们想要上网,必须需要有公网IP。
SNAT怎么做?其实SNAT也分为很多的种类,我们就说一下最常用的,最常用的SNAT的做法也很简单。
第一步:制定一个ACL,ACL里面匹配所有需要上网的网段和主机,如下所示:
[b]dis acl 3003
Advanced IPv4 ACL 3003, 5 rules,
nat
ACL's step is 5
rule 0 permit ip source 10.x.24.0 0.0.3.255 (168556468 times matched)
rule 5 permit ip source 10.x.24.0 0.0.3.255 (4178006 times matched)
rule 10 permit ip source 192.168.10.0 0.0.0.255 (4688753 times matched)
rule 15 permit ip source 10.x.24.6 0 (522402 times matched)
rule 20 permit ip source 10.x.24.5 0 (2422 times matched)
第二步:将这个ACl放在g1/0/0的出方向里面,意思是当有数据包从这个接口出去时,如果被这个ACL匹配到的话,就可以进行SNAT的转换,其实就是将源地址替换为公网出口的地址。
interface GigabitEthernet1/0/0
port link-mode route
description to_internet
ip address 222.x.x.x 255.255.255.252
nat outbound 3003 address-group 1
SNAT的原理是啥?其实我对SNAT的原理有一个深入的了解是在学习了net-filter框架之后 ,明白了数据流是如何在LINUX内核进行转发的才能真正的理解SNAT。我在这里面不详细说明了,因为我在iptables相关的博文里面已经介绍的够详细,这里就简单的说一下,SNAT只能POST-ROUTING链上做,因为只有在报文出去的时候才能修改源地址,如果在PRE-ROUTING上修改了之后是没有意义的,也就是说SNAT是在报文出去的时候做。通常我们的报文都是从网络边缘设备的接口上发出去,所以我们要将ACL的策略放到网络设备的出接口上,当数据包过来的时候就进行匹配检查,一旦匹配通过的,就进行报文的源地址的修改。
DNAT
DNAT就是端口映射嘛,其实就是目标地址修改,在这里面直接说原理哟!
数据包还是从设备的外网接口收到,收到之后,收到之后立马修改目的地址吗?立马就要修改,为什么?SNAT就不是立马修改,如果DNAT的报文不立马修改的话,就直接通过PRE-ROUTING通过路由之后直接进行INPUT里面了,所以立马就要修改,修改之后再路由,路由之后到达FORWARD,最后通过POST-ROUTING扔出去。
当你在一台路由器或防火墙做了端口映射意味着什么呢?其实就意味着设备打开了一个端口而已,那么这个端口可以使用吗?并不可以,这是最近的新发现,而且我特意找了一台LINUX做实验,假如你把INPUT的默认策略设置为DROP,然后仅仅放行80端口,但不安装任何应用侦听80端口,那么在另一台主机telnet这个地址80端口会不会通?不会,不会,不会,为什么?这个端口打开了是不假,打开之后还要有应用侦听这个端口。这里面值得注意,有时候,有些端口是打开不成功的,如果打开不成功,建议多换几个端口试试。内核在收到这个报文之后要进行转发,要转发到被映射的主机上,如果这个被映射主机的端口不能访问的话,在外网还是telnet不通的。
如果在防火墙上配置NAT的话,还要牵扯到策略,策略一定要放行好。
教训
我之前在一台华三的防火墙做DNAT,把公网的4444端口中映射到某个主机的443端口上,策略和端口映射都做的没有问题,但就是访问不成功,各种检查搞了两个小时没有用,最后死马当活马医,把4444,改成了4433,结果就好了,没道理的事儿。