需求:
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匹配到。