Monday, October 3, 2016 5:00AM to 11:00AM (UTC) Schedouled down time to change site domain

Ethernetのセカンドポートの有効な活用法

 最新のPC本体やマザーボードを購入すると、Ethernetポート2基ないしEthernetポート/Wi-Fiポート各1基という2つのネットワークインタフェースが付いてくるケースも多くなっている。こうしたセカンドポートの標準装備というのも、メーカ側にすれば製品カタログの仕様欄に記載する項目を増やす安価な方法なのかもしれないが、ユーザ側からすれば実際何に使用すればいいのか分からないというのが実状だろう。しかしながらあなたがLinuxユーザであれば、具体的な使い道はいくつも存在しているのだ。

 ごく安易な発想をすると、セカンドポートに2本目のEthernetケーブルを接続すれば回線速度を2倍にできそうなものだが、実際にはLinuxのネットワーキング用サブシステムに双方のアダプタを認識させた上で、2つのポートでトラフィックの送受信をさせる方法をOSレベルで指定しなくてはならない。後者の設定に関しては複数の方法が存在し、実のところ本稿もそのための手法を説明するために書き起こしたものである。

 この場合に取りうるオプションは複数存在するが、それらの選択肢については、ネットワークデバイス間でのトラフィックルーティングや透過的なリンクなど、ネットワークに接続されたデバイス(コンピュータ、ルータ、その他の機器)間でどのような形態の交信を許すかという観点で分類することができる。ただし最もシンプルな状況を確立するには複雑なセットアップが必要というケースも珍しくはないので、最終的にどのオプションを利用するかは、すべての候補を検討し終わってから選択すべきだろう。

ボンディング

 ネットワーク的な観点から最もシンプルなオプションはチャンネルボンディング(channel bonding)ないしポートトランキング(port trunking)と呼ばれる運用法で、これはコンピュータに装備された2つのインタフェースを1つのインタフェースとして振る舞わせる技術であり、実際に他のアプリケーションからはそのように見えるようになるのである。

 2つのインタフェースを論理的に1つにまとめることは、ロードバランス(負荷分散)やフォールトトレランス(耐障害性)の能力を与えてくれる。トラフィックをどちらのインタフェースから送出するかはOSが選択できるし、一方に障害が発生した場合は他方へフェイルオーバさせることもできる。あるいはDSLと光ファイバといった複数のワイドエリアネットワーク(WAN)接続の間でトラフィックを分散させることも可能であり、こうしたロードバランスのペアとしてはダイアルアップも使えるし、あるいは不用心な隣人の使用しているWi-Fiに便乗するといった手口もありかもしれない。

 2つのEthernetインタフェース間でのボンディングを行わせるには、各自のカーネル用にコンパイルされたボンディング用モジュール(最新のディストリビューションであれば通常そのまま使用できるはずである)およびifenslaveパッケージ(標準ユーティリティの1つではあるがディストリビューションによってはRPMないしAPTリポジトリからのインストールが必要)を取得する必要がある。

 一般的に2つのポートを装備したマザーボードの場合、Ethernetアダプタはeth0およびeth1という名称にされているので、ここでの設定例でもそれに従うことにしよう。ifenslaveをインストールしたら次に「sudo ifdown eth0」および「sudo ifdown eth1」を実行して、これら2つのEthernetアダプタをオフラインにしておく。次にmodprobeを用いて、ボンディング用モジュールをLinuxカーネルに読み込ませる。このモジュールについてはmodeおよびmiimonという2つのオプション指定が重要な意味を持っており、modeはボンドの種類を(ラウンドロビンやフェイルオーバなど)、miimonはリンクに対する障害検出の頻度(単位はミリ秒)を規定する。例えば「sudo modprobe bonding mode=0 miimon=100」という指定は、2つのEthernetアダプタ間で交互にネットワークパケットの送信を行うというラウンドロビン(round-robin)モードを設定している。またmiimon値を100とするのは標準的な指定であり、必要であれば各自のネットワークに適した値に調整すればいい。

 実際のボンド作成(ここでは便宜上bond0と呼ぶことにする)を行うには「sudo ifconfig bond0 192.168.1.100 up」を実行してボンドへのIPアドレス割り当てを実行した後、「ifenslave bond0 eth0」および「ifenslave bond0 eth1」を実行して、物理Ethernetインタフェースに接続をさせる。

 ここで用いたラウンドロビンは、2つのアダプタ間で行うロードバランス方式としての汎用的なモードであり、この場合は一方に障害が発生しても他方を使ってリンクを維持し続けることができる。その他にもmodeオプションには6つのモードが用意されており、これらはそれぞれ次のような特徴を備えている。

  • モード1 アクティブバックアップ(active backup):一方のアダプタのみを使用し、そこでの障害発生時には他方に切り替える。
  • モード2 バランスXOR(balance XOR):送出するパケット群をアダプタ間で分割することでトラフィックのロードバランスを試みるが、特定の宛先に関しては可能な限りどちらか一方のアダプタを使用し続けるようにする。
  • モード3 ブロードキャスト(broadcast):トラフィックの送出をすべてのインタフェースで行うようにする。
  • モード4 ダイナミックリンクアグレゲーション(dynamic link aggregation):複雑なアルゴリズムを用いて、速度その他の設定を基に複数のアダプタを1つにまとめる。
  • モード5 アダプティブトランスミットロードバランシング(adaptive transmit load balancing):現在の状況を基にして、送出するトラフィックを臨機応変に分散させる。
  • モード6 アダプティブロードバランシング(adaptive load balancing):これもモード5と同様の処理を行うがARPアップデートを送信することで、受信する側のトラフィックについてのロードバランスも試みる。

 ホームユースの場合、こうした複雑なモードを使用する機会はほとんどないだろう。そうではなく、多量のネットワークトラフィックに対する管理を行いたいという場合は、ボンディング用ドライバについてのドキュメントを参照して頂きたい。なお一般のユーザがボンディングを使用することで得られるものは、ロードバランスやフォールトトレランスといった能力であり、リンク速度に関するメリットはそれほど期待できない。例えば2つのWANリンク間でボンディングを施すと、ロードバランスやフォールトトレランスを行えるようにはなるが、個々の接続(Webページ用のHTTPリクエストなど)はどちらか一方のルートを使うだけなので、アップストリーム側のスループットが2倍になる訳ではないのである。