找回密码
 加入我们
搜索
      
查看: 555|回复: 0

[网络] 分享Mikrotik RouterOS脚本:pppoe的物理网卡、以及LAN/WAN list排错

[复制链接]
发表于 2025-3-14 16:01 | 显示全部楼层 |阅读模式
本帖最后由 hyes 于 2025-3-14 16:03 编辑

此脚本自用,大概是我这种奇葩使用情况时候可能用到:
1、x86;
2、pppoe;
3、防火墙基于interface-list,区分了WAN-List、LAN-list;
4、新机器可能没有vga显示接口或者显示器没有了老接口了。。。又或者console口有有点费劲;
5、基于interface ether num轮替检查和排错。检查ether的advertise是否有效,应该可以排除光电复用网卡被设置为pppoe口~~只有1个有效物理网卡时候会禁用pppoe并并入bridge。

当然、最简单的办法是写脚本直接再backup之前启用allow all ip/mac to winbox。

没有做完全测试,仅供参考,主要就是为了backup恢复后,不通过vga或者console,网线直接可以winbox。
ps: 为啥不直接rsc配置导入,因为有时候,真的很难导入成功,排错也费劲。


  1. :delay 15s;
  2. :log info ":::-The Start-:The pppoeout interface settings Checker."

  3. :local pppoenm;
  4. :local LanList;
  5. :local WanList;
  6. :local WanNM;

  7. :set pppoenm "pppoe-out1";
  8. :set WanNM "WANifc";
  9. :set LanList "LANs";
  10. :set WanList "WANs";

  11. ##------------------------------------------------------------------------------------------##
  12. #  !!!! DO NOT CHANGE ANYTHING BELOW THIS LINE, IF YOU ARE NOT SURE WHAT YOU ARE DOING !!!!  #
  13. ##------------------------------------------------------------------------------------------##


  14. :local pppoeint;
  15. :local BridgeNM;
  16. :local tmms;
  17. :local Ether1NM;
  18. :local EtherNumALl;
  19. :local EachEthNM;
  20. :local EachEthDNM;


  21. :local EtherNum;
  22. :local NumEther;
  23. :local EtherTNum;
  24. :local EtherANum;
  25. :local MaxNum;
  26. :local csifnm;
  27. :local Ether1Count;

  28. :local adv;
  29. :local advallCount;

  30. :set tmms ([ :pick [/system clock get time ] 0 2 ] . [ :pick [/system clock get time ] 3 5 ] . [ :pick [ /system clock get time ] 6 8 ] );


  31. :set pppoeint [ /interface pppoe-client get [ find name="$pppoenm" ] interface ];
  32. :set BridgeNM [ /interface bridge get num=0 name ];


  33. # for loop to check how many ether there are.
  34. :local Minimum; \
  35. :for Minimum from=0 to=24 step=1 do={ \
  36.   :do { \
  37.     /interface ethernet get num="$Minimum" name;
  38.     :set EtherNum [ :tonum $Minimum ];
  39.     :set NumEther [ :tonum $Minimum ];
  40.     :set EtherTNum [ :tonum $Minimum ];
  41.     :set EtherANum [ :tonum $Minimum ];
  42.     :set EtherNumALl [ :tonum $Minimum ];
  43.     :set MaxNum [ :tonum ( $Minimum+1 ) ];
  44.     } on-error={
  45.       :if ( [:tonum $Minimum ]<=0 ) do={
  46.         :log info "::There is at most one ether."

  47.         :if ( [ :tobool [ /interface find default-name=ether1 ] ]=true ) do={
  48.           :set Ether1NM [ /interface get [find default-name=ether1 ] name]

  49.           :log info ( "Disabled " . $pppoenm . "." )
  50.           /interface pppoe-client set [ find name="$pppoenm" ] disabled=no
  51.          
  52.           :if ( [ :tobool [ /interface list member find list="$WanList" interface="$Ether1NM" ] ]=true ) do={
  53.             :log info ( "Remove " . $Ether1NM . " from list named " . $WanList . "." );
  54.             /interface list member remove [ find list="$WanList" interface="$Ether1NM" ];
  55.           };

  56.           :if ( [ :tobool [ /interface bridge port find bridge="$BridgeNM" interface="$Ether1NM" ] ]=false ) do={
  57.             :log info ( "Add " . $Ether1NM . " to list list named " . $LanList . "." );
  58.             /interface bridge port add bridge="$BridgeNM" interface="$Ether1NM";
  59.           };
  60.          
  61.           :if ( [ :tobool [ /interface list member find list="$WanList" interface="$BridgeNM" ] ]=true ) do={
  62.             :log info ( "Remove interface bridge named " . $BridgeNM . " from lists named " . $WanList . "." )
  63.             /interface list member remove [ find list="$WanList" interface="$BridgeNM" ];
  64.             :delay 2s;
  65.           } else={
  66.             :log info ( "Inter-lists " . $WanList . "'s member does not exist interface " . $BridgeNM . "." )
  67.           };

  68.           :if ( [ :tobool [ /interface list member find list="$WanList" interface~"ether" ] ] =true ) do={
  69.             :log info ( "Remove ether~ from Inter-lists " . $WanList . "..." )
  70.             /interface list member remove [ find list="$WanList" interface~"ether" ];
  71.             :delay 2s;
  72.           } else={
  73.             :log info ( "Inter-lists " .  $WanList . "'s member does not exist interface ether~." )
  74.           };

  75.           :log warning  "The only ehter has been set as the bridge port..."
  76.           :error "The only ehter has been set as the bridge port..."
  77.         } else={
  78.           :log info "::There is no ethernet interface with default-name=ether1."
  79.           :error "::There is no ethernet interface with default-name=ether1."
  80.         }
  81.       }
  82.     }
  83. }



  84. :delay 2s;
  85. :log info ( "There are " . $MaxNum . " ethernet interface in total." )



  86. # Check the number of ethernet interface with effective advertising-value.
  87. :set advallCount 0;
  88. :for advchk from=0 to=$EtherANum step=1 do={ \
  89.   :set adv ( [ /interface ethernet monitor num=$advchk once as-value ]->"advertising" )
  90.   :delay 2s;
  91.   :if ( "$adv"!="" ) do={
  92.     :set advallCount ( $advallCount+1)
  93.   }
  94. }

  95. :log info ( "::There are " . $advallCount . " ethernet interface with effective advertising-value." );
  96. :if ( [:tonum $advallCount ]<=1 ) do={
  97.   :log info "::The bridge may not be functioning properly."

  98.   :log info ( "Disabled " . $pppoenm . "." )
  99.   /interface pppoe-client set [ find name="$pppoenm" ] disabled=no

  100.   :for e from=0 to=$EtherNumALl step=1 do={
  101.     :set csifnm [ /interface ether get num=$e name ];

  102.     :log info ( "Remove num" . $e . " from list named " . $WanList . "." );
  103.     :if ( [ :tobool [ /interface list member find list="$WanList" interface="$csifnm" ] ]=true ) do={
  104.       /interface list member remove [ find list="$WanList" interface="$csifnm" ];
  105.     }
  106.    
  107.     :log info ( "Add " . $csifnm . " to bridge " . $BridgeNM . "." );
  108.     :if ( [ :tobool [ /interface bridge port find bridge="$BridgeNM" interface="$csifnm" ] ]=false ) do={
  109.       /interface bridge port add bridge="$BridgeNM" interface="$csifnm";
  110.     }
  111.   };

  112.     :if ( [ :tobool [ /interface list member find list="$WanList" interface="$BridgeNM" ] ]=true ) do={
  113.       :log info ( "Remove interface bridge named " . $BridgeNM . " from lists named " . $WanList . "." )
  114.       /interface list member remove [ find list="$WanList" interface="$BridgeNM" ];
  115.       :delay 2s;
  116.     } else={
  117.       :log info ( "Inter-lists " . $WanList . "'s member does not exist interface " . $BridgeNM . "." )
  118.     };

  119.     :if ( [ :tobool [ /interface list member find list="$WanList" interface~"ether" ] ] =true ) do={
  120.       :log info ( "Remove ether~ from Inter-lists " . $WanList . "..." )
  121.       /interface list member remove [ find list="$WanList" interface~"ether" ];
  122.       :delay 2s;
  123.     } else={
  124.       :log info ( "Inter-lists " .  $WanList . "'s member does not exist interface ether~." )
  125.     };

  126.   :log warning "Done to bridge all ethernet interface."
  127.   :error "Done to bridge all ethernet interface."
  128. }




  129. :if ( [ :tobool [ /interface find name="$WanNM" ] ]=false ) do={
  130.   :log info ( "::The ether named " . $WanNM . " not exists." );
  131.   :log info ( "::Sequentially try to name the ethernet with effective advertising-valueto " . $WanNM . ".");
  132.   
  133.   :log info "Reset all ether's mac-addr..."
  134.   :for r from=0 to=$EtherNumALl step=1 do={
  135.     /interface ethernet reset-mac-address num=$r;
  136.     :delay 2s;
  137.   }

  138.   :log info "Rename all ethernet's name..."
  139.   :for mn from=0 to=$EtherNumALl step=1 do={
  140.     :log info ( "Rename ethernet numbered-" . $mn . "'s name to ether" . $mn . $tmms . "." )
  141.     /interface ethernet set num=$mn name=("ether" . $mn . $tmms)
  142.     :delay 2s;
  143.   }

  144.   :for L from=0 to=$EtherTNum step=1 do={
  145.   :set EachEthDNM [ /interface ethernet get num=$L default-name ];
  146.     :delay 2s;
  147.     /interface ethernet set num=$L name=($EachEthDNM . $L);
  148.   }

  149.   :for X from=0 to=$EtherTNum step=1 do={
  150.     :delay 2s;
  151.     :local advtnew;
  152.     :set advtnew ( [ /interface ethernet monitor num=$X once as-value ]->"advertising" );\
  153.     :if ( "$advtnew"!="" ) do={
  154.       :log info ( "Rename ether numbered-" . $X . "'s name to " . $WanNM . "." );
  155.       /interface ethernet set num=$X name="$WanNM";
  156.       :delay 3s;
  157.       :log warning "The system will reboot in 15 seconds";
  158.       :delay 15s;
  159.       /system reboot;
  160.     }
  161.   }
  162. } else={
  163.   :log info ( "The ether named " . $WanNM . " exists, Check..." )
  164.   :set adv ( [ /interface ethernet monitor [ find name="$WanNM" ] once as-value ]->"advertising" );
  165.   :delay 2s;
  166.   :if ( "$adv"="" ) do={
  167.     :log info ( "The ethernet " . $WanNM . "'s advertising value is empty." );
  168.     :log info ( "::Sequentially try to name the ether with effective advertising-value to " . $WanNM . ".");
  169.     :log info "Reset all ether's mac-addr..."
  170.     :for r from=0 to=$EtherNumALl step=1 do={
  171.       /interface ethernet reset-mac-address num=$r;
  172.       :delay 2s;
  173.     }

  174.     :log info "::Rename all the ether...";
  175.     :for mn from=0 to=$EtherNumALl step=1 do={
  176.       :log info ( "Rename ether numbered-" . $mn . "'s name to ether" . $mn . $tmms . "." )
  177.       :delay 2s;
  178.       /interface ethernet set num=$mn name=("ether" . $mn . $tmms)
  179.     };
  180.     :delay 2s;
  181.     :for l from=0 to=$EtherTNum step=1 do={
  182.       :set EachEthDNM [ /interface ethernet get num=$l default-name ];
  183.       :delay 2s;
  184.       /interface ethernet set num=$l name=($EachEthDNM . $l);
  185.     };

  186.     :for X from=0 to=$EtherTNum step=1 do={
  187.       :delay 2s;
  188.       :local advtnew;
  189.       :set advtnew ( [ /interface ethernet monitor num=$X once as-value ]->"advertising" );\
  190.       :if ( "$advtnew"!="" ) do={
  191.         :log info ( "Rename ether numbered-" . $X . "'s name to " . $WanNM . "." );
  192.         /interface ethernet set num=$X name="$WanNM";
  193.         :delay 3s;
  194.         :log warning "The system will reboot in 15 seconds";
  195.         :delay 15s;
  196.         /system reboot;
  197.       }
  198.     }

  199.   } else={
  200.     :log info ( "The ether named " . $WanNM . " has a effective advertising-value." );
  201.   }
  202. }



  203. :if ( [ :tobool [ /interface list member find list="$LanList" interface="$WanNM" ] ]=true ) do={
  204.   :log info ( "Remove ether " . $WanNM . " from lists " . $LanList )
  205.   /interface list member remove [ find list="$LanList" interface="$WanNM" ];
  206.   :delay 2s;
  207. } else={
  208.   :log info ( "Inte-lists " . $LanList . "'s member does not exist interface " . $WanNM . ".")
  209. }


  210. :if ( [ :tobool [ /interface list member find list="$WanList" interface="$BridgeNM" ] ]=true ) do={
  211.   :log info ( "Remove interface bridge named " . $BridgeNM . " from lists named " . $WanList . "." )
  212.   /interface list member remove [ find list="$WanList" interface="$BridgeNM" ];
  213.   :delay 2s;
  214. } else={
  215.   :log info ( "Inter-lists " . $WanList . "'s member does not exist interface " . $BridgeNM . "." )
  216. }


  217. :if ( [ :tobool [ /interface list member find list="$WanList" interface~"ether" ] ] =true ) do={
  218.   :log info ( "Remove ether~ from Inter-lists " . $WanList . "..." )
  219.   /interface list member remove [ find list="$WanList"  interface~"ether" ];
  220.   :delay 2s;
  221. } else={
  222.   :log info ( "Inter-lists " .  $WanList . "'s member does not exist interface ether~." )
  223. }

  224. :log info ( "Check whether all the interface named regex-^ether are in " . $BridgeNM . "'s port.")
  225. :for L from=1 to=$NumEther step=1 do={
  226.   :set csifnm [ /interface ethernet get num=$L name ];
  227.   :if ( "$csifnm"!="$WanNM" ) do={
  228.     :if ( [ :tobool [ /interface bridge port find bridge="$BridgeNM" interface="$csifnm" ] ]=false ) do={
  229.       :log info ( "The ethernet " . $csifnm . " is not in " . $BridgeNM . "'s port. Adding...")
  230.       /interface bridge port add bridge="$BridgeNM" interface="$csifnm";
  231.       :delay 3s;
  232.     }
  233.   }
  234. }

  235. :if ( [ :tobool [ /interface bridge port find bridge="$BridgeNM" interface="$WanNM" ] ]=true ) do={
  236.   :log info ( "Remove " . $WanNM . " from " . $BridgeNM . "'s port." )
  237.   /interface bridge port remove [ find bridge="$BridgeNM" interface="$WanNM" ];
  238.   :delay 2s;
  239. } else={
  240.   :log info ( $BridgeNM . "'s port does not exist " . $WanNM . ".")
  241. }

  242. :set pppoeint [ /interface pppoe-client get [ find name="$pppoenm" ] interface ];

  243. :if ("$pppoeint"!="$WanNM") do={
  244.   :log info ( $pppoenm . " is not bound to " . $WanNM . "...")
  245.   :log info "::Set pppoe-client WAN-ether"
  246.   /interface pppoe-client set [ find name="$pppoenm" ] interface="$WanNM";

  247.   # :log info ( "Remove all interface named regex-^ether from " . $BridgeNM . "'s port.")
  248.   # /interface bridge port remove [ find bridge="$BridgeNM" interface~"ether" ];

  249.   # :log info ( "Remove all interface named regex-^ether from list " . $LanList . "'s member.")
  250.   # /interface list member remove [ find list="$LanList" interface~"ether" ];

  251. } else={
  252.   :log info ( $pppoenm . " is bound to " . $WanNM . "." )
  253. }

  254. # :delay 3s;
  255. # /system script run [ find where name="synddnsScr" ];
  256. # :delay 5s;

  257. :log info ":::-The End-: The pppoeout interface settings Checker."
复制代码
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

Archiver|手机版|小黑屋|Chiphell ( 沪ICP备12027953号-5 )沪公网备310112100042806 上海市互联网违法与不良信息举报中心

GMT+8, 2025-4-27 07:48 , Processed in 0.008955 second(s), 5 queries , Gzip On, Redis On.

Powered by Discuz! X3.5 Licensed

© 2007-2024 Chiphell.com All rights reserved.

快速回复 返回顶部 返回列表