hyes 发表于 2024-5-28 10:54

分享Mikrotik RouterOS自动重命名ether和bridge pppoe网口纠错脚本

时不时会换着平台玩,backup还原不同架构的主机或者虚拟机时候,经常遇到pppoe绑定到了lan-bridge或者,lan-list上有wan-ether。。。
由于有防火墙,会导致无法winbox到。。。

其实除了以下脚本,更简单的办法是放行所有interface上的mac-to-winbox,或者退而求其次,写个脚本,开机放开所有mac-to-winbox的权限,然后几分钟后再禁用所有interface,默认是只自用lan-list的权限,或者"!wan-list"的权限。


以下脚本没有完全测试,而且由于遇到过有两个default-name=ether1,以及ether-net num0的default-name不是ether1的情况。我十分无语。

所以默认以default-name=ether1为pppooe网口,如果检测到有两个default-name=ether1,就以ehter num=0为pppoe网口。

另外会检查wan-list上没有lan interface
lan-list上面没有wan interface

请谨慎使用,目前只是在7.14.3上面使用了。至于检测到只有一个ether的情况还没有测试,虚拟机关机懒得再开了。

脚本最后,倒数第二行,我这边运行了自己的DDNS-update脚本。没需求的可以不用动,有需要的话改下就行。

水平有限,只能写这么啰嗦的脚本了。。。


# 2024-05-28 10:47:06 by RouterOS 7.14.3
#----------SCRIPT INFORMATION---------------------------------------------------
#
# Script:Mikrotik RouterOS PPPOE-WAN Check
# Version: v4.0
# Created: 06/05/2024
# Updated: 27/05/2023
# Author:G.D.
#
#----------MODIFY THIS SECTION AS NEEDED----------------------------------------
#
/system script
add dont-require-permissions=no name=WAN_chk_v4 source=":\
    delay 15s;\r\
    \n:log info \":::-The Start-:The pppoeout interface settings Checker.\"\r\
    \n\r\
    \n:local pppoenm;\r\
    \n:local LanList;\r\
    \n:local WanList;\r\
    \n:local WanNM;\r\
    \n\r\
    \n:set pppoenm \"Your_pppoe-out_name\";\r\
    \n:set WanNM \"Your_WAN_ether1\";\r\
    \n:set LanList \"Your_LANlist_name\";\r\
    \n:set WanList \"Your_WANlist_name\";\r\
    \n\r\
    \n\r\
    \n##----------------------------------------------------------------------\
    --------------------##\r\
    \n#!!!! DO NOT CHANGE ANYTHING BELOW THIS LINE, IF YOU ARE NOT SURE WHAT\
    \_YOU ARE DOING !!!!#\r\
    \n##----------------------------------------------------------------------\
    --------------------##\r\
    \n\r\
    \n\r\
    \n:local pppoeint;\r\
    \n:local BridgeNM;\r\
    \n:local tmms;\r\
    \n:local Ether1NM;\r\
    \n:local EtherNumALl;\r\
    \n:local EachEthNM;\r\
    \n:local EachEthDNM;\r\
    \n\r\
    \n\r\
    \n:local EtherNum;\r\
    \n:local NumEther;\r\
    \n:local EtherTNum;\r\
    \n:local EtherANum;\r\
    \n:local MaxNum;\r\
    \n:local csifnm;\r\
    \n:local Ether1Count;\r\
    \n\r\
    \n:set tmms ([ :pick 0 2 ] . [ :pick [/system cl\
    ock get time ] 3 5 ] . [ :pick [ /system clock get time ] 6 8 ] );\r\
    \n\r\
    \n\r\
    \n:set pppoeint [ /interface pppoe-client get [ find name=\"\$pppoenm\" ] \
    interface ];\r\
    \n:set BridgeNM [ /interface bridge get num=0 name ];\r\
    \n\r\
    \n\r\
    \n:local Minimum; \\\r\
    \n:for Minimum from=0 to=24 step=1 do={ \\\r\
    \n:do { \\\r\
    \n    /interface ethernet get num=\"\$Minimum\" name;\r\
    \n:set EtherNum [ :tonum \$Minimum ];\r\
    \n    :set NumEther [ :tonum \$Minimum ];\r\
    \n    :set EtherTNum [ :tonum \$Minimum ];\r\
    \n    :set EtherANum [ :tonum \$Minimum ];\r\
    \n:set EtherNumALl [ :tonum \$Minimum ];\r\
    \n    :set MaxNum [ :tonum ( \$Minimum+1 ) ];\r\
    \n    } on-error={ \r\
    \n      :if ( [:tonum \$Minimum ]<=0 ) do={\r\
    \n      :log info \"::There is at most one ether.\"\r\
    \n\r\
    \n      :if ( [ :tobool [ /interface find default-name=ether1 ] ]=true )\
    \_do={\r\
    \n          set Ether1NM [ /interface get name\
    ]\r\
    \n          :log info ( \"Remove \" . \$pppoenm . \" from list named \" . \
    \$WanList . \".\")\r\
    \n          /interface list member remove [ find list=\"\$WanList\" interf\
    ace=\"\$pppoenm\" ]\r\
    \n          :log info ( \"Remove \" . \$Ether1NM . \" from list named \" .\
    \_\$WanList . \".\" )\r\
    \n          /interface list member remove [ find list=\"\$WanList\" interf\
    ace=\"\$Ether1NM\" ]\r\
    \n          :log info ( \"Add \" . \$Ether1NM . \" to bridge named \" . \$\
    BridgeNM . \".\" )\r\
    \n          /interface bridge port add bridge=\"\$BridgeNM\" interface=\$E\
    ther1NM\r\
    \n          :log info ( \"Add \" . \$Ether1NM . \" to list list named \" .\
    \_\$LanList . \".\" )\r\
    \n          /interface list member add list=\"\$LanList\" interface=\$Ethe\
    r1NM\r\
    \n          :log info ( \"Disabled \" . \$pppoenm . \".\" )\r\
    \n          /interface pppoe-client set [ find name=\"\$pppoenm\" ] disabl\
    ed=no\r\
    \n      :log warning\"The only ehter has been set as the bridge port...\
    \"\r\
    \n      :error \"The only ehter has been set as the bridge port...\"\r\
    \n      } else={\r\
    \n          :log info \"::There is no ethernet interface with default-name\
    =ether1.\"\r\
    \n      :error \"::There is no ethernet interface with default-name=ether1\
    .\"\r\
    \n      }\r\
    \n      }\r\
    \n    } \r\
    \n}\r\
    \n\r\
    \n:log info \"At least two ethernet interface exist. Check the pppoeout in\
    terface settings...\";\r\
    \n:delay 1s;\r\
    \n:log info ( \"There are \" . \$MaxNum . \" ethernet interface in total.\
    \" )\r\
    \n\r\
    \n:set Ether1Count 0;\r\
    \n\r\
    \n:for e1 from=0 to=\$EtherANum step=1 do={ \\\r\
    \n:set EachEthNM [ /interface ethernet get num=\$e1 default-name ];\r\
    \n:if ( \"\$EachEthNM\"=\"ether1\" ) do={ \r\
    \n    :set Ether1Count ( \$Ether1Count+1)\r\
    \n}\r\
    \n}\r\
    \n\r\
    \n\r\
    \n:log info ( \"There are \" . \$Ether1Count . \" ethernet which Default-n\
    ame is ether1 in total.\" )\r\
    \n:delay 5s;\r\
    \n:if ( \$Ether1Count>1 ) do={\r\
    \n\r\
    \n:if ( [ :tobool [ /interface find name=\"\$WanNM\" ] ]=false ) do={\r\
    \n    :log info ( \"The ether named \" . \$WanNM . \" not exists, Renm eth\
    er with numbered-0 to \" . \$WanNM . \"...\")\r\
    \n\r\
    \n    :log info \"Reset all ether's mac-addr...\"\r\
    \n    :for r from=0 to=\$EtherNumALl step=1 do={\r\
    \n      /interface ethernet reset-mac-address num=\$r;\r\
    \n      :delay 1s;\r\
    \n    }\r\
    \n\r\
    \n    :for mn from=1 to=\$EtherNumALl step=1 do={\r\
    \n      :log info ( \"Rename ether numbered-\" . \$mn . \"'s name to ether\
    \" . \$mn . \$tmms . \".\" )\r\
    \n      :delay 1s;\r\
    \n      /interface ethernet set num=\$mn name=(\"ether\" . \$mn . \$tmms)\
    \r\
    \n    }\r\
    \n\r\
    \n    :log info \"::Rename all the ether...\";\r\
    \n    :for l from=0 to=\$EtherTNum step=1 do={\r\
    \n    :set EachEthDNM [ /interface ethernet get num=\$l default-name ];\r\
    \n      :delay 1s;\r\
    \n      /interface ethernet set num=\$l name=(\$EachEthDNM . \$l);\r\
    \n    }\r\
    \n\r\
    \n\r\
    \n    :log info ( \"Rename ether numbered-0's name to \" . \$WanNM . \".\"\
    \_)\r\
    \n    /interface ethernet set num=0 name=\"\$WanNM\";\r\
    \n    :delay 1s;\r\
    \n\r\
    \n    \r\
    \n} else={\r\
    \n    :log info ( \"The ether named \" . \$WanNM . \" exists, Check ...\" \
    )\r\
    \n\r\
    \n    :local wannum;\r\
    \n    :set wannum 1;\r\
    \n    :while (\$wannum>0) do={\r\
    \n      :if ( [ /interface get num=\$EtherNum name ] = \"\$WanNM\" ) do={\
    \r\
    \n      :log info ( \"The ether numbered \" . \$EtherNum . \" named \" .\
    \_\$WanNM );\r\
    \n      :delay 1s;\r\
    \n      :set wannum 0;\r\
    \n      } else={\r\
    \n      :log info ( \"The ether numbered \" . \$EtherNum . \" isn't name\
    d \" . \$WanNM );\r\
    \n      :delay 1s;\r\
    \n      :set EtherNum (\$EtherNum-1);\r\
    \n      }\r\
    \n    }\r\
    \n    \r\
    \n    :if ( \$EtherNum>0 ) do={\r\
    \n      :log info ( \"The ether numbered-0 isn't Named \" . \$WanNM . \" o\
    r other interface is else named \" . \$WanNM . \".\")\r\
    \n      :for R from=0 to=\$EtherNumALl step=1 do={\r\
    \n      :delay 1s;\r\
    \n      :log info ( \"Reset ether numbered-\" . \$R . \"'s mac-addr...\"\
    \_)\r\
    \n      /interface ethernet reset-mac-address num=\$R;\r\
    \n      :delay 1s;\r\
    \n      :log info ( \"Rename ether numbered-\" . \$R . \"'s name to \" .\
    \_\$tmms )\r\
    \n      /interface ethernet set num=\$R name=(\"ether\" . \$R . \$tmms)\
    \r\
    \n      }\r\
    \n      :log info \"::Rename all the ether...\";\r\
    \n      :for l from=0 to=\$EtherTNum step=1 do={\r\
    \n      :set EachEthDNM [ /interface ethernet get num=\$l default-name ];\
    \r\
    \n      :delay 1s;\r\
    \n      /interface ethernet set num=\$l name=(\$EachEthDNM . \$l);\r\
    \n      }\r\
    \n    :delay 1s;\r\
    \n      :log info ( \"Rename ether numbered-0's name to \" . \$WanNM . \".\
    \" )\r\
    \n      /interface ethernet set num=0 name=\"\$WanNM\";\r\
    \n      :delay 1s;\r\
    \n    } else={\r\
    \n      :log info ( \"The ethernet numbered-0 is Named \" . \$WanNM . \".\
    \" )\r\
    \n    }\r\
    \n}\r\
    \n\r\
    \n} else={\r\
    \n:if ( [ :tobool [ /interface find name=\"\$WanNM\" ] ]=false ) do={\r\
    \n    :log info ( \"The ether named \" . \$WanNM . \" not exists, Renm def\
    ault-ether1 to \" . \$WanNM . \"...\")\r\
    \n\r\
    \n    :log info \"Reset all ether's mac-addr...\"\r\
    \n    :for r from=0 to=\$EtherNumALl step=1 do={\r\
    \n      /interface ethernet reset-mac-address num=\$r;\r\
    \n      :delay 1s;\r\
    \n    }\r\
    \n\r\
    \n    :for mn from=0 to=\$EtherNumALl step=1 do={\r\
    \n      :log info ( \"Rename ether numbered-\" . \$mn . \"'s name to ether\
    \" . \$mn . \$tmms . \".\" )\r\
    \n      :delay 1s;\r\
    \n      /interface ethernet set num=\$mn name=(\"ether\" . \$mn . \$tmms)\
    \r\
    \n    }\r\
    \n\r\
    \n    :log info \"::Rename all the ether...\";\r\
    \n    :for l from=0 to=\$EtherTNum step=1 do={\r\
    \n    :set EachEthDNM [ /interface ethernet get num=\$l default-name ];\r\
    \n      :delay 1s;\r\
    \n      /interface ethernet set num=\$l name=(\$EachEthDNM . \$l);\r\
    \n    }\r\
    \n    :delay 1s;\r\
    \n\r\
    \n:log info ( \"Rename default-ether1's name to \" . \$WanNM . \".\" )\r\
    \n    /interface ethernet set [ find default-name=ether1 ] name=\"\$WanNM\
    \";\r\
    \n    :delay 1s;\r\
    \n\r\
    \n} else={\r\
    \n\r\
    \n    :log info ( \"The ether named \" . \$WanNM . \" exists, Check ...\" \
    )\r\
    \n\r\
    \n    :local WanEtherDNM;\r\
    \n    :set WanEtherDNM [ /interface ethernet get [ find name=\"\$WanNM\" ]\
    \_default-name ];\r\
    \n    \r\
    \n    :if ( \"\$WanEtherDNM\"=\"ether1\" ) do={\r\
    \n    :log info ( \$WanNM . \" is bound to interface which default-name is\
    \_ether1 \" )\r\
    \n    } else={\r\
    \n      :log info ( \"The defaut-ether1 isn't Named \" . \$WanNM . \" or o\
    ther interface is else named \$WanNM...\" )\r\
    \n\r\
    \n      :log info \"Reset all ether's mac-addr...\"\r\
    \n      :for r from=0 to=\$EtherNumALl step=1 do={\r\
    \n      /interface ethernet reset-mac-address num=\$r;\r\
    \n      :delay 1s;\r\
    \n      }\r\
    \n\r\
    \n      :for mn from=0 to=\$EtherNumALl step=1 do={\r\
    \n      :log info ( \"Rename ether numbered-\" . \$mn . \"'s name to eth\
    er\" . \$mn . \$tmms . \".\" )\r\
    \n      /interface ethernet set num=\$mn name=(\"ether\" . \$mn . \$tmms\
    )\r\
    \n      }\r\
    \n\r\
    \n      :log info \"::Rename all the ether...\";\r\
    \n      :for l from=0 to=\$EtherTNum step=1 do={\r\
    \n      :set EachEthDNM [ /interface ethernet get num=\$l default-name ];\
    \r\
    \n      :delay 1s;\r\
    \n      /interface ethernet set num=\$l name=(\$EachEthDNM . \$l);\r\
    \n      }\r\
    \n      :delay 1s;\r\
    \n\r\
    \n      :log info ( \"Rename default-ether1's name to \" . \$WanNM . \".\"\
    \_)\r\
    \n      /interface ethernet set [ find default-name=ether1 ] name=\"\$WanN\
    M\";\r\
    \n      :delay 1s;\r\
    \n\r\
    \n    }\r\
    \n}\r\
    \n}\r\
    \n\r\
    \n\r\
    \n:if ( [ :tobool [ /interface list member find list=\"\$LanList\" interfa\
    ce=\"\$WanNM\" ] ]=true ) do={\r\
    \n:log info ( \"Remove ether \" . \$WanNM . \" from lists \" . \$LanList\
    \_)\r\
    \n/interface list member remove [ find list=\"\$LanList\" interface=\"\$\
    WanNM\" ];\r\
    \n:delay 1s;\r\
    \n} else={\r\
    \n:log info ( \"Inte-lists \" . \$LanList . \"'s member does not exist i\
    nterface \" . \$WanNM . \".\")\r\
    \n}\r\
    \n\r\
    \n\r\
    \n:if ( [ :tobool [ /interface list member find list=\"\$WanList\" interfa\
    ce=\"\$BridgeNM\" ] ]=true ) do={\r\
    \n:log info ( \"Remove interface bridge named \" . \$BridgeNM . \" from \
    lists named \" . \$WanList . \".\" )\r\
    \n/interface list member remove [ find list=\"\$WanList\" interface=\"\$\
    BridgeNM\" ];\r\
    \n:delay 1s;\r\
    \n} else={\r\
    \n:log info ( \"Inter-lists \" . \$WanList . \"'s member does not exist \
    interface \" . \$BridgeNM . \".\" )\r\
    \n}\r\
    \n\r\
    \n\r\
    \n:if ( [ :tobool [ /interface list member find list=\"\$WanList\" interfa\
    ce~\"ether\" ] ] =true ) do={\r\
    \n:log info ( \"Remove ether~ from Inter-lists \" . \$WanList . \"...\" \
    )\r\
    \n/interface list member remove [ find list=\"\$WanList\"interface~\"e\
    ther\" ];\r\
    \n:delay 1s;\r\
    \n} else={\r\
    \n:log info ( \"Inter-lists \" .\$WanList . \"'s member does not exist\
    \_interface ether~.\" )\r\
    \n}\r\
    \n\r\
    \n:log info ( \"Check whether all the interface named regex-^ether are in \
    \" . \$BridgeNM . \"'s port.\")\r\
    \n:for L from=1 to=\$NumEther step=1 do={\r\
    \n:set csifnm [ /interface ethernet get num=\$L name ];\r\
    \n:if ( \"\$csifnm\"!=\"\$WanNM\" ) do={\r\
    \n    :if ( [ :tobool [ /interface bridge port find bridge=\"\$BridgeNM\" \
    interface=\"\$csifnm\" ] ]=false ) do={\r\
    \n      :log info ( \"The interface \" . \$csifnm . \" is not in \" . \$Br\
    idgeNM . \"'s port. Adding...\")\r\
    \n      /interface bridge port add bridge=\"\$BridgeNM\" interface=\"\$csi\
    fnm\";\r\
    \n      :delay 3s;\r\
    \n    }\r\
    \n}\r\
    \n}\r\
    \n\r\
    \n:if ( [ :tobool [ /interface bridge port find bridge=\"\$BridgeNM\" inte\
    rface=\"\$WanNM\" ] ]=true ) do={\r\
    \n:log info ( \"Remove \" . \$WanNM . \" from \" . \$BridgeNM . \"'s por\
    t.\" )\r\
    \n/interface bridge port remove [ find bridge=\"\$BridgeNM\" interface=\
    \"\$WanNM\" ];\r\
    \n:delay 1s;\r\
    \n} else={\r\
    \n:log info ( \$BridgeNM . \"'s port does not exist \" . \$WanNM . \".\"\
    )\r\
    \n}\r\
    \n\r\
    \n:set pppoeint [ /interface pppoe-client get [ find name=\"\$pppoenm\" ] \
    interface ];\r\
    \n\r\
    \n:if (\"\$pppoeint\"!=\"\$WanNM\") do={\r\
    \n:log info ( \$pppoenm . \" is not bound to \" . \$WanNM . \"...\")\r\
    \n:log info \"::Set pppoe-client WAN-ether\"\r\
    \n/interface pppoe-client set [ find name=\"\$pppoenm\" ] interface=\"\$\
    WanNM\";\r\
    \n\r\
    \n# :log info ( \"Remove all interface named regex-^ether from \" . \$Br\
    idgeNM . \"'s port.\")\r\
    \n# /interface bridge port remove [ find bridge=\"\$BridgeNM\" interface\
    ~\"ether\" ];\r\
    \n\r\
    \n:log info ( \"Remove all interface named regex-^ether from list \" . \
    \$LanList . \"'s member.\")\r\
    \n/interface list member remove [ find list=\"\$LanList\" interface~\"et\
    her\" ];\r\
    \n\r\
    \n} else={\r\
    \n:log info ( \$pppoenm . \" is bound to \" . \$WanNM . \".\" )\r\
    \n}\r\
    \n\r\
    # \n/system script run [ find name=\"Your_DDSN_update-Script_Name\" ];\r\
    \n\r\
    \n:log info \":::-The End-: The pppoeout interface settings Checker.\"\r\
    \n"

贫民张大嘴 发表于 2024-5-28 11:35

上个月才换的5009,帮顶

hyes 发表于 2024-5-28 11:37

贫民张大嘴 发表于 2024-5-28 11:35
上个月才换的5009,帮顶

5009绝对值得~

数不清 发表于 2024-5-28 14:26

用过 5009,降级 4011,最后用RB450Gx4兜底。

Oscarice 发表于 2024-5-28 14:30

准备把rb750gr3换成chr,存一份看会不会用得上

hyes 发表于 2024-5-28 14:44

数不清 发表于 2024-5-28 14:26
用过 5009,降级 4011,最后用RB450Gx4兜底。

我4011性能不够用,CPU 0 1/3 4 动不动就是100%。
防火墙有点臃肿~~~
理论4011和5009处理能力差不多,可能是V7针对64位有优化。

hyes 发表于 2024-5-28 14:45

Oscarice 发表于 2024-5-28 14:30
准备把rb750gr3换成chr,存一份看会不会用得上

存好未运行脚本的back一份再存一份有此脚本和对应开机任务的脚本。。。

数不清 发表于 2024-5-28 15:08

hyes 发表于 2024-5-28 14:44
我4011性能不够用,CPU 0 1/3 4 动不动就是100%。
防火墙有点臃肿~~~
理论4011和5009处理能力差不多,可 ...

平时跑 PT 用RB450Gx4足矣,80+MiB/s下载处理器负载也就 30% 左右,金属外壳微温。
防火墙规则只用了官方默认,未做流控处理,家用千兆带宽PT下载同时并不影响家里人看爱优腾。

5009 带规则性能比 4011 有一定优势,但优势差异并不太大,5009缺点就是发热突出,底部建议垫一个散热金属块来辅助散热。

wswcx 发表于 2024-5-28 15:33

顶,希望大佬继续分享ROS相关的更多脚本

Joe_Li 发表于 2024-5-28 17:36

5009用户帮顶

幻呤乐 发表于 2024-5-28 17:40

虽然没有ROS设备,还是先收藏一下,感谢楼主分享

cctv180 发表于 2024-5-28 19:08

手动点赞,希望大佬继续分享ROS相关的更多脚本

Evalyn 发表于 2024-5-28 21:38

数不清 发表于 2024-5-28 15:08
平时跑 PT 用RB450Gx4足矣,80+MiB/s下载处理器负载也就 30% 左右,金属外壳微温。
防火墙规则只用了官方 ...

4011少个2.5G口算是最大遗憾了。。5009发热大概有多大,最近有点想换

老饭 发表于 2024-5-28 23:42

chr想换2116

blanksign 发表于 2024-5-29 00:43

我选择export,再import。

数不清 发表于 2024-5-29 09:30

Evalyn 发表于 2024-5-28 21:38
4011少个2.5G口算是最大遗憾了。。5009发热大概有多大,最近有点想换

现在 2.5g 交换机白菜价,4011可以搭配跑单臂路由,这对 ros 来说都不是事。
在广东的夏天,5009 底部垫散热块的情况下摸着烫手,还好系统还能正常运行。

Evalyn 发表于 2024-5-29 10:18

数不清 发表于 2024-5-29 09:30
现在 2.5g 交换机白菜价,4011可以搭配跑单臂路由,这对 ros 来说都不是事。
在广东的夏天,5009 底部垫 ...

2.5G我上联光猫用的,放交换机上不是很方便,内网2.5G和10G扩展倒是打算用sfp电口跑单臂下联交换机

hyes 发表于 2024-5-29 14:00

blanksign 发表于 2024-5-29 00:43
我选择export,再import。

不同机型可能需要改动才会im成功

blanksign 发表于 2024-5-29 14:51

hyes 发表于 2024-5-29 14:00
不同机型可能需要改动才会im成功

人工核验,再定点导入,这玩意顺利2分钟就能解决。不顺利,就10分钟。对于看不懂脚本的人来说,分析不出来逻辑。
页: [1]
查看完整版本: 分享Mikrotik RouterOS自动重命名ether和bridge pppoe网口纠错脚本