2012年7月31日星期二

ROS加VLAN ADSL多线PCC叠加设置


我做完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]}  
4、做DDNS动态域名解析

脚本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]}  

没有评论:

发表评论