:local b ([/ip firewall nat get [find comment=China-IP] out-interface]="<pptp-China>")
:if (!b && a) do={
/ip route set [find comment="China Gateway"] gateway=<pptp-China>
/ip firewall nat set [find comment=China-IP] out-interface=<pptp-China>
:log info "China IP NAT and Route were updated.";
}
複製代碼
.
01. Define local variable a, which receives the truth value of (/interface find name=pptp-China).
China给大陆vpn过来的user login ID,大家根据自己的settings来决定。a 将会是 true or false. 用括号是提取expression的true value。
02. Define local variable b,which receives the truth value of "([/ip firewall nat get [find comment=China-IP] out-interface]="<pptp-China>")".
这句比较长,大家看先从里面看。首先ip firewall nat table里有那么多条rules,script怎样知道在哪条rule找呢?我用的方法是先把某条rule先一些comment,然后通过这个comment找到那条rule的ID。Rule ID是什么,你打开nat rule table就知道(/ip/firewall/nat/print),在表里左手边的数字就是rule ID。忘了说一句这个中括号[]有什么用? 这是把return value,不是truth value,truth value用括号(),其他用[], 因为ID是数字value,所以用[]。“[/ip firewall nat get [find comment=China-IP] out-interface]”, 就是提取了那个rule的out-interface是什么?然后做logical comparision with “pptp-China”。如果是就通过括号()给出true,otherwise给false。
04:if (!b && a) do,这一步就是看看是nat的b = not(out-interface="pptp-China") and 大陆vpn过来过来的Link是否ready?如果 (!b && a)是true的就进行修改,什么是true?如果不是就scheduler再trigger后再检查。