NetGWMを使用したLinuxルーターでのプライマリおよび2つのバックアップオペレーターの構成

プライマリゲートウェイのバックアップタスクは、ネットワーク管理で最も一般的なものの1つです。 彼女は、Linuxベースのルーターを含む最新のルーターの大部分の発信チャネルの優先順位付けまたはバランス調整のメカニズムを実装する多くのソリューションを持っています。







フェイルセーフルーターに関する記事で、この問題を解決するための社内標準であるオープンソースNetGWM製品について簡単に言及し 、このユーティリティについて詳しく説明することを約束しました。 この記事では、ユーティリティの仕組み、使用する際に使用できる「機能」、および代替ソリューションの使用を放棄することにした理由について説明します。



なぜNetGWMなのか?



Linuxのメインゲートウェイの従来のバックアップスキームは、iproute2によって実装され、ほぼすべてのソースでほぼ同じに見えます。





このスキームの詳細は、「linux policy routing」のリクエストにより簡単にグーグル検索されます。 私たちの意見では、このスキームにはいくつかの明らかな欠点があり、それがNetGWMユーティリティを作成する主な動機となりました。



  1. スキームを変更する複雑さ、不十分な処理。
  2. ゲートウェイの数が3つ以上の場合、スクリプトロジックは複雑であり、メトリックに基づくゲートウェイの選択の実装も複雑です。
  3. チャネル損失検出の問題。 多くの場合、物理リンク、さらにはオペレーターのゲートウェイにもアクセスできますが、オペレーターのインフラストラクチャ内または上位のサービスプロバイダーの問題により、ネットワークには実際にはアクセスできません。 この問題を解決するには、ifupdownスクリプトに追加のロジックを追加する必要があり、メトリックに基づくルーティングでは原則として解決できません。
  4. ハンプティダンプティの問題。 このような問題は、優先度の高いチャネルで短期間の頻繁な通信の中断が見られる場合に発生します。 この場合、ゲートウェイはバックアップに正常に切り替わります。 問題はどこから来たように見えますか? 事実、電話、ビデオ通信、VPNトンネルなどの多くのサービスでは、中断の事実を判断して新しいセッションを確立するために特定のタイムアウトが必要です。 中断の頻度に応じて、これによりサービスの品質が急激に低下するか、完全に利用できなくなります。 この問題を解決するには、スクリプトロジックを複雑にすることも必要であり、メトリックでは完全に解決できません。


4つすべての問題を解決するのに役立つものを見ました:2つ以上のデフォルトゲートウェイをサポートするシンプルで管理可能なツール。チャネルの可用性を診断し、安定性をテストできます。 そして、そのようなオプションが見つかりませんでした。 それがNetGWMの始まりです。



GitHubおよびFlantリポジトリからのインストール



NetGWM(Network GateWay Manager)は、メインゲートウェイに優先順位を付けるための小さなユーティリティで、Pythonで記述され、無料のGNU GPL v3ライセンスで配布されます。 オリジナル版の作者はdriusha (Andrei Polovov)です。



ソースコードと英語のドキュメントはGitHubで入手でき、ロシア語の簡単なドキュメントと説明はこちらから入手できます



GitHubからのインストール:



 ##     : ## iproute2, conntrack,  python-yaml ##    : $ git clone git://github.com/flant/netgwm.git netgwm ##   (  ): $ cd netgwm && sudo make install ##    ,    NetGWM $ sudo sh -c "echo '100 netgwm_check' >> /etc/iproute2/rt_tables" ##   cron  root  netgwm   , ##          ## (,   ): $ sudo crontab -e */1 * * * * /usr/lib/netgwm/newtgwm.py
      
      





さらに、NetGWMを備えた既製のDEBパッケージをUbuntuのFlantリポジトリからインストールできます。 Ubuntu 14.04 LTSのインストールは次のようになります。



 ##  : $ sudo wget https://apt.flant.ru/apt/flant.trusty.common.list \ -O /etc/apt/sources.list.d/flant.common.list ##  : $ wget https://apt.flant.ru/apt/archive.key -O- | sudo apt-key add - ##  HTTPS- —  ,     : $ sudo apt-get install apt-transport-https ##      netgwm: $ sudo apt-get update && sudo apt-get install netgwm
      
      





Ubuntuでルーティングユーティリティテーブルを追加したり、cronを構成したりする必要はありません。 パッケージをインストールすると、テーブルが自動的に追加されます。 さらに、インストール中にnetgwm



サービスが登録され、そのinitスクリプトはデーモンとして小さなシェルスクリプト/usr/bin/netgwm



を開始し、次に/etc/default/netgwm



からINTERVAL



パラメーターの値を読み取り/etc/default/netgwm



(秒単位) )そして、指定された頻度でnetgwm.py



呼び出しnetgwm.py







カスタマイズ



NetGWMはポリシールーティングにも基づいており、各オペレーターのルーティングテーブルを事前に構成する必要があります。



オペレーターが3人いて、失敗した場合-オペレーター2が使用され、両方が失敗した場合-オペレーター3の場合、メインオペレーターがオペレーター1であることを確認する必要があるとします。



最初のオペレーターがeth1インターフェースに接続され、2番目がeth2に、3番目がeth3に接続されているとします。 最初のオペレーターには88.88.88.88ゲートウェイ、2番目のオペレーターには99.99.99.99ゲートウェイ、3番目には100.100.100.100があります。



いくつかの基本的なゲートウェイを使用してネットワークをセットアップする場合、ほとんどの場合、パケットラベル付けとNetFilterのconntrackモジュールを使用します。 これは、状態に基づいてルーティングテーブル間でパケットを配布するのに役立ちますが、必須ではありません。



パケットマーキングとconntrackを設定します。



 iptables -t mangle -A PREROUTING -i eth1 -m conntrack --ctstate NEW,RELATED -j CONNMARK --set-xmark 0x1/0x3 iptables -t mangle -A PREROUTING -i eth2 -m conntrack --ctstate NEW,RELATED -j CONNMARK --set-xmark 0x2/0x3 iptables -t mangle -A PREROUTING -i eth3 -m conntrack --ctstate NEW,RELATED -j CONNMARK --set-xmark 0x3/0x3 iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark --nfmask 0xffffffff --ctmask 0xffffffff iptables -t mangle -A OUTPUT -o eth1 -m conntrack --ctstate NEW,RELATED -j CONNMARK --set-xmark 0x1/0x3 iptables -t mangle -A OUTPUT -o eth2 -m conntrack --ctstate NEW,RELATED -j CONNMARK --set-xmark 0x2/0x3 iptables -t mangle -A OUTPUT -o eth3 -m conntrack --ctstate NEW,RELATED -j CONNMARK --set-xmark 0x3/0x3 iptables -t mangle -A OUTPUT -j CONNMARK --restore-mark --nfmask 0xffffffff --ctmask 0xffffffff iptables -t mangle -A POSTROUTING -o eth1 -m conntrack --ctstate NEW,RELATED -j CONNMARK --set-xmark 0x1/0x3 iptables -t mangle -A POSTROUTING -o eth2 -m conntrack --ctstate NEW,RELATED -j CONNMARK --set-xmark 0x2/0x3 iptables -t mangle -A POSTROUTING -o eth3 -m conntrack --ctstate NEW,RELATED -j CONNMARK --set-xmark 0x3/0x3 iptables -t mangle -A POSTROUTING -j CONNMARK --restore-mark --nfmask 0xffffffff --ctmask 0xffffffff
      
      





2.マークされたパケットのルーティングルールを追加します。 これは、loインターフェイスでのpost-up



イベント中に/etc/network/interfaces



から呼び出されるスクリプトを使用して行います。



 #!/bin/bash /sbin/ip rule flush # operator 1 /sbin/ip rule add priority 8001 iif eth1 lookup main /sbin/ip rule add priority 10001 fwmark 0x1/0x3 lookup operator1 /sbin/ip rule add from 88.88.88.88 lookup operator1 # operator 2 /sbin/ip rule add priority 8002 iif eth2 lookup main /sbin/ip rule add priority 10002 fwmark 0x2/0x3 lookup operator2 /sbin/ip rule add from 99.99.99.99 lookup operator2 # operator 3 /sbin/ip rule add priority 8002 iif eth3 lookup main /sbin/ip rule add priority 10002 fwmark 0x3/0x3 lookup operator3 /sbin/ip rule add from 100.100.100.100 lookup operator3
      
      





3. /etc/iproute2/rt_tables



ルーティングテーブルを宣言します。



 #  : 255 local 254 main 253 default 0 unspec #  ,   ( dpkg)  : 100 netgwm_check #   ,     : 101 operator1 102 operator2 103 operator3
      
      





4. NetGWMを構成します。 デフォルトでは、 netgwm.py



/etc/netgwm/netgwm.yml



で構成ファイルを/etc/netgwm/netgwm.yml



ますが、 -c



スイッチでこれをオーバーライドできます。 ユーティリティをセットアップします。



 #          #   ()   . 1 -    #  ,           #      .      ( #    )      (  ). #          # /etc/iproute2/rt_tables gateways: operator1: {ip: 88.88.88.88, priority: 1} operator2: {ip: 99.99.99.99, priority: 2} operator3: {ip: 100.100.100.100, priority: 3} #     «-»,   #  ( ) «». #      ( ), #   netgwm  ,    min_uptime: 900 #   ,    netgwm  #    .      #     ,      , #    .   ,  netgwm   #       ( AND)   check_sites: - 8.8.8.8 # Google public DNS - 4.2.2.2 # Verizon public DNS #   netgwm      #  .    .. #  ,    true,  netgwm  #       check_all_gateways: false
      
      





5.切り替え時のアクションを構成する



切り替えが発生した場合、メインゲートウェイを変更すると、 /etc/netgwm/post-replace.d/*



ディレクトリにあるすべての実行可能ファイルが実行されます。 この場合、6つのコマンドラインパラメーターが各ファイルに転送されます。





これらの変数に基づいて、スクリプトは接続するオペレーターに応じてアクションのロジックを記述できます(ルートの追加または削除、通知の送信、シェーピングの構成など)。 たとえば、通知を送信するシェルスクリプトを提供します。



 #!/bin/bash # ,  :    netgwm if [ "$4" = 'NaN' ] && [ "$5" = 'NaN' ] then STATE='start' else STATE='switch' fi #       case $STATE in 'start') /usr/bin/flant-integration --sms-send="NetGWM on ${HOSTNAME} has been started and now use gw: $1 - $2" ;; 'switch') /usr/bin/flant-integration --sms-send="NetGWM on ${HOSTNAME} has switched to new gw: $1 - $2 from gw: $4 - $5" ;; *) /usr/bin/logger -t netgwm "Unknown NetGWM state. Try restarting service fo fix it." ;; esac exit
      
      





6. DEBパッケージをインストールした場合、Ubuntuでnetgwm



サービスを開始します。



 $ sudo service netgwm start
      
      





GitHubからNetGWMを受け取った場合、以前にインストールされたcronのジョブはすでにメインゲートウェイの可用性をチェックしているため、追加の手順は必要ありません。



ロギング



NetGWMは、切り替えイベントをlog /var/log/netgwm







 $ tail -n 3 /var/log/netgwm.log 2017-07-14 06:25:41,554 route replaced to: via 88.88.88.88 2017-07-14 06:27:09,551 route replaced to: via 99.99.99.99 2017-07-14 07:28:48,573 route replaced to: via 88.88.88.88
      
      





保存された切り替え履歴は、インシデントを分析し、中断の理由を判断するのに役立ちます。



生産で検証済み



約4年間、NetGWMはさまざまなサイズの30以上のLinuxルーターで当社で使用されています。 ユーティリティの信頼性は、動作中に繰り返しテストされています。 たとえば、2014年5月以降、インストールの1つで、NetGWMは137人のオペレータの切り替えを問題なく処理しました。



私たちのすべてのニーズをカバーする安定性と、長期間にわたる運用上の問題の欠如は、私たちが実際にプロジェクトの開発に携わらないという事実につながりました。 NetGWMコードはPythonで記述されているため、ユーティリティを新しいバージョンのオペレーティングシステムに適合させる必要はありません。 ただし、 パッチをGitHubに送信するか、コメントに機能リクエストを書くだけでNetGWMの開発に参加することにした場合は、非常に満足しています。



おわりに



NetGWMには、メインゲートウェイの優先度を管理するためのニーズを完全にカバーする、安定した、柔軟で、拡張可能な(スクリプトの助けを借りて)ユーティリティがあります。



NetGWMの使用に関する質問も歓迎します。コメント欄でご確認ください。



PSブログで「 フォールトトレラントLinuxルーターのレシピ 」もお読みください。新しい資料を見逃さないように登録してください。



All Articles