OpenBlockS 600ネットワーク徹底活用――OpenBlockS 600をネットワーク機器として利用しよう
OpenBlockS 600の魅力の1つに、ギガビットイーサネットを2基搭載している点がある。これをLinuxの多彩なネットワーク機能と組み合わせることで、ネットワーク機器の1つとしてさまざまに応用できる可能性があるのだ。そこで、今回はOpenBlockS 600をネットワークの運用や管理に活用することを考え、さまざまなネットワーク設定の方法を紹介していこう。
第2回では次の図1のようなネットワークを想定し、OpenBlockS 600のWeb管理インターフェイスを利用してOoenBlockS 600をローカルルーターとしてセットアップする例を紹介した。
今回は引き続き図1のネットワーク環境を想定し、一般的に多く利用されるであろうネットワーク設定を行いながら、OpenBlockS 600のネットワーク性能を見ていくことにしよう。
iptablesを使ったフィルタリング
OpenBlockS 600でL3/L4フィルタリングを行うには、通常Linuxで行うのと同様にiptablesを利用する。iptables自体の使い方や設定方法は一般的なLinux環境の場合とまったく同じなので説明は省略するが、ルーター上でフィルタリングを行う場合、起動時にフィルタルールが適用されるようにセットアップするのが一般的だろう。そこで、ここではOpenBlockS 600起動時にiptablesを使ったフィルタを適用する方法を紹介しよう。
OpenBlockS 600は起動時にいくつかのファイルを読み込んで実行していく。そのうち「/etc/rc.iptables」がiptables関連の処理を行うために用意されているファイルだ。このファイルに実際に適用するiptablesのコマンドを記述しておけば良い。
たとえば、OpenBlockS 600のETHER-0に入ってくるパケットのうち、192.168.102.2の80/tcpおよび25/tcpへのパケットを拒否し、そのほかのパケットは通すという場合、以下のように記述する。
iptables -A FORWARD -i eth0 -d 192.168.102.2 -p tcp --dport 80 -j DENY iptables -A FORWARD -i eth0 -d 192.168.102.2 -p tcp --dport 25 -j DENY iptables -A FORWARD -i eth0 -d 192.168.102.2 -j ACCEPT
また、/etc/rc.iptablesの設定を有効にするために以下を「/etc/rc.conf」ファイルに記述しておく。
iptables=YES
パケットフィルタリング利用時のスループット
それでは、実際にOpenBlockS 600でフィルタリングを行った場合のスループットを測ってみよう。今回はフィルタの個数による性能の変動についても確認するため、フィルタ10件、30件、100件という3つの条件で測定を行った。いずれの場合もフィルタのルールセットは下記のような条件で作成している。
- ソースIPアドレスによるDENYルールを7割
- IPアドレスのほかにプロトコルと宛先ポートの指定があるDENYルールを3割
また、フィルタルールについてはそれぞれのケースにおいてルールセット中で重複がないように設定している。測定回数は前回同様FTPとHTTPともに5回ずつとし、それぞれのケースで平均を求めている。結果は次の表1のとおりだ。
フィルタ件数 | スループット | |
---|---|---|
FTP | HTTP | |
フィルタ10件 | 315.52Mbps | 345.36Mbps |
フィルタ30件 | 294.83Mbps | 313.31Mbps |
フィルタ100件 | 267.79Mbps | 292.61Mbps |
NAT(IPマスカレード)の設定とそのスループット
NATについてもフィルタリングの場合と同様、iptablesを利用する。設定についても同様に/etc/rc.iptablesにNATルールを記述することで行える。
さて、NATのスループットであるが、ここでは/etc/rc.iptablesに以下のような基本的なNATルールのみを記述して適用して測定を行った。このテストケースではNAT以外のフィルタルールは適用していない。これまでと同じく、測定は5回ずつ行って平均を出している。結果は次の表2のとおりだ。
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
プロトコル | FTP | HTTP |
---|---|---|
スループット | 99.42Mbps | 120.88Mbps |
PPPoEの設定
ADSLや光回線を使ったブロードバンドサービスを利用する環境で、コンパクトなOpenBlockS 600をいわゆるブロードバンドルーターとして活用するというアイデアは誰しもが思いつくだろう。そこで、ここではOpenBlockS 600をPPPoEルーターとしてセットアップする方法を見てみよう。
残念ながら記事執筆に使用したWebインターフェイス(バージョン20090930-01、2009年9月30日リリース)ではPPPoEに関する設定項目は用意されていないが、OpenBlockS 600に搭載されているSSD/Linux自体にはPPPoEルーターとしての利用を前提とした設定が用意されている。具体的に設定を見てみることにしよう。
PPPoEの設定は、/etc/rc.confに以下のような記述を追加することで行う。
pppoe=YES pppoe_int=eth0 pppoe_user=guest@example.com pppoe_password=guest pppoe_defaultroute=YES pppoe_dns=NO
設定すべきパラメータについて、それぞれ順に詳細を見ていこう。
○pppoe
「pppoe」パラメータはPPPoEの利用の有無を指示するものだ。このパラメータを「YES」にしておくことで、OpenBlockS 600の起動時にPPPoEセッションが自動的に起動する。もちろん、ほかのPPPoE設定パラメータが適切に設定されていることが前提となる。
○pppoe_int
「pppoe_int」パラメータでは、PPPoEを動作させるネットワークインターフェイス(ADSLモデムやONUなどに接続するETHERポート)を指定する。OpenBlockS 600のETHER-0 を使う場合は「eth0」、ETHER-1を使う場合は「eth1」と指定する。
○pppoe_user
「pppoe_user」パラメータでは、PPPoEセッションの認証に利用するユーザー名を入力する。いわゆるブロードバンドサービスの場合、ISPから接続用のユーザー名が指定されているはずなので、ISPの接続設定資料などを確認して適切なユーザー名をセットしておこう。
○pppoe_password
「pppoe_password」パラメータには、認証時に使われるパスワードを記述しておく。pppoe_userと同様、ISPから指示されたものにセットしておく。
○pppoe_defaultroute
「pppoe_defaultroute」はデフォルトルートをPPPoEに向けるかどうかを指定するパラメータだ。いわゆるブロードバンド接続サービスを利用しているような場合、PPPoEルータがインターネットとの接続ルーターになっており、これを経由してインターネットと通信する設定になっていることが多い。したがって、通常は「YES」にしておけば良い。一方、そのルーター以外にデフォルトルートを設定したいような場合は、「NO」を指定する。なお、このパラメータは必須ではなく、指定しなくても動作する。指定されなかった場合は「YES」が指定されたものとみなされる。
○pppoe_dns
「pppoe_dns」パラメータでは、PPPoE接続時にDNSサーバーを指定する「/etc/resolv.conf」ファイルを書き換えるかどうかを指定する。PPPoE接続時、IPCPによる接続確立段階でPPPoEの接続先から通知されるDNSサーバーを使用する場合には「YES」を指定する。この場合、PPPoEの接続先から通知されたDNSサーバーを使用するよう/etc/resolv.confが自動的に書き換えられ、OpenBlockS 600の名前解決にそのDNSサーバが使用されるようになる。一方、利用できるDNSサーバーがほかにある場合など、/etc/resolv.confの内容を書き換えたくない場合は「NO」を指定する。このパラメータも必須ではなく、指定されなかった場合は「YES」が指定されたものとみなされる。
以上のパラメータを/etc/rc.confに追加して再起動を行えば、PPPoEの接続が行われる。ただし、このPPPoE設定に関して気をつけて欲しいポイントがある。上記の設定では/etc/rc.conf内にpppoe_passwordパラメータとしてパスワードを記述するのだが、デフォルトではこのファイルはすべてのユーザーが閲覧できるようになっており、OpenBlockS 600にログインできるユーザーであれば誰もがPPPoEのパスワードを確認できてしまう。そのため、上記PPPoEの設定を行った場合は/etc/rc.confのパーミッションを変更しておこう。
# chmod 600 /etc/rc.conf
また、上記の設定で有効になるのはPPPoEの接続のみである。いわゆるブロードバンドルータとして利用したいような場合は、iptablesを使って、パケットフィルタリングを行ったり、NATの設定を行いたいケースも多い。その場合は、前述のように/etc/rc.iptables内でフィルタ/NATルールを設定しておけば良いのだが、PPPではインターフェイスが動的に生成されるため、インターフェイス名が必ずしも「ppp0」になるとは限らない。デバイスの指定には、任意のPPPインターフェイスに合致するよう「ppp+」というインターフェイス名を指定すると良いだろう。たとえばNATを設定するような場合は、以下のようにする。
iptables -t nat -A POSTROUTING -o ppp+ -j MASQUERADE
PPPoEの設定ファイル
前述のように、PPPoEは/etc/rc.confにいくつかのパラメータを記述するだけで簡単に利用できる。ただし、この設定方法は簡便さが優先されているため、細かい調整が行えない。たとえばPPPoEで利用するIPアドレスを固定したいような場合など、想定している範囲外の設定を行う場合には工夫が必要になる。
前述のPPPoE設定に対応する処理は「/etc/rc.pppoe」ファイル内に記述されているので、実際にどういったことが起きるのかはこのファイルを確認してほしいが、基本的には以下のような処理が行われている。
- 設定を記述する「/etc/ppp/pppoe.conf」ファイルと、パスワードを記述する「/etc/ppp/pap-secrets」ファイルを生成
- 「pppoe-start」コマンドを実行
このうち、/etc/ppp/pppoe.confが実際のPPPoEの設定パラメータを含む設定ファイルとなる。このファイルにはさまざまなパラメータを記述できるので、細かい設定を行う場合には/etc/ppp/pppoe.confおよび/etc/ppp/pap-secretsの2つをあらかじめ用意してpppoe-startコマンドを実行すれば良い。
なお、この場合/etc/rc.conf内でPPPoEの設定/起動を行うように指定している(「pppoe=YES」と記述している)と、設定ファイルが上書きされてしまうので注意してほしい。
pppoe=NO
また、/etc/ppp/pppoe.confと/etc/ppp/pap-secretsを生成する対話式のコマンド「pppoe-setup」も用意されているので、これを使って設定ファイルを生成する方法もある。
さて、/etc/ppp/pppoe.conf内ではさまざまなパラメータを指定できる。これらのパラメータについていくつか紹介しておこう。
ネットワークインターフェイス:
PPPoEを動作させるネットワークインターフェイスの指定は、「ETH」パラメータで行う。ETHER-0を使う時には「eth0」を、ETHER-1の場合には「eth1」を指定する
ETH=eth1
ユーザー名
PPPoEの接続時に使うユーザー名は「USER」パラメータで指定する。たとえばユーザー名が「foo@example.com」の場合、下記のようにする。
USER=foo@example.com
なお、パスワードに関しては/etc/ppp/pap-secrets内に記述する。
DNS設定:
/etc/resolv.confを書き換えるかどうかは「DNSTYPE」パラメータで指定する。PPPoEサーバーから通知されるDNSサーバーを利用するように/etc/resolv.confを書き換える場合には、「SERVER」と指定する。
DNSTYPE=SERVER
一方、手動でDNSサーバーを指定することもできる。その場合にはDNSTYPEに「SPECIFY」をセットし、「DNS1」および「DNS2」パラメータでDNSサーバのIPアドレスを設定する。たとえば「192.168.101.10」および「192.168.101.11」をDNSサーバーとして使用する場合、次のように指定する。
DNSTYPE=SPECIFY DNS1=192.168.101.10 DNS2=192.168.101.11
また、/etc/resolv.confの書き変えを行いたくない場合は「NOCHANGE」を指定しておこう。
DNSTYPE=NOCHANGE
デフォルトルート:
デフォルトルートをPPPoEに向けたい場合は「DEFAULTROUTE」パラメータに「yes」をセットする。向けない場合は「no」をセットしておく。
DEFAULTROUTE=yes
PPPオプション:
「PPPD_EXTRA」パラメータでは、PPPoEで利用するpppdに対して任意のオプションパラメータを渡すことができる。たとえば固定IPアドレスサービスを利用しているような場合、pppdに直接IPアドレスを指定できたりする。
なお、PPPoEで使用されるpppdへのオプション指定は 「/etc/ppp/options」ファイルでも可能だ。PPPoE以外のpppセッションも併用するような場合は「/etc/ppp/options.eth0」ファイルや「/etc/ppp/options.eth1」ファイルで指定したほうが良いだろう。
IPv6 6to4トンネリング
IPv4アドレスの枯渇がいよいよ現実味を帯びる中、そろそろIPv6のことを考えている読者も多いのではないだろうか。OpenBlockS 600はIPv6に対応しており、IPv6での通信も利用できる。
ここではIPv6の利用/設定例として、RFC3056で規定されている、IPv4上でIPv6の通信をトンネリングすることでIPv6環境を利用可能にする6to4ゲートウェイルーター(6to4ノード)としてOpenBlockS 600を設定する方法を紹介しよう。
6to4はその仕組み上NATとの親和性が低く(NATを越えるのが難しい)、また構成上グローバルIPアドレスが必要なため、通常はネットワークの出口ルーター(たとえば一般家庭ではいわゆるブロードバンドルーターに相当)上で動作させることが多い。6to4ノードは6to4リレールーターとの間でIPv6パケットをカプセル化したIPv4パケットで通信を行う。6to4リレールーターはそこからIPv6パケットを取り出し、実際のIPv6ノードに向けてルーティングを行うことになる。
なお、6to4リレールーターは192.88.99.1というエニーキャスト(Anycast)アドレスを持つことになっている。したがって、このアドレスとの間にトンネルを設ければ、6to4ノードは自動的に最寄りの6to4リレールーターを利用するようになる。また、普段利用している6to4リレールーターが止まった場合でも、自動的に別のリレールーターに6to4パケットが流れることになるので、自律的にネットワークが復旧する構造にもなっている。
このような特徴を持つため6to4リレールーターは世界中に散らばって運用されており、国内でもISP/IDCの若手エンジニアを中心にしたボランティアベースの組織Tokyo6to4により6to4リレールーターの運用が開始されている。ボランティアベースで実験的な役割でもあるため、商用ベースのIPv6サービスの展開をみて1、2年で終了が予定されてはいるが、以前KDDIが行ってくれていた6to4リレールーター実験サービス終了以来、長らく国内に6to4リレールーターが不在であったことを考えると、非常にありがたい存在だろう。
OpenBlockS 600を6to4ノードにする設定例
さて、6to4の概要の説明はここまでにして、実際の設定を見てみよう。
6to4では、ノードに対して2002で始まるIPv6アドレスを付加する。この2002に続く32bitは、IPv4グローバルアドレスを用いるようになっている。
たとえばIPv4グローバルアドレスとして192.168.100.200(実際にはこのアドレスはプライベートIPv4アドレスではあるが、ここでは例として用いている)を用い、サイトごと自由に決めて良い「SLA ID」と「インターフェイスID」をそれぞれ「0」と「1」とすると、6to4ノードアドレスは以下のようになる。
2002:c0a8:64c8::1
それでは、このアドレスをもとに6to4トンネルの設定を行ってみよう。設定はパケットルーティング関連ツール「iproute2」に含まれる「ip」コマンドを用いて行える(iproute2はOpenBlockS 600にデフォルトで搭載されているSSD/Linuxに標準で含まれている)。
まず最初に6to4用のトンネルデバイスを作成しよう。mode として「sit」を設定するのがキモである。
# ip tunnel add tun6to4 mode sit remote any local 192.168.100.200
このトンネルデバイスに、先ほど求めたIPv6アドレスを割り当てる。
# ip link set tun6to4 up # ip addr add 2002:c0a8:64c8::1/16 dev tun6to4
ここで、IPv6アドレスのプレフィックスを64ビットではなく16ビットとしていることに注意してほしい。16ビットに設定しておくと、6to4の別のノードへのパケットは6to4パケット、つまり「IPv6パケットをカプセリングしたIPv4パケット」として対象ノードに直接送信されるようになる。この場合6to4リレールーターを介さないため、6to4ノード間での通信レイテンシを小さくすることができる。
最後にルーティングテーブルを設定する。先ほど6to4の概要でも述べたように、6to4リレールーターは192.88.99.1というエニーキャストIPv4アドレスを持っているので、それを明示する(::192.88.99.1は192.88.99.1のIPv4互換アドレスである)。また、IPv6のデフォルトルートをトンネルデバイスの先に向けておく。
# ip route add ::192.88.99.1 dev tun6to4 # ip route add ::/0 via ::192.88.99.1 dev tun6to4
以上で設定は終了である。IPv6で通信が行えるノード(たとえば、www.kame.netなど)に対し、IPv6版pingコマンドである「ping6」でパケットが通るか確認してみると良いだろう(ping6はSSD/Linuxに標準で含まれている)。
また、ここまで設定した内容を「/etc/rc.local」に記述しておけば、起動時に6to4が有効になる。なお、注意が必要なのが、6to4のプレフィックスはIPv4グローバルアドレスを元に求められるということである。OpenBlockS 600に割り当てられるIPv4アドレスが固定である場合は、IPv4アドレスを元にあらかじめ決まったプレフィックスで設定を行っておけば良いが、IPv4アドレスが頻繁に変わってしまうような環境では、動的に設定を修正してくれる何らかの仕組みが必要になる。
OpenBlockS 600を6to4ゲートウェイルーターとして利用する
さて、この6to4ノードとなったOpenBlockS 600を、起動時に6to4ゲートウェイルーターとなるように設定してみよう。IPv6パケットのフォワーディングを行うためには、以下の2箇所を設定する。
- 「/etc/lkm.conf」に「ipv6」を追加する
- 「/etc/rc.conf」に「ip6mode=router」を追加する
前者は、起動時に「ipv6」カーネルモジュールを読み込むものだ。あらかじめipv6モジュールを読み込んでおかないとrc.conf内においてIPv6関連機能の設定が行われず、「ip6mode=router」が有効にならない。これは再起動を行うと設定が反映される。
さて、これでOpenBlockS 600が6to4ゲートウェイルーターになってくれたはずである。テストを行ってみよう。
IPv6では各種設定の自動化を行うための仕組みが用意されており、今回のような場合、OpenBlockS 600上でRouter Advertisement Daemon(Linux向けの実装としてはradvdがある)を動作させ、クライアント側でRouter Advertisementを受けるよう設定することで、自動的に適切なアドレス/ルーティングテーブルがセットされるようになるのだが、残念ながら現時点ではOpenBlockS 600向けのパッケージは用意されていない。今回はLinuxがインストールされているクライアントPCの設定を手動で行ってテストを行ってみよう。ここではOpenBlockS 600のETHER-1(eth1)と、テスト用のPCのイーサネットポートが接続されているものとする。
まず、OpenBlockS 600のeth1にIPv6アドレスを割り当てておく。
# ip addr add 2002:7c29:4693:1::1/64 dev eth1
クライアント側PC側にもIPv6アドレスを割り当てて、IPv6のデフォルトゲートウェイをOpenBlockS 600に割り当てたIPv6アドレスに設定しておく。
# ip addr add 2002:7c29:4693:1::2/64 dev eth0 # ip route add ::/0 via 2002:7c29:4693:1::1 dev eth0
以上で設定は終了である。クライアントPCからIPv6パケットを投げてみて、通信できることを確認しよう。
6to4は基本的に6to4リレールーターへパケットが流れるトンネリング方式なため、IPv6のNativeな通信と比較すると遅延が大きくなることや、RFC3964においてセキュリティ上の懸念点も指摘されており、本格的な運用には向かない。しかしIPv4からIPv6への移行の過渡期においては、手軽に扱えることから有効な手段となるだろうと思う。
まとめ
今回は、OpenBlockS 600で利用できるネットワーク関連機能について、一般的に必要と思われる設定を紹介してきた。もちろん、これら以外にも活用方法は考えられる。たとえば次のようなものが挙げられるだろう。
- ブリッジ(L2ブリッジングやetablesを利用したL2フィルタ)
- IPSec、PPTPやPacketiXなどを使ったVPN(ただし、IPSecやPPTP関連のツールが現時点ではアプリケーションマネージャに用意されていないため、自力でのツール類の準備が必要。一方PacketiXはアプリケーションマネージャにて有償で提供されている)
- tcを使ったトラフィックコントロール(いわゆるQoS、帯域制御や遅延制御、ロードバランスなど)
これらさまざまな機能に関しても、通常Linuxを利用する感覚でコマンドラインから設定することで利用可能だ。