设为首页
加入收藏
联系站长
今天是:  | 网站首页 | 软件路由器 | 无盘技术 | 网络学院 | 下载中心 | 技术论坛 | cisco | 
您现在的位置: 中国路由网 >> 软件路由器 >> RouterOS >> 正文 用户登录 新用户注册
[推荐]RouterOS多ADSL拨号分流配置经典实例           ★★★
 
RouterOS多ADSL拨号分流配置经典实例
作者:Javanew 文章来源:www.routerbbs.com, 点击数: 更新时间:2008-8-12 9:38:01
#-------------------------------------------------------------------
# 多ADSL拨号分流自动设置网关及路由 适用于3.7(2.9按备注说明修改一处)
# 注意:可选一个ADSL自动添加路由,以备本地服务使用
#    要达到分流效果,还需要配置IP->Firewall->Mangle->prerouting
#    和IP->Routes->Rules,具体脚本稍微放出
# Javanew 2008.4.29
# 本文源自www.routerbbs.com,转帖请注明出处!
#-------------------------------------------------------------------
/interface pppoe-client;
#设置未找到的变量
:global noFinded [:find "" "*"];
#是否存在ADSL掉线
:global isDisconnected false;
#网关
:global gateway "";
#路由标记
:global routingMark "";
#查找所有ADSL拨号设备
:foreach pppoeClient in [find] do={
  #获取ADSL名称
  :local pppoeClientName [get $pppoeClient name];
  #获取ADSL网卡接口
  :local pppoeInterface [get $pppoeClient interface];
  #获取网卡接口备注,不能备注在ADSL下,否则会重新拨号
  :local interfaceComment [/interface get [/interface find name=$pppoeInterface] comment];
  #获取ADSL是否被禁用
  :local pppoeDisable [get $pppoeClient disable];
  #如果ADSL是允许的,2.9.*系列用“no”,3.*系列用false
  :if ($pppoeDisable=false) do={
    #监听ADSL设备
    monitor $pppoeClientName once do={
      #查找网卡接口备注中是否存在"-"符号
      :local findIndex [:find $interfaceComment "-"];
      #设置历史状态
      :local oldStatus "";
      #设置历史IP
      :local oldIP "";
      #设置ADSL拨号的当前公网IP地址及掩码
      :local ipAddress "";
      #设置ADSL拨号的当前公网IP地址
      :local newIP "";
      #如果网卡接口备注中存在"-"符号
      :if ($findIndex!=$noFinded) do={
        #获取历史状态
        :set oldStatus [:pick $interfaceComment 0 $findIndex];
        #获取历史IP
        :set oldIP [:pick $interfaceComment ($findIndex+1) [:len $interfaceComment]];
      } else={
        #获取历史状态
        :set oldStatus $interfaceComment;
      }
      #如果ADSL拨号成功
      :if ($status="connected") do={
        #获取ADSL拨号的当前公网IP地址及掩码
        :set ipAddress [/ip address get [/ip address find interface=$pppoeClientName dynamic=yes] address];
        #从ADSL拨号的当前公网IP地址及掩码中提取IP地址部分
        :set newIP [:pick $ipAddress 0 [:find $ipAddress "/"]];
        #设置网关
        :set gateway $newIP;
        #设置路由标记
        :set routingMark ($pppoeClientName . "_Routing_Mark");
      } else={
        #设置有ADSL掉线
        :set isDisconnected true;
      }
      #如果ADSL当前状态和历史状态不相同 或 ADSL当前状态和历史状态为连接状态且当前IP和历史IP不相同
      :if ($status!=$oldStatus||($status="connected"&&$oldStatus="connected"&&$oldIP!=$newIP)) do={
        #如果历史状态为在线
        :if ($oldStatus="connected") do={
          #删除历史IP地址网关
          /ip address remove ($pppoeClientName . "_IP_Address");
          #删除历史路由标记
          /ip route remove ($pppoeClientName . "_Route");
        }
        #如果ADSL当前状态为在线
        :if ($status="connected") do={
          #增加IP地址做网关
          /ip address add comment=($pppoeClientName . "_IP_Address") address=$ipAddress network=$newIP broadcast=$newIP interface=$pppoeClientName disabled=no;
          #增加路由标记指向新网关
          /ip route add comment=($pppoeClientName . "_Route") gateway=$newIP routing-mark=($pppoeClientName . "_Routing_Mark") disabled=no;
          #设置ADSL网卡接口备注为“在线-IP地址”,不能备注在ADSL下,否则会重新拨号
          /interface set [/interface find name=$pppoeInterface] comment=($status . "-" . $newIP);
        }
        #如果ADSL当前状态为掉线或正在拨号中
        :if ($status="disconnected"||$status="dialing...") do={
          #设置ADSL网卡接口备注为掉线或拨号中
          /interface set [/interface find name=$pppoeInterface] comment=$status;
        }
      }
    }
  } else={
    #如果ADSL网卡接口备注不为空
    :if ($interfaceComment!="") do={
      #如果ADSL网卡接口备注中标明为在线
      :if ([:find $interfaceComment "connected"]!=$noFinded) do={
        #如果存在历史ADSL网关
        :if ([/ip address find ($pppoeClientName . "_IP_Address")]!="") do={
          #删除历史网关
          /ip address remove ($pppoeClientName . "_IP_Address");
        }
        #如果存在历史路由
        :if ([/ip route find ($pppoeClientName . "_Route")]!="") do={
          #删除历史路由
          /ip route remove ($pppoeClientName . "_Route");
        }
      }
      #清空ADSL网卡接口备注
      /interface set [/interface find name=$pppoeInterface] comment="";
    }
  }
}
#如果有ADSL掉线
:if ($isDisconnected) do={
  #设置频率
  :local frequency 1000;
  #循环
  :for i from 0 to 5 do={
    #按频率报警
    :beep length=100ms frequency=$frequency;
    #频率增加
    :set frequency ($frequency+1000);
    #延时
    :delay 100ms;
  }
}
 
文章录入:dnbm    责任编辑:dnbm 
  • 上一篇文章:

  • 下一篇文章: 没有了
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口