Mikrotik OSおよびバックアップチャネルへの自動切り替え

最近、ADSLからイーサネットへの移行に関連して、Mikrotikの機器を試す素晴らしい機会がありました。 これに関連して、 RB750GLルーターが購入されました。 鉄片は、外部と機能性および信頼性の両方で優れていることが判明しました。
その結果、両方のチャネルを離れ、自動切り替えでバックアップを設定することになりました。 標準のゲートウェイスイッチングツールは、さまざまな障害をすべてカバーしているわけではないため、独自のスクリプトを作成する必要があります。

ネットワーク構成


1. Nhernink Ehernetチャネルは、ルーターの最初のポートに接続し、DHCPを介してIPを受信し、nlinkと呼ばれるpptp接続を取得します。 これがメイン接続になります。
2. DomolinkプロバイダーからのADSLチャネルは、ブリッジモードでDLink-2500を通過し、ルーターの2番目のポートに固定され、domolinkと呼ばれるpppoe接続が上に上がります。 これはバックアップ接続になります。
3.ルーターのポート3〜5は、デバイスをローカルネットワークに接続するために使用されます。

ルーター設定


ローカルエリアネットワーク上のコンピューターの接続とマスカレードの設定は簡単で、 公式wikiで詳細に説明されています

ppp接続を設定する場合、デフォルトルートの追加を無効にしてから、異なるメトリックと適切なコメントを使用して静的ルートを作成する必要があります。
/ip route
add comment=MainGW disabled=no distance=1 dst-address=0.0.0.0/0 gateway=nlink scope=30 target-scope=10
add comment=RsrvGW disabled=no distance=2 dst-address=0.0.0.0/0 gateway=domolink scope=30 target-scope=10

チャンネルを切り替えるには、距離パラメーターを変更します。 トラフィックは、このパラメーターの値が低いチャネルを通過します。

スクリプト


ルーターの起動時にグローバルパラメータを設定する


このスクリプトはset_global_parametersと呼ばれます
#Main interface name
:global MainIf nlink
#Reserve interface name
:global RsrvIf domolink
#Main interface ip address
:global MainIfAddress ""
#Reserve interface ip address
:global RsrvIfAddress ""

インターフェイスのIPアドレスの決定


メインインターフェイスのIPアドレスの決定


スクリプトはdefine_main_if_ipと呼ばれます
:global MainIf
:global MainIfAddress ""
:set MainIfAddress [/ip address get [find interface=$MainIf] address]

このスクリプトは、インターネットにアクセスするためのメインインターフェイスのIPアドレスを決定します。 このインターフェイスがない場合、スクリプトは失敗し、MainIfAddress変数には空の文字列が含まれます。

バックアップインターフェイスのIPアドレスの決定


スクリプトはdefine_reserved_if_ipと呼ばれます
:global RsrvIf
:global RsrvIfAddress ""
:set RsrvIfAddress [/ip address get [find interface=$RsrvIf] address]

これらのアドレスの定義は、個別のスクリプトで行われます。 これらの値をルーターの多くのスクリプトで使用し(たとえば、DynDNSのレコードを更新する)、ここでユーザー関数を作成することはできません。 直接アドレス決定コマンドは他のスクリプトでは使用できないことに注意してください。 インターフェイスに問題がある場合、エラーが生成され、スクリプトが完了します。

チャンネル切り替え


スクリプトはconnection_checkと呼ばれます
:global MainIf
:global RsrvIf
:global MainIfAddress
:global RsrvIfAddress

:local PingCount 3

#www.ru
:local PingTarget1 194.87.0.50

#ya.ru
:local PingTarget2 87.250.250.203

#google dns
:local PingTarget3 8.8.8.8

#Check main internet connection
:local MainIfInetOk false;

if ($MainIfAddress="") do={delay 5}

if ($MainIfAddress!="") do={
:local PingResult1 [/ping $PingTarget1 count=$PingCount interface=$MainIf]
:local PingResult2 [/ping $PingTarget2 count=$PingCount interface=$MainIf]
:local PingResult3 [/ping $PingTarget3 count=$PingCount interface=$MainIf]

:set MainIfInetOk (($PingResult1 + $PingResult2 + $PingResult3) >= (2 * $PingCount))
}

#Check reserved internet connection
:local RsrvIfInetOk false;

if ($RsrvIfAddress="") do={delay 5}

if ($RsrvIfAddress!="") do={
:local PingResult1 [/ping $PingTarget1 count=$PingCount interface=$RsrvIf]
:local PingResult2 [/ping $PingTarget2 count=$PingCount interface=$RsrvIf]
:local PingResult3 [/ping $PingTarget3 count=$PingCount interface=$RsrvIf]

:set RsrvIfInetOk (($PingResult1 + $PingResult2 + $PingResult3) >= (2 * $PingCount))
}

:put "MainIfInetOk=$MainIfInetOk"
:put "RsrvIfInetOk=$RsrvIfInetOk"

if (!$MainIfInetOk) do={
/log error "Main internet connection error"
}

if (!$RsrvIfInetOk) do={
/log error "Reserve internet connection error"
}

:local MainGWDistance [/ip route get [find comment="MainGW"] distance]
:local RsrvGWDistance [/ip route get [find comment="RsrvGW"] distance]
:put "MainGWDistance=$MainGWDistance"
:put "RsrvGWDistance=$RsrvGWDistance"

#SetUp gateways
if ($MainIfInetOk && ($MainGWDistance >= $RsrvGWDistance)) do={
/ip route set [find comment="MainGW"] distance=1
/ip route set [find comment="RsrvGW"] distance=2
/log info "Switch to main internet connection"
}

if (!$MainIfInetOk && $RsrvIfInetOk && ($MainGWDistance <= $RsrvGWDistance)) do={
/ip route set [find comment="MainGW"] distance=2
/ip route set [find comment="RsrvGW"] distance=1
/log warning "Switch to reserve internet connection"
}


特定のインターフェイスを介したping、およびチャネルを欠陥として認識するための基準に注意してください。 3つの異なるノードにpingを実行し、応答の3分の2未満しか受信しない場合、このインターフェイスではインターネットが機能しないと考えています。

プランナー


1. set_global_parametersスクリプトは、ルーターの起動時に1回実行されます。
2. IPアドレスを決定するためのスクリプトは、27秒ごとに実行されます。 この値は、メインスクリプトで同時に開始する回数を最小限に抑えるために選択されます。
3. connection_checkスクリプトは毎分実行されます。

結論


結果として得られるソリューションは、最小限のコストでホームネットワークの信頼性を大幅に向上させ、ローカルプロバイダーの最も高度な障害にうまく対処しますが、外部ネットワークノードの障害から十分に保護されます。

Source: https://habr.com/ru/post/J141785/


All Articles