需求:
1、用户通过ROS的公网IP+36611端口,访问内部的服务器;
2、用户可以在服务器上随意进行PPTP拨号,每拨号一次,它的公网出口变化一次。而不能断网断线。
解决方案:
1、首先server上要写几条静态路由表
具体做法
route -p add 192.168.0.0 MASK 255.255.0.0 192.168.66.254
route -p add 10.0.0.0 MASK 255.0.0.0 192.168.66.254
route -p add 172.16.0.0 MASK 255.255.0.0 192.168.66.254
2、ros的一些脚本
/ip firewall nat
add action=dst-nat chain=dstnat dst-port=36617 in-interface=pppoe-out1-tel1 \
protocol=tcp to-addresses=192.168.66.17 to-ports=3389
add action=src-nat chain=srcnat dst-address=192.168.66.17 dst-port=3389 \
protocol=tcp to-addresses=192.168.64.1
其中36617是用户3389的时候使用的端口号,192.168.66.17是内网服务器的IP,192.168.64.1是ROS自己的局域网IP
第二天规则的主要作用,是让用户访问192.168.66.17的时候,192.168.66.17服务器看到用户的IP的源IP是192.168.64.1,而不是公网IP,如果没有这条,那么服务器会把数据包回到PPTP的服务器上去。那么就会断网。而且这边不可以写公网的那个端口号dst-port=36617,你会发现匹配不到任何数据包的。
抓包,你会发现srcnat是把包文转发到公网的IP出口222.95.240.43,虽然你写了192.168.64.1。不过从windows那边用netstat -an看,的确是192.168.64.1.这边在实际操作的时候,注意下。
这里我重新总结下dst-nat和src-nat的区别和联系。
总结几条经验
dst-nat,一般是没有经过nat没有经过伪装的原始数据包,所以你可以去匹配原始的源IP源端口,目的IP目的端口。
但是src-nat,一般是经过nat经过伪装的数据包文,所以你匹配原始的目的端口,就匹配不到了,见我们上面的案例。只能匹配转换过以后的目的端口或者目的ip。也就是不能匹配36617端口,而必须去匹配dstnat以后的3389端口!!!
上面的案例,如果你没有写dst-nat规则的话,你光写src-nat也是匹配不到任何数据包的。因为数据包必须经过out接口,才能被匹配到src-nat。你数据包在路由器里面,是没用的,不会被src-nat匹配到。