{"id":476,"date":"2022-12-21T10:41:47","date_gmt":"2022-12-21T02:41:47","guid":{"rendered":"https:\/\/blog.worren.net\/?p=476"},"modified":"2022-12-24T00:25:28","modified_gmt":"2022-12-23T16:25:28","slug":"routeros-change-mac-in-rand-automatically","status":"publish","type":"post","link":"https:\/\/blog.worren.net\/?p=476","title":{"rendered":"RouterOS change MAC in rand automatically ."},"content":{"rendered":"<div class='drop-case'> <p> \u56e0\u70ba\u6709\u4e00\u4e9b\u9700\u6c42, \u6709\u4e00\u53f0 RouterBoard \u5f97\u4e00\u76f4\u63db MAC address . \u82b1\u4e86\u4e00\u9ede\u6642\u9593\u7814\u7a76\u4e86\u4e00\u4e0b RouterOS script , \u8b93\u6307\u5b9a\u7684 interface \u63db\u4e0a rand \u7684mac address .\u00a0  <!--more--> \u5f9e\u7db2\u8def\u4e0a\u627e\u5230\u73fe\u6210\u7684 code \u53ef\u4ee5\u7522\u751f\u51fa rand mac address , \u4f46\u771f\u8981\u62ff\u4f86\u7528, \u537b\u6709\u4e0d\u5c0f\u7684\u6a5f\u7387\u51fa\u73fe failure: invalid mac address &#8230; \u7814\u7a76\u4e86\u4e00\u4e0b\u00a0 mac address \u7684\u898f\u5247, \u770b\u4e0d\u51fa\u5565\u7aef\u502a, \u7d22\u6027\u5c31\u4fee\u6539\u4e86\u4e0b\u9019\u500b\u73fe\u6210\u7684 code , \u4e26\u5f04\u6210\u4e00\u500b function , \u53ef\u4ee5\u81ea\u5df1\u4e00\u76f4\u8a66\u5230\u6210\u529f\u70ba\u6b62. \u540c\u6642\u4e5f\u8a2d\u4e0b\u4e86\u4e00\u500b\u91cd\u8a66\u7684\u4e0a\u9650 . \u7d00\u9304\u5982\u4e0b, \u4e5f\u6b61\u8fce\u6709\u9700\u6c42\u7684\u4eba\u76f4\u63a5\u4eab\u7528 .<\/div>\n<pre><code>\r\n\r\n:global gainmac \r\n:global lastmac 0\r\n:global funGainMac do={\r\n    # modified from https:\/\/forum.mikrotik.com\/viewtopic.php?t=91229\r\n    # Generate random-ish MAC address\r\n    # Tested on RouterOS v6.49.7 \r\n    \r\n    #to call global function , need to declare in function . \r\n    :global funGainMac\r\n    :global gainmac \r\n    :global lastmac \r\n\r\n\r\n    # if firewall rules can't be found, add them\r\n    if ( [ :len [ \/ip firewall filter find comment~\"fwrnum\" ] ] = 0 ) do={\r\n        :for i from=1 to=12 do={\r\n            \/ip firewall filter add action=passthrough chain=input random=\"$i\" comment=\"fwrnum$i\";\r\n        }\r\n    }\r\n\r\n    #delay 1500ms to wait for the rand rule above be ready\r\n    :delay 700ms\r\n\r\n    # MAC characters array\r\n    :local macTable A,B,C,D,E,F,0,1,2,3,4,5,6,7,8,9\r\n    # length of MacTable array\r\n    :local macTableLen [ :len $macTable ];\r\n    # variable that will hold our mac address\r\n    :local mac;\r\n\r\n    # generate 12 mac address characters\r\n    :for i from=1 to=12 do={\r\n    # get packet number from each firewall rule\r\n        :local v [\/ip firewall filter get [find comment=\"fwrnum$i\"] packets ];\r\n    # add $i*$i value to $v\r\n        :set v ( $v + ( $i * $i ) );\r\n    # add time values, last value of minutes, and both seconds values\r\n        :local t ( [ :pick [\/system clock get time] 4 5 ] . [ :pick [\/system clock get time] 6 8 ] );\r\n    # reverse values, increasing frequency of first number change\r\n        :set t ( [ :pick $t 2 ] . [ :pick $t 1 ] . [ :pick $t 0 ] );\r\n    # add time seed to $v\r\n        :set v ( $v + $t );\r\n    # if packet number is greater than 100, just grab last 2 digits, as they change most frequently\r\n        if ( $v &gt;= 100 ) do={\r\n            :set v [ :pick $v ( [ :len $v ] - 2 ) [ :len $v ] ];\r\n        }\r\n    # reverse the two digits, increasing frequency of variable change\r\n        :set v ( [ :pick $v 1 ] . [ :pick $v 0 ] );\r\n    # while the value is greater than or equal to the length of the macTable array\r\n        while ( $v &gt;= $macTableLen ) do={\r\n    # subtract 15, one less than macTable length, so as to create a rainbow effect so to speak\r\n            :set v ( $v - 15 );\r\n        }\r\n    # create mac starting at the end, get mac char from macTable based on our value\r\n        :set mac ( [ :pick $macTable $v ] . $mac );\r\n    # add mac address colons at appropriate spots\r\n        if ($i = 2 || $i = 4 || $i = 6 || $i = 8 || $i = 10) do={\r\n            :set mac ( \":\" . $mac );\r\n        }\r\n    }\r\n\r\n    # remove firewall rules\r\n    \/ip firewall filter remove [ find comment~\"fwrnum\" ];\r\n    :local fNotToChang 0\r\n\r\n    if ( $mac = $lastmac) do={\r\n        $funGainMac\r\n        :set fNotToChang 1\r\n    }\r\n\r\n    if ( $fNotToChang = 0 ) do={\r\n        :set gainmac $mac\r\n        :set lastmac $mac\r\n    }\r\n\r\n\r\n}\r\n\r\n:global funSetMac do={\r\n\r\n    :global funGainMac\r\n    :global funSetMac\r\n    :global gainmac \r\n    :local mac\r\n\r\n    $funGainMac\r\n    :set mac $gainmac\r\n\r\n    # show mac address\r\n    #:put $mac;\r\n    #:put [\/interface ethernet set ether5-slave-local mac-address=$mac];\r\n    #[\/interface ethernet set $strEth mac-address=$mac];\r\n    :do {\r\n        [\/interface ethernet set $strEth mac-address=$mac];\r\n    } on-error={};\r\n\r\n    :local newmac [\/interface ethernet get [find where name=\"$strEth\"] mac-address];\r\n    #:put $newmac;\r\n    :local strMsg \r\n    if ($mac = $newmac) do={\r\n        #:put \"$strEth change MAC ok !!\";\r\n        :set strMsg \", $strEth change MAC ok !!\"\r\n    } \r\n\r\n    :local b $1;\r\n    :set b ($1-1);\r\n    :put \"$b, mac=$mac, mac of Eth = $newmac $strMsg\" ;\r\n    if ($b &gt; 0 and $mac != $newmac ) do={                \r\n        $funSetMac strEth=$strEth $b\r\n    }\r\n\r\n\r\n}\r\n\r\n:global funSetMacBridge do={\r\n\r\n    :global funGainMac\r\n    :global funSetMacBridge\r\n    :global gainmac \r\n    :local mac\r\n\r\n    $funGainMac\r\n    :set mac $gainmac\r\n\r\n    # show mac address\r\n    #:put $mac;\r\n    :do {\r\n        [\/interface bridge set $strEth auto-mac=yes];\r\n        [\/interface bridge set $strEth auto-mac=no];\r\n        [\/interface bridge set $strEth auto-mac=no admin-mac=$mac ];\r\n    } on-error={};\r\n\r\n    :local newmac [\/interface bridge get [find where name=\"$strEth\"] admin-mac];\r\n    #:put $newmac;\r\n    :local strMsg \r\n    if ($mac = $newmac) do={\r\n        #:put \"$strEth change MAC ok !!\";\r\n        :set strMsg \", $strEth change MAC ok !!\"\r\n    } \r\n\r\n    :local b $1;\r\n    :set b ($1-1);\r\n    :put \"$b, mac=$mac, mac of Eth = $newmac $strMsg\" ;\r\n    if ($b &gt; 0 and $mac != $newmac ) do={                \r\n        $funSetMacBridge strEth=$strEth $b\r\n    }\r\n\r\n\r\n}\r\n\r\n#call funSetMac , arg0=define interface name , arg1= times to retry\r\n$funSetMacBridge strEth=\"bridge\" 15\r\n:put \"-----------------------\";\r\n$funSetMac strEth=\"ether5\" 15\r\n:put \"-----------------------\";\r\n$funSetMac strEth=\"ether4\" 15\r\n:put \"-----------------------\";\r\n$funSetMac strEth=\"ether3\" 15\r\n:put \"-----------------------\";\r\n$funSetMac strEth=\"ether2\" 15\r\n:put \"-----------------------\";\r\n\r\n\r\n<\/code><\/pre>\n <p> &nbsp;\n","protected":false},"excerpt":{"rendered":" <p> \u56e0\u70ba\u6709\u4e00\u4e9b\u9700\u6c42, \u6709\u4e00\u53f0 RouterBoard \u5f97\u4e00\u76f4\u63db MAC address . \u82b1\u4e86\u4e00\u9ede\u6642\u9593\u7814\u7a76\u4e86\u4e00\u4e0b RouterOS script , \u8b93\u6307\u5b9a\u7684 interface \u63db\u4e0a rand \u7684mac address .\u00a0 <\/p> \n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[4,2],"tags":[],"_links":{"self":[{"href":"https:\/\/blog.worren.net\/index.php?rest_route=\/wp\/v2\/posts\/476"}],"collection":[{"href":"https:\/\/blog.worren.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.worren.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.worren.net\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.worren.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=476"}],"version-history":[{"count":6,"href":"https:\/\/blog.worren.net\/index.php?rest_route=\/wp\/v2\/posts\/476\/revisions"}],"predecessor-version":[{"id":487,"href":"https:\/\/blog.worren.net\/index.php?rest_route=\/wp\/v2\/posts\/476\/revisions\/487"}],"wp:attachment":[{"href":"https:\/\/blog.worren.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=476"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.worren.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=476"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.worren.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=476"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}