我做完ROS加VLAN ADSL多线PCC叠加设置设置后不久,网站开发小组的项目经理就找到我向我提出了需求,因为现在他们的测试服务器是放在我们办公室内网的,我们公司其它部门和其它分公司和我们办公室不是一个局域网,网站开发小组的项目经理想让我们公司的所有同事都能访问到测试服务器做用户体验度测试,想让我帮助实现,当时我一口答应下来,也觉得这是个很简单的事情,但是事情往往出人意料。
我一开始的思路是这样的,第一步就是在IP->firewall-> nat下面做基于目标的伪装,也就是映射,第二步就是要做回流让内网的客户端也能通过公网IP访问到服务器,第三步就是做动态映射的计划任务,定时更新第一步里面的目标地址即ADSL的地址,最后一步就要用到DDNS做一个二级域名的动态解析方便同事记忆和输入。做完以后发现需求基本满足,就是内网客户端不能通过域名访问到服务器,只能通过内网IP访问,为了精益求精,继续研究,baidu和google上搜索了无数方法均无效,后来在一个论坛里面看到一个高人的回复内容给了我启发,于是再一次尝试配置居然成功了。不敢独享,现在将思路和脚本整理分享给更多需要的人。
首先我来分析下出现上述问题的原因,因为我们这里的环境是多线叠加的,我们的每个连接在进行路由之前都会对连接进行标记并路由,不同的标记有可能走不同的路由导致数据没办法顺利到达服务器,其内部数据的具体流向以及转换我也不是很清楚,如有高手路过请不吝赐教。下面进入正题,其实很简单,我们只要在标记里面把目标地址为我们的外网接口地址的数据直接通过就可以解决这个问题了,有几条线就做几个标记,最后要添加计划任务更新标记里的目标地址为对应的外网接口地址,所以加上这最后两步一共是六步,下面就放出每一步的脚本(我的环境是双线叠加的,所以以下脚本都是适合双线的,改成多线的也很容易)
1、做映射,这里以把内网的8890端口映射成9000端口为例。comment内容可以先运行脚本以后在winbox里面改,下同
- /ip firewall nat
- add action=dst-nat chain=dstnat comment="225 9000\B6\CB\BF\DA1" disabled=no \
- dst-address=175.0.42.18 dst-port=9000 protocol=tcp to-addresses=\
- 192.168.0.225 to-ports=8890 add action=dst-nat chain=dstnat comment="225 9000\B6\CB\BF\DA2" disabled=no \
- dst-address=222.247.116.136 dst-port=9000 protocol=tcp to-addresses=\
- 192.168.0.225 to-ports=8890
如果想让外网能通过第一条线路都能访问到服务器的话就要做多少和线路数相同条数的映射
2、做回流
- /ip firewall nat
- add action=masquerade chain=srcnat comment="\BB\D8\C1\F7" disabled=no \
- out-interface=lan
3、做动态映射的计划任务,下面的脚本需要手动添加到计划任务里面去,下同
- :global ip1 [ /ip address get [/ip address find interface=pppoe-out1] address ]
- :global newip1 [:pick ip1 0 [:find ip1 "/"]]
- :global oldip1 [/ip fi nat get [/ip fi nat find comment="225 9000端口1"] dst-address]
- :if (newip1 != oldip1) do={ :log info [/ip fi nat set [/ip firewall nat find comment="225 9000端口1"] dst-address=$newip1]}
- :global ip2 [ /ip address get [/ip address find interface=pppoe-out2] address ]
- :global newip2 [:pick ip2 0 [:find ip2 "/"]]
- :global oldip2 [/ip fi nat get [/ip fi nat find comment="225 9000端口2"] dst-address]
- :if (newip2 != oldip2) do={ :log info [/ip fi nat set [/ip firewall nat find comment="225 9000端口2"] dst-address=$newip2]}
脚本1(适合只需要一条线能访问到服务器的情况)
- /tool dns-update name=chengip.myddns.com address=127.0.0.255 key-name=chengipuser key=chengippass
脚本2(适合需要每条线都能访问到服务器的情况)
- :global ddnsuser "chengipuser"
- :global ddnspass "chengippass"
- :global ddnshost1 "chengip1.myddns.com"
- :global ddnsip1
- :global ddnsip1fn
- :global ddnslastip1 [:tostr [:resolve $ddnshost1] ]
- :if ([ :typeof $ddnslastip1 ] = nil ) do={ :global ddnslastip1 "0" }
- :global ddnsinterface1 "pppoe-out1"
- :global ddnssystem ("mt-" . [/system package get system version] )
- :local int
- :local ddnsip1fn [ /ip address get [/ip address find interface=$ddnsinterface1 ] address ]
- :global ddnsip1 [:pick ddnsip1fn 0 [:find ddnsip1fn "/" ] ]
- :if ([ :typeof $ddnsip1 ] = nil ) do={
- :log info ("DDNS: No ip address present on " . $ddnsinterface1 . ", please check.")
- } else={
- :if (ddnsip1 != ddnslastip1) do={
- :log info "DDNS: Sending UPDATE!"
- :log info [ :put [/tool dns-update name=ddnshost1 address=ddnsip1 key-name=$ddnsuser key=$ddnspass ] ]
- :global ddnslastip1 $ddnsip1
- } else={
- :log info "DDNS: $ddnsip1 No update required."
- :log info "ip地址无变化!"
- }
- }
- :global ddnshost2 "chengip2.myddns.com"
- :global ddnsip2
- :global ddnsip2fn
- :global ddnslastip2 [:tostr [:resolve $ddnshost2] ]
- :if ([ :typeof $ddnslastip2 ] = nil ) do={ :global ddnslastip2 "0" }
- :global ddnsinterface2 "pppoe-out2"
- :global ddnssystem ("mt-" . [/system package get system version] )
- :local int
- :local ddnsip2fn [ /ip address get [/ip address find interface=$ddnsinterface2 ] address ]
- :global ddnsip2 [:pick ddnsip2fn 0 [:find ddnsip2fn "/" ] ]
- :if ([ :typeof $ddnsip2 ] = nil ) do={
- :log info ("DDNS: No ip address present on " . $ddnsinterface2 . ", please check.")
- } else={
- :if (ddnsip2 != ddnslastip2) do={
- :log info "DDNS: Sending UPDATE!"
- :log info [ :put [/tool dns-update name=ddnshost2 address=ddnsip2 key-name=$ddnsuser key=$ddnspass ] ]
- :global ddnslastip2 $ddnsip2
- } else={
- :log info "DDNS: $ddnsip2 No update required."
- :log info "ip地址无变化!"
- }
- }
5、添加目标地址为外网接口地址的标记
- /ip firewall mangle
- add action=accept chain=prerouting comment=isp1 disabled=no dst-address=\
- 175.0.42.18 in-interface=lan
- add action=accept chain=prerouting comment=isp2 disabled=no dst-address=\
- 222.247.116.136 in-interface=lan
6、添加动态更新目标地址为外网接口地址的计划任务,以下为计划任务里面的脚本,需要手动添加到计划任务里面去
- :global ip1 [ /ip address get [/ip address find interface=pppoe-out1] address ]
- :global newip1 [:pick ip1 0 [:find ip1 "/"]]
- :global oldip1 [/ip fi mangle get [/ip fi mangle find comment="isp1"] dst-address]
- :if (newip1 != oldip1) do={ :log info [/ip fi mangle set [/ip firewall mangle find comment="isp1"] dst-address=$newip1]}
- :global ip2 [ /ip address get [/ip address find interface=pppoe-out2] address ]
- :global newip2 [:pick ip2 0 [:find ip2 "/"]]
- :global oldip2 [/ip fi mangle get [/ip fi mangle find comment="isp2"] dst-address]
- :if (newip2 != oldip2) do={ :log info [/ip fi mangle set [/ip firewall mangle find comment="isp2"] dst-address=$newip2]}
请问有ROS LINUX 等教程吗??
@MM 有,加我QQ,我传给你。
@喻名堂 我要个能传一下吗?qq:965586
真是好贴,做10线以内的PCC叠加基本不用怎么大改,10线以上改Mac地址的话也不用大改,只是本人5.24版的ROS回流一直做不成功,端口映射部分也是改了又改,才能成功,映射时必须指定服务器从一条pppoe进出,in-inface也必须指定到那条线路才能成功,不知道是5.24版本的问题还是别的原因,现将我的脚本奉上,用于交流
#####服务器指定出口#####
/ip firewall mangle add chain=prerouting action=mark-routing src-address=192.168.0.2 disabled=no new-routing-mark=to_pppoe-out10 passthrough=no
#####服务器83、2700端口映射#####
/ip firewall nat
add action=dst-nat chain=dstnat comment=EWEBS disabled=no dst-address-type=local dst-port=83 protocol=tcp in-interface=pppoe-out10 to-addresses=192.168.0.2 to-ports=83
add action=dst-nat chain=dstnat disabled=no dst-address-type=local dst-port=2700 protocol=tcp in-interface=pppoe-out10 to-addresses=192.168.0.2 to-ports=2700
这是我极通服务器必须映射的两个端口,83和2700,仅供交流,盼回信,请指点
本人QQ:413312100 😐
@新疆诚成 回流确实是一个比较不好控制的问题。不同的情况有不同的做法。主要还是要对为什么要用回流以及NAT的一些原理有了解才比较容易操作
@新疆诚成 我基本看懂了这个端口转发,但是,我在我的环境中测试了一下,还是不行,我也是5.24的
唉,最简单的双网叠加的,现在转发一个3389端口都不行,感觉好失败~
@蒹葭苍苍 多尝试就就会熟悉了,我当初也是这么过来的,经常在调试的时候搞得别人断网,被别人骂了都不敢出声,呵呵
@喻名堂 add action=dst-nat chain=dstnat comment=”225 9000\B6\CB\BF\DA1″ disabled=no \
dst-address=175.0.42.18 dst-port=9000 protocol=tcp to-addresses=\
192.168.0.225 to-ports=8890
你的IP地址是固定的IP?175.0.42.18?我的是ADSL的,是动态的
@蒹葭苍苍 也是动态的,只是在写脚本的时候需要写上IP,后面有说用更新脚本加到计划任务里面做定时检测更新这个IP的
楼主文章不错,受教了,我也是学网络的 不过现在没从事这方面的工作。都忘记了。呵呵
你好 博主,标记指定出口的第二线路,无法显示源IP 而是显示官网IP 请问怎么解决呀
@范德 有点没看懂你表达的什么意思,源IP?官网IP?