转帖:
我的routeros网关机器配置为赛扬433 CPU,64M SDRAM,540M 希捷硬盘,SIS主板集成显卡,没有声卡,两块杂牌RTL8139D网卡,显示器鼠标键盘都没有接,上网类型为10M电信光纤固定IP,内部为一个小型局域网,在routeros中外网卡(WAN接口)名称为outside,ip地址为218.91.210.206,内网卡(LAN接口)名称为inside,ip地址为192.168.2.1,内网网络地址为192.168.2.0,内网通过100M普通交换机(SWITCH)接有12个16口10M集线器(HUB),大约有150台电脑同时上网,在这样的配置下网络很稳定,routeros网关连续使用4个月没有重新启动过,还且网速很块,这样配置的网关成本大约200块钱(一台淘汰的二手主机),却能稳定带动150电脑同时上网,真是奇迹,所以我以这个网络环境作为例子,相信有较好的实用性及普遍性。
下面我们再说下snat和dnat的含义及应用场合:
1.snat是源地址转换,其作用是将ip数据包的源地址转换成另外一个地址,可能有人觉得奇怪,好好的为什么要进行ip地址转换啊,为了弄懂这个问题,我们要看一下局域网用户上公网的原理,假设内网主机A(192.168.2.8)要和外网主机B(61.132.62.131)通信,A向B发出IP数据包,如果没有SNAT对A主机进行源地址转换,A与B主机的通讯会不正常中断,因为当路由器将内网的数据包发到公网IP后,公网IP会给你的私网IP回数据包,这时,公网IP根本就无法知道你的私网IP应该如何走了。所以问它上一级路由器,当然这是肯定的,因为从公网上根本就无法看到私网IP,因些你无法给他通信。为了实现数据包的正确发送及返回,网关必须将A的址转换为一个合法的公网地址,同时为了以后B主机能将数据包发送给A,这个合法的公网地址必须是网关的外网地址,如果是其它公网地址的话,B会把数据包发送到其它网关,而不是A主机所在的网关,A将收不到B发过来的数据包,所以内网主机要上公网就必须要有合法的公网地址,而得到这个地址的方法就是让网关进行SNAT(源地址转换),将内网地址转换成公网址(一般是网关的外部地址),所以大家经常会看到为了让内网用户上公网,我们必须在routeros的firewall中设置snat,俗称IP地址欺骗或伪装(masquerade),现在我举个例子内网的A主机要上公网在routeros中怎么设置:
首先我们说一下snat中几个参数的含义,action,这是说明用的哪种转换方式,通常我们用masqurade,nat这两种,在特殊情况下用accept(主要是内网中有公网地址存在的情况)方法,protocol说明对哪些传输协进行转换(通常有tcp,udp等),out-interface说明通过哪一个网卡进行转换(通常是外网卡outside),to-src-address是将源地址伪装成哪些地址(可以是一个也可以是很多个),to-src-pot是将源端口伪装成哪些端口(可以是一个也可以是很多个),dst-address是指发向哪些主机的数据包要进行伪装(可以一个可以多个),dst-port是指发向哪些端口的数据包进行伪装(可以一个可以多个),src-address是指对哪些源地址进行伪装(可以一个可以多个),src-port是指从哪些源端口发出的数据包进行伪装(可以一个可以多个),从这些选项看出,routeros在snat中的设置功能是非常强大的,可以说弹性十足,可以满足几乎所有要求,现在我们接着说上面的问题,为了便以理解我们多举几例子。
1.内网的A主机(192.168.2.8)要上公网,并且只使用公网B(61.132.62.131)主机的web服务(80端口),哪么可以这么设置:
ip firewall src-nat add action=masquerade out-interface=outside protocol=tcp dst-address=61.132.62.131/32:80 src-address=192.168.2.8/32
或者用下面命令也行
ip firewall src-nat add action=nat out-interface=outside protocol=tcp dst-address=61.132.62.131/32:80 src-address=192.168.2.8/32 to-src-address=218.91.210.206
可以看出masquerade和nat这两种不同的方法区别在于nat必须多设置一个to-src-address参数为了简单起见,下面的例子我们都以nat方式为模型
2.内网所有主机(192.168.2.0)要上公网,并且只使用整个公网上的主机web服务(80端口),哪么可以这么设置:
ip firewall src-nat add action=nat out-interface=outside protocol=tcp dst-address=0.0.0.0/0:80 src-address=192.168.2.0/24 to-src-address=218.91.210.206
3.内网所有主机(192.168.2.0)要上公网,并且使用整个公网上的所有主机的所有服务,哪么可以这么设置:
ip firewall src-nat add action=nat out-interface=outside src-address=192.168.2.0/24 to-src-address=218.91.210.206
4.现在来个特珠点的,要求不管哪里来的数据包,不管到哪个地方方去的数据包都伪装一下地址该怎么做呢方法如下:
ip firewall src-nat add action=nat to-src-address=218.91.210.206
呵呵这个设置好简单啊,但带来很多问题,比如安全性问题,ip地址显示不正确问题等都是由它而生
5.再来看一个更特殊的问题,就是大家所说的路由器的回流问题,什么叫回流呢,就是当内网有服务映射到网关后,内网主机也可以用网关外部地址访问,凡是支持回流功能的路由器,都可以从内网访问网关外部地址上映射的服务,不支持回流技术的当然就不行啦
1.假设内网主机C192.168.2.4上的web服务(80端口)被映射到网关外部地址218.91.210.206的80端口上,内网主机A(192.168.2.8)要通过218.91.210.206来访问主机C上的web服务可以这么设置:
ip firewall src-nat add action=nat out-interface=inside protocol=tcp dst-address=218.91.210.206/32:80 src-address=192.168.2.8/32 to-src-address=218.91.210.206
从这里看出回流设置的特点是snat是在内网卡inside上进行的,这里会有个问题,192.168.2.8在web上留下的ip地址记录会被伪装成218.91.210.206,呵呵,如果想伪装成1.2.3.4行不行啊,也行可以这样写
ip firewall src-nat add action=nat out-interface=inside protocol=tcp dst-address=218.91.210.206/32:80 src-address=192.168.2.8/32 to-src-address=1.2.3.4
这样设了以后在web留下的ip记录会是1.2.3.4,呵呵奇不奇怪呀,这是一个不存在的地址,但能正常访问,哪么想留下真实的ip地址,是不是可以这样写命令呢?
ip firewall src-nat add action=nat out-interface=inside protocol=tcp dst-address=218.91.210.206/32:80 src-address=192.168.2.8/32 to-src-address=192.168.2.8
这是错误的,routeros不允许这么设,routeros对于snat的基本要求是伪装后的源地址和真实址不能在同一个子网内,呵呵,因此内网主机访问内网映射的服务留下的ip地址不管是什么,都不可能是原来的真实地址,也许有朋友会问,前面不是说了吗,网内主机要上公网,ip源地址必须伪装成网关外部地址218.91.210.206才能啊,为什么回流中确可以伪装成任何ip地址(本子网ip除外)呢,原来因为访问主机在内网,所以发出的任何数据包都会被网关记住,因为数据不出局域网,所以不管伪装成什么ip地址都能被网关正确传回来,这和数据传到公网上是有很大不同的哦
为了巩固一下大家的学习,我出个题目,看看大家能否回答正确,题目是请说明下面命令的作用?
ip firewall src-nat add action=nat out-interface=inside dst-address=218.91.210.206 src-address=192.168.2.0/24 to-src-address=1.1.1.1-2.2.2.2 to-src-port=1234-56789
大家看懂了吗,我来说一下,该命令设置了回流,凡是从192.168.2.0/24子网发出,并发向218.91.210.206主机上任意端口的数据包源地址都被伪装成1.1.1.1-2.2.2.2这个变化范围,源端口被伪装成1234-56789这个变化范围的形式。