之前有这样一个需求,客户通过windows电脑使用PPTP连接进入RouterOS,这时该PPTP账号对应一个运营商PPPoE拨号,并自动启动连接,这个PPPoE拨号获取一个公网IP上网,该账号的PPTP默认走这个PPPoE拨号上网,当PPTP账号断开后,对应的PPPoE拨号也同样断开。其实目的是当需要重新获取另外一个公网IP时,再一次连接,就这样周而复始的获取不同的公网IP,干什么用你们自己猜。所以为此写一个这样的应用和脚本,实现PPTP连接和PPPoE拨号联动

 

该脚本运行前需要做以下的配置准备:

配置一、开启RouterOS的PPTP服务,并创建一个新的profile规则

首先在profile创建新的规则pptp,只分配local address和dns两个参数,如果要做流控在limits菜单下设置limit参数

在secret下,创建一个pptp账号,

开启PPTP server服务器,并选择默认proflie为pptp

配置脚本:

/ppp profile

add dns-server=192.168.8.1 local-address=192.168.8.1 name=pptp

/ppp secret

add name=yus password=yus profile=pptp remote-address=192.168.8.2 service=pptp

 

 

配置二、添加每个PPTP账号的PPTP静态服务条目

在inteface下,创建一个PPTP Server静态条目

设置name为pptp-yus,user对应yus账号,这样yus账号会以静态方式一直存在,而非默认拨号连接后动态创建。

创建一个运营商PPPoE-client拨号连接,

取名为pppoeyus,用于对应PPTP的yus账号,记住关闭掉Dial out下的add default router选项(截图省略),便于后期脚本运行

配置脚本

/interface pppoe-client

add disabled=no interface=bridge1 name=pppoeyus password=123 user=1234

/interface pptp-server

add name=pptp-yus user=yus

/interface pptp-server server

set default-profile=pptp enabled=yes

 

配置三、为每个PPTP账号分配一个对应的PPPoE-client拨号,并设置这个PPTP账号IP地址的nat和路由规则

下面是策略路由规则,在/ip route rules下将之前yus账号的分配的IP地址192.168.8.2,添加到src-address中,并创建一个路由表yus

在/ip route里创建yus路由表的网关为pppoeyus规则

在ip firewall nat下创建srcnat规则,设置src-address为192.168.8.2,out-interface为pppoeyus,action=masquerade

配置脚本

/ip route

add distance=1 gateway=pppoeyus routing-mark=yus

/ip route rule

add src-address=192.168.8.2/32 table=yus

/ip firewall nat

add action=masquerade chain=srcnat out-interface=pppoeyus src-address=192.168.8.2

 

以上条件配置完成后,在Profile中选择新创建的PPTP规则,打开scripts菜单,针对on up和on down两个状态添加联动脚本,如果有拨号请求或者中断,都会触发这里的脚本运行。

这样pptp与pppoe联动操作就完成

 

On up脚本:

:local pptpname

:local pppoename

:log info “user login and script start”

:foreach i in=[/interface pptp-server find ] do={

     :if ( [/interface pptp-server get $i running] = true ) do={

        :set pptpname [/interface pptp-server get $i name]

        :log info “check $pptpname”      

        :set pppoename [:pick $pptpname [find $pptpname “-“] [:len $pptpname]]

        :set pppoename (“pppoe” . $pppoename)

        :if ( [/interface pppoe-client get [find name=$pppoename] disable ] = true  ) do={

          /interface pppoe-client enable [ find name =$pppoename ]

        :log info “$pptpname online $pppoename dail-up”

        }

     }

}

 

On down脚本:

:local pptpname

:local pppoename

:log info “user logout and script start”

:foreach i in=[/interface pptp-server find ] do={

     :if ( [/interface pptp-server get $i running] = false ) do={

        :set pptpname [/interface pptp-server get $i name]

        :log info “check $pptpname”      

        :set pppoename [:pick $pptpname [find $pptpname “-“] [:len $pptpname]]

        :set pppoename (“pppoe” . $pppoename)

        :if ( [/interface pppoe-client get [find name=$pppoename] disable ] = false ) do={

          /interface pppoe-client disable [ find name =$pppoename ]

        :log info “$pptpname offline $pppoename dail-down”

        }

     }

}