有这样一个需求,客户通过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”
}
}
}