分享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"
上个月才换的5009,帮顶 贫民张大嘴 发表于 2024-5-28 11:35
上个月才换的5009,帮顶
5009绝对值得~ 用过 5009,降级 4011,最后用RB450Gx4兜底。 准备把rb750gr3换成chr,存一份看会不会用得上 数不清 发表于 2024-5-28 14:26
用过 5009,降级 4011,最后用RB450Gx4兜底。
我4011性能不够用,CPU 0 1/3 4 动不动就是100%。
防火墙有点臃肿~~~
理论4011和5009处理能力差不多,可能是V7针对64位有优化。
Oscarice 发表于 2024-5-28 14:30
准备把rb750gr3换成chr,存一份看会不会用得上
存好未运行脚本的back一份再存一份有此脚本和对应开机任务的脚本。。。 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缺点就是发热突出,底部建议垫一个散热金属块来辅助散热。 顶,希望大佬继续分享ROS相关的更多脚本 5009用户帮顶 虽然没有ROS设备,还是先收藏一下,感谢楼主分享 手动点赞,希望大佬继续分享ROS相关的更多脚本
数不清 发表于 2024-5-28 15:08
平时跑 PT 用RB450Gx4足矣,80+MiB/s下载处理器负载也就 30% 左右,金属外壳微温。
防火墙规则只用了官方 ...
4011少个2.5G口算是最大遗憾了。。5009发热大概有多大,最近有点想换 chr想换2116 我选择export,再import。 Evalyn 发表于 2024-5-28 21:38
4011少个2.5G口算是最大遗憾了。。5009发热大概有多大,最近有点想换
现在 2.5g 交换机白菜价,4011可以搭配跑单臂路由,这对 ros 来说都不是事。
在广东的夏天,5009 底部垫散热块的情况下摸着烫手,还好系统还能正常运行。 数不清 发表于 2024-5-29 09:30
现在 2.5g 交换机白菜价,4011可以搭配跑单臂路由,这对 ros 来说都不是事。
在广东的夏天,5009 底部垫 ...
2.5G我上联光猫用的,放交换机上不是很方便,内网2.5G和10G扩展倒是打算用sfp电口跑单臂下联交换机 blanksign 发表于 2024-5-29 00:43
我选择export,再import。
不同机型可能需要改动才会im成功 hyes 发表于 2024-5-29 14:00
不同机型可能需要改动才会im成功
人工核验,再定点导入,这玩意顺利2分钟就能解决。不顺利,就10分钟。对于看不懂脚本的人来说,分析不出来逻辑。
页:
[1]