わが家ではフレッツ光 + IIJmioでインターネットに接続しています。

夕方から夜間にかけての速度低下を避けるため、IPoE (IPv6) + DS-Lite (IPv4 over IPv6)という接続環境で通信しています。IPoE + DS-Liteの場合、PPPoEにおける網終端装置(本装置の混雑が速度低下の原因)を経由しないため、いまのところ速度低下が起きないか、起きても影響が小さいと考えられます。

IPoE + DS-Liteについて詳しくは、以下の二つの記事をご参照ください。(てくろぐのほうが詳しいです。)

メリットの大きいIPoE + DS-Lite接続ですが、ひとつ大きな問題があります。

サービスの公開、つまりWebサーバなどを自宅LANに設置してインターネットからアクセスすること、ができないのです。大多数のネットユーザには問題にならないと思いますが、外出先から自宅サーバにアクセスしたい、わたしのような者にとっては困ったことです。

さいわい、利用しているIIJmio FiberAccess/NFでは、IPoE + DS-LiteによるIPv4接続とPPPoEによるIPv4接続を同時に使用することができます。

したがって、宅内LANにおいて、外部からアクセスしたいマシンだけは、そのデフォルトルートをPPPoE接続のほうに向けておくことで、LAN内の他のマシンでは速度低下のない通信を楽しみつつ、公開マシンに対するインターネットからのアクセスを実現できます。(下図) (ちなみに、IPv6の場合は宅内LANの全マシンにグローバルアドレスが割り当てられますので、こういった問題は生じません。)

Network - IPoE+DS-LiteとPPPoEの同時使用

めでたしめでたし、といいたいところですが、公開マシンはデフォルトルートがPPPoE接続を向いていますので、本マシンの通信すべてが夜間の速度低下の影響を受けてしまいます。妥協できる範囲内ではあるのですが、せっかくなので「公開マシン」ではなく「公開サービス」のみデフォルトルートをPPPoEに向け、速度低下の影響をさらに低減することを試みます。

サービスごとにデフォルトルートを使い分けるために、FreeBSD 7.1-RELEASEから導入された「複数ルーティング(経路)テーブル機能」を使用します。

通常、経路テーブルはマシンインスタンス単位でひとつだけです。しかし、上記機能を使うことにより、単一マシン内に経路テーブルを複数用意し、プロセスごとに使用するテーブルを選択できます。上図と比較すると次のようなイメージになります。

FreeBSD - 複数ルーティングテーブル

今回の場合は、「デフォルトルートがIPoE + DS-Lite接続を指す経路テーブル0 (FIB 0)」、および「デフォルトルートがPPPoE接続を指す経路テーブル1 (FIB 1)」の二つを用意します。そして、外部に公開するサービス(サーバプロセス)のみ経路テーブル1を使うようにし、その他すべては経路テーブル0を使うようにします。

では、さっそくやりかたを見ていきましょう。

カーネルの再構築

複数の経路テーブルを使用するにはカーネルの再構築が必要です。以下のオプションを追加して、カーネルの再構築を行なってください。(以下の例では二つの経路テーブルが使用可能になります。)

options ROUTETABLES=2

本記事ではカーネルの再構築は扱いませんので、詳細については、たとえばFreeBSD Handbookの第8章を参考にしてください。

カーネルの再構築、インストールが終わったら、FreeBSDマシンを再起動します。

: 以下の記事によると、カーネルパラメータnet.fibsの値を変更することにより、ルーティングテーブルの数を(カーネルの再構築なしで)変更できるようです。参考にしてみてください。(こちらのほうが手軽ですね。)

経路情報の設定

さて、これで複数の経路テーブルを使えるようになりました。FreeBSDでは経路テーブルのことをFIB (Forwarding Information Baseの略?)と呼んでいますので、本記事でも以下FIB 0, FIB 1のように呼びます。特段の設定を行なわなければ、FIB 0がデフォルトの経路テーブルとなります。

FIB 0のデフォルトルートについては、システム起動時に適切に設定されていることを仮定します。たとえば、手動でIPアドレスの設定を行なっている場合は、アドレスなどの指定に加えて以下のような一行が/etc/rc.confに存在するだろうと思います。

defaultrouter="192.168.0.254"                   # FIB 0のデフォルトルートはIPoE+DS-Lite向き

二つめの経路テーブル(FIB 1)にはデフォルトルートが設定されていません。そこで、以下のコマンドを用いて、PPPoE接続に向けたデフォルトルートを設定します。

setfib 1 route add -net default 192.168.0.1     # FIB 1のデフォルトルートをPPPoEに向ける

上記のように、setfib <FIB番号> コマンドという形式で、指定したFIBを使うようにして任意のコマンドを実行できます。

動作確認

FIB 0および1に異なるデフォルトルートを設定しました。実際に異なる経路が使われるかを確認してみましょう。ためしに、www.iijmio.jpに対してtracerouteコマンドを実行してみます。(プライバシー保護のため、コマンド出力の一部を伏せ字にしています。)

上記のように、結果が異なることが確認できました。

公開サービスの起動

ここまでくればあとは簡単です。前記したように、使用するFIB番号を指定してサーバプログラムを起動します。

setfib 1 service apache24 onestart
setfib 1 service sshd onestart

などのようにすればOK。

注: /etc/rc.confで対象のサービスを起動している場合はコメントアウトしておきましょう。今後は、以下のように/etc/rc.local経由で起動します。

自動化

ここまでに行なった、

の手順がマシン起動時に自動的に実行されるよう、/etc/rc.localを作成します。

これで、公開したいサービスのみがPPPoE接続をデフォルトルートとして使い、その他のすべてのプログラムはIPoE + DS-Lite接続を使って通信するように設定できました。

参考文献

  1. DS-LiteでIPv4してみませんか?, http://techlog.iij.ad.jp/archives/1254
  2. FreeBSDの複数経路について, https://wiki.across.gr.jp/tech/freebsd/routetables
  3. Chapter 8. Configuring the FreeBSD Kernel, https://www.freebsd.org/doc/handbook/kernelconfig.html
  4. FreeBSDでIPoE/DS-LiteとPPPoEを同時に使う, https://medium.com/@yusukeito/freebsd%E3%81%A7ipoe-ds-lite%E3%81%A8pppoe%E3%82%92%E5%90%8C%E6%99%82%E3%81%AB%E4%BD%BF%E3%81%86-5fdd635581ce