全文検索エンジンgroongaを囲む夕べ #1 : ATNDの定員が50人から120人に増えましたね。たぶん、何人かはキャンセルするはずなので、今のうちに登録しておくとおそらく参加できるでしょう。興味のある方はお早めに登録してください。
さて、以前、サーバ上でPDFやオフィス文書からテキストを抜き出す方法を紹介しました。これらを使うことにより様々なフォーマットの文書からテキストを抽出し、groongaなどの全文検索エンジンを利用して高速に目的の文書を見つけることができます。例えば、ファイルサーバやデスクトップ上にある文書を検索する用途にも有用です。
しかし、文書のフォーマット毎に抽出方法を変えなければいけないため、実際にテキストを抽出する部分(インデクサーの機能の一部)を作る場合に不便です。文書のフォーマットに依らず、同じ方法でテキストを抽出できると便利ですよね。
ということで、文書のフォーマットの違いを意識することなくテキストとメタデータ(タイトル・作成者・作成時刻など)を抽出するツールChupaTextを開発し、テスト公開しました。ライセンスはLGPLv2+なので自由に利用可能です。
入力文書のフォーマットの違いを意識せずに利用するためには、テキスト抽出後の結果が入力文書のフォーマットに依存せず、統一されていなければいけません。ChupaTextでは文書を入力すると、入力文書のフォーマットに依存せず、以下のようにMIME形式で出力します。
% chupatext /tmp/sample_multi_pages.pdf URI: file:///tmp/sample_multi_pages.pdf Content-Type: text/plain; charset=UTF-8 Content-Length: 26 Original-Content-Length: 6145 Creation-Time: 2010-09-27T04:09:17Z Original-Filename: sample_multi_pages.pdf Original-Content-Type: application/pdf Original-Content-Disposition: inline; filename=sample_multi_pages.pdf; size=6145; creation-date=Mon, 27 Sep 2010 04:09:17 +0000 page1 2 ページ目 page3
出力フォーマットとしてMIMEを選択したのは以下の理由からです。
1番大きな理由が1番目の理由です。独自に新しいフォーマットを定義するよりも、すでに広く利用されているフォーマットを採用する方が利用しやすくなります。JSONが外部出力のフォーマットとして多く採用されているのも、同様の理由でしょう。
ChupaTextはそれぞれのフォーマットからテキストやメタデータを抽出する部分をモジュール化し、新しいフォーマットに対応しやすい構造になっています*1。
これからも対応フォーマットを増やす予定ですが、それに適した構造になっているというわけです。
ChupaTextは様々なフォーマットに対応するために、多くのライブラリを必要とします。そのため、ビルドするのは少し面倒です。以下のライブラリがインストールされている必要があります。
簡単にインストールできるようにするため、Debian GNU/LinuxとUbuntu用のパッケージを用意しました。
Fedora用のパッケージは後で用意するかもしれません。
全文検索システムを開発する場合に有用なテキスト抽出ツールChupaTextを紹介しました。興味のある方は試してみてください。
リポジトリはGitHubにあります。
*1 もう少し詳しく書くと、ChupaTextはC言語で実装されていて、抽出部分がそれぞれ共有ライブラリになっています。そのため、特定のディレクトリにファイルを配置することによりChupaTextをビルドし直さなくても新しく対応フォーマットを追加することができます。また、抽出部分をRubyで書くこともできるため、より簡単に対応フォーマットを追加することができます。
NICT(独立行政法人情報通信機構)には情報通信ベンチャー支援センターという組織があり、「情報通信分野のベンチャー企業及び情報通信分野で創業を目指す方を対象に、創業や起業後の経営を支援するため、インターネット上での情報提供、会員制の情報通信ベンチャー交流ネットワークの運営、イベントやセミナーの開催を行っています」。
以前、センターが開催している交流ネットワークに参加した縁があり、注目の交流ネットワーク会員紹介ということでインタビューを受けました。オープンソースソフトウェアを活用している企業という切り口です。
インタビューの内容は連載・コラム|注目の交流ネットワーク会員紹介|株式会社クリアコード 代表取締役社長 須藤 功平 氏 〜情報通信ベンチャー交流ネットワーク会員企業〜@ICTベンチャーの創業・起業支援なら情報通信ベンチャー支援センターにあります。「注目の交流ネットワーク会員紹介」シリーズの1番目のようです。
これまでは、あまりクリアコードの業務内容や経営のことなどを紹介する機会がなかったので、とてもよい機会でした。声をかけてもらえて感謝しています。
自社にいるだけでは得られない情報やつながりが得られるかもしれないので、興味のある方は情報通信ベンチャー支援センターを活用してみてはいかがでしょうか。
以下のような構成のLANを手早く作りたい、という場面が時々あります。
既存のLAN(192.168.1.0/24) ↑ ルータ1→新しく作るLAN 1(192.168.200.0/24) ↓ ルータ2→新しく作るLAN 2(192.168.201.0/24)
クリアコードはOSSの導入サポートも行っていますので、クリーンな検証用環境としてこのような構成のネットワークを新たに用意して作業をする、という事がよくあります。今回は、新たなネットワーク機器を購入せずに普通のPCを組み合わせてこのようなネットワークを構築する方法を紹介したいと思います。
現時点では既存のLANのみがあり、そこに新たに2つのLANを別々に構築して冒頭のような構成にしたい、という状況にあるとします。
実運用するネットワークであれば専用にルータ機器を導入するところですが、単に実験・検証用の環境にするだけなら、既存の機材でやりくりして同様の環境をエミュレートできれば十分な場合がほとんどです。
そこで今回は、Ubuntu 10.10がインストールされていて既存のLANに接続されているPC 1台を適切に設定して、新しいLAN2つと既存のLANの間で動作するルータ兼サーバとして動作させることによって、冒頭のような構成のネットワークを構築しようと思います。
今回の作業は4つのステップに分ける事ができます。
冒頭の構成に基づいて、最終的に以下のようなネットワークにしたいと思います。
192.168.1.0/24 ↑ wlan0 ↑ [Ubuntu PC]→eth0→192.168.200.0/24→[せんとくん1号] └→eth1→192.168.201.0/24→[せんとくん2号]
先の図では特に説明もせず「192.168.1.0/24」という風な表記を使いましたが、この表記が何を意味しているか分かりますか?(分かる場合はこの節を読み飛ばして構いません。)
「192.168.1.0/24」は、そこに接続しているコンピュータのIPアドレスの範囲が 192.168.1.1〜192.168.1.254 であるコンピュータ同士のネットワーク(LAN)を指しています。
IPv4の世界では、ネットワークに接続する全てのコンピュータに一意なアドレスが与えられ、そのアドレスで個々のコンピュータを識別します。これが「IPアドレス」です。IPv4ではIPアドレスは「0〜255の数字がドット区切りで4つ並んだ数列」で表現されていて、例えば「127.0.0.1」や「192.168.1.1」や「66.249.89.104」といったものもIPアドレスです。
このIPアドレスを2進数で表すと、例えば
というアドレスはそれぞれ
になります。
この時、上の2つのアドレスは先頭から24桁目までが一致していますよね。このような場合に「24桁目までが一致しているアドレスの範囲を1つのLANとして扱う」という意味の表記が、前出の「/24」です。
ですから、「192.168.1.0/24」のLANならIPアドレスの範囲は192.168.1.0〜192.168.1.255の256個ですし、「172.16.100.0/24」のLANならIPアドレスの範囲は172.16.100.0〜172.16.100.255の256個ということになります。また、24桁ではなく16桁までが一致している範囲を1つのLANとして扱うのなら、「192.168.0.0/16」という表記で192.168.0.0〜192.168.255.255までの65536個のIPアドレスの範囲が1つのLANになります。
さて、「頭から24桁目までが一緒であればそれを1つのLANとする」というルールを、数字でどうやって表せばよいでしょうか。そのまま「/24」と書く事もできますが、別の表現方法もあります。例えば「2進数で値が1になっている部分が一緒であればそれを1つのLANとする」という取り決めにすれば、2進数で「11111111.11111111.11111111.00000000」と書くことになります。これを10進数に直すと「255.255.255.0」になり、このように、ネットワークの範囲を決定する情報をIPアドレスと同じ形式で表記した物を、サブネットマスクと呼びます。
以上の事から、世間でたまに見かける
という風な表記は全て、実際には同じ事を言い表していると分かります。
なお、「192.168.1.0/24」というLANなら192.168.1.0から192.168.1.255までの256個のアドレスが存在することになりますが、その範囲の最初のアドレスである「192.168.1.0」はそのネットワーク自体を表すアドレスとして使われて、最後のアドレスである「192.168.1.255」は「そのアドレス宛に送られたメッセージは、ネットワークに属している全てのコンピュータが受け取る」という「ブロードキャストアドレス」として使われます。なので、実際にそのLANでコンピュータに割り振れるアドレス(LANに所属できるコンピュータの最大数)は、192.168.1.1から192.168.1.254までの254個ということになります。
IPアドレスはネットワーク上にあるコンピュータを識別するためのアドレスで、普通にLANに接続する場合ならコンピュータ1台につきIPアドレスは1つというのが一般的ですが、場合によっては1台のコンピュータが複数のIPアドレスを持つ場合もあります。ルータはその代表例です。
2つのLANにまたがって存在するルータ(あるいはルータの代わりをするPC)は、それぞれのLAN用のIPアドレスを持つ事になります。無線LANのインターフェース(wlan0)で192.168.1.0/24の方に繋がっていて、有線LANのインターフェース(eth0)で新しいLAN(192.168.200.0/24)の方に繋がっているのであれば、
といった要領です。
以上を踏まえると、先程構築したいネットワークの構成として挙げた
既存のLAN(192.168.1.0/24) ↑ ルータ1→新しく作るLAN 1(192.168.200.0/24) ↓ ルータ2→新しく作るLAN 2(192.168.201.0/24)
は、
既存のLAN(192.168.1.0/24) (192.168.1.0のネットワークで、192.168.1.1〜192.168.1.254の 254台のコンピュータが存在しうる) ↑ ルータ1→新しく作るLAN 1(192.168.200.0のネットワークで、 │ 192.168.200.1〜192.168.200.254の254台の │ コンピュータが存在しうる) ↓ ルータ2→新しく作るLAN 2(192.168.201.0のネットワークで、 192.168.201.1〜192.168.201.254の254台の コンピュータが存在しうる)
という意味だということが分かります。
今回はUbuntu PC1台でルータ1とルータ2を兼用するので、それぞれのLANに接続するインターフェースを考慮に入れると
192.168.1.0/24 ↑ wlan0(IPアドレス:192.168.1.100) ↑ [Ubuntu PC]→ルータ1用に使うeth0(IPアドレス:192.168.200.254) │ └→192.168.200.0/24 │ └→ルータ2用に使うeth1(IPアドレス:192.168.201.254) └→192.168.201.0/24
という構成になります。
それでは実際の作業としてまず、Ubuntu PCとせんとくん1号2号の間でLANを組む所から入りましょう。
普通に構築済みのLANでクライアントとしてUbuntuを使用する場合、IPアドレスはそのLANのDHCPサーバによって割り当てられた適当な物が使われます。しかし、今回構築するLANではこのUbuntu PC自身をサーバ兼ルータとして使用することになりますので、IPアドレスは新LAN用の物を固定で割り当てておかないといけません。
固定IPの割り当てはUbuntuのネットワークマネージャでも可能ですが、後の項でネットワークマネージャではできない設定を施す必要がありますので、今回はより低レベルな設定用のインターフェースとして、ネットワーク接続の設定ファイル /etc/network/interfaces を直接編集することにします。
これから施す設定は、
というものです。
/etc/network/interfaces は、使用したUbuntu PCの元の状態では以下のようになっていました。
1 2 3 4 |
auto lo iface lo inet loopback auto wlan0 |
ここに、以下のように追記します。(行頭に「+」がある行が、追加された部分です。「+」そのものは実際のファイルには書かないで下さい。)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
auto lo iface lo inet loopback auto wlan0 + auto eth0 + iface eth0 inet static + address 192.168.200.254 + netmask 255.255.255.0 + broadcast 192.168.200.255 + + auto eth1 + iface eth1 inet static + address 192.168.201.254 + netmask 255.255.255.0 + broadcast 192.168.201.255 |
編集結果を保存したら、この設定を有効にするために、一旦ネットワークマネージャを再起動しましょう。ここでネットワークマネージャを再起動しておかないと、Ubuntuのネットワークマネージャがeth0とeth1を勝手に違う設定で使おうとするために、設定が意図通りに反映されないという事が起こるので、注意して下さい。
$ sudo /etc/init.d/network-manager restart
/etc/ini.d/network-manager の位置に起動スクリプトが見つからない場合は、Ubuntu PCを再起動してもよいです。
(2014年7月16日追記。Ubuntu 14.04LTS以降の場合は、serviceコマンドを使って以下のようにします:
$ sudo service network-manager restart
)
固定IPをきちんと割り当てられているかどうかは、Gnome端末でifconfigを実行して確かめられます。
$ ifconfig eth0 Link encap:イーサネット ハードウェアアドレス xx:xx:xx:xx:xx:xx inetアドレス:192.168.200.254 ブロードキャスト:192.168.200.255 マスク:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 メトリック:1 RXパケット:0 エラー:0 損失:0 オーバラン:0 フレーム:0 TXパケット:3 エラー:0 損失:0 オーバラン:0 キャリア:0 衝突(Collisions):0 TXキュー長:1000 RXバイト:0 (0.0 B) TXバイト:703 (703.0 B) 割り込み:16 eth1 Link encap:イーサネット ハードウェアアドレス xx:xx:xx:xx:xx:xx inetアドレス:192.168.201.254 ブロードキャスト:192.168.201.255 マスク:255.255.255.0 UP BROADCAST MULTICAST MTU:1500 メトリック:1 RXパケット:0 エラー:0 損失:0 オーバラン:0 フレーム:0 TXパケット:1 エラー:0 損失:0 オーバラン:0 キャリア:0 衝突(Collisions):0 TXキュー長:1000 RXバイト:0 (0.0 B) TXバイト:54 (54.0 B) lo Link encap:ローカルループバック ...
この例のように、「inetアドレス」「ブロードキャスト」「マスク」の箇所に自分で設定したIPアドレスが表示されていれば、固定IPの割り当ては成功です。
こちらはGUIでやることにします。CentOSでGnomeをデスクトップ環境として利用している前提で、Gnomeの場合の手順を示します。
せんとくん2号の場合は、自身のIPアドレスを192.168.201.100に、デフォルトゲートウェイは192.168.201.254にする点が異なります。
固定IPをきちんと割り当てられているかどうかは、Ubuntu PCの場合と同様に、Gnome端末でifconfigを実行して確かめられます。ただしCentOSの場合、初期状態ではsbinにパスが通っていないので 、/sbin/ifconfig とフルパスで書く必要があります。
ここまでできたら、Ubuntu PCのeth0とせんとくん1号のeth0をクロスケーブルで繋ぎます。(ストレートケーブルしか無ければ、間にスイッチングハブを挟むと同じ結果になります。)せんとくん2号のeth0はUbuntu PCのeth1に繋ぎます。
これで、Ubuntu PCとせんとくん1号の間で192.168.200.0/24のLANが、Ubuntu PCとせんとくん2号の間で192.168.201.0/255のLANが構築されました。
この時点では、ネットワークの構成は以下のようになっています。
192.168.1.0/24 ↑ wlan0(192.168.1.100) ↑ [Ubuntu PC]→eth0(192.168.200.254) │ └→192.168.200.0/24→(192.168.200.100)eth0[せんとくん1号] │ └→eth1(192.168.201.254) └→192.168.201.0/24→(192.168.201.100)eth0[せんとくん2号]
LANを構築できたかどうかは、以下のようにすれば確認できます。
Ubuntu PCからせんとくん1号宛にpingを打ってみる。
$ ping 192.168.200.100
レスポンスが返ってくれば成功。
Ubuntu PCからせんとくん2号宛にpingを打ってみる。
$ ping 192.168.201.100
レスポンスが返ってくれば成功。
せんとくん1号からUbuntu PC宛にpingを打ってみる。
$ ping 192.168.200.254
レスポンスが返ってくれば成功。
せんとくん2号からUbuntu PC宛にpingを打ってみる。
$ ping 192.168.201.254
レスポンスが返ってくれば成功。
現状では、新しく作ったLANにコンピュータを追加する時に、手動でIPアドレスやDNS等を設定する必要があります。これを自動化するために、Ubuntu PCをDHCPサーバとして動作させましょう。
まずUbuntu PCにDHCPサーバをインストールします。
$ sudo aptitude install dhcp3-server
次に、DHCPサーバの設定を作成します。/etc/dhcp3/dhcpd.conf というファイルの末尾に、以下のような設定を書き加えます。 (2014年7月16日追記。Ubuntu 14.04LTS以降の場合は、 /etc/dhcp/dhcpd.conf を編集します。)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
# 192.168.200.0/24のLAN用の設定 subnet 192.168.200.0 netmask 255.255.255.0 { # IPアドレスの割り当て範囲は192.168.200.2〜192.168.200.20 range dynamic-bootp 192.168.200.2 192.168.200.20; # デフォルトゲートウェイ(今回はUbuntu PC自身) option routers 192.168.200.254; # サブネットマスク option subnet-mask 255.255.255.0; # ブロードキャスト用のアドレス option broadcast-address 192.168.200.255; default-lease-time 6000; max-lease-time 72000; } # 192.168.201.0/24のLAN用の設定 subnet 192.168.201.0 netmask 255.255.255.0 { # IPアドレスの割り当て範囲は192.168.201.2〜192.168.201.20 range dynamic-bootp 192.168.201.2 192.168.201.20; # デフォルトゲートウェイ(今回はUbuntu PC自身) option routers 192.168.201.254; # サブネットマスク option subnet-mask 255.255.255.0; # ブロードキャスト用のアドレス option broadcast-address 192.168.201.255; default-lease-time 6000; max-lease-time 72000; } |
変更を保存したら、DHCPサーバを再起動して設定を反映させます。
$ sudo /etc/init.d/dhcp3-server restart
(2012年4月25日追記。Ubuntu 11.10以降の場合は、DHCPサーバの起動スクリプトのパスが変わったため、DHCPサーバの再起動の際は以下のコマンドを使用します:
$ sudo /etc/init.d/isc−dhcp-server restart
)
また、DHCPサーバはプロセスが起動した後で有効化されたLANインターフェースを認識しませんので、/etc/network/interfaces にDHCPサーバの自動再起動のためのコマンドも追記しておくとよいでしょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
auto eth0 iface eth0 inet static address 192.168.200.254 netmask 255.255.255.0 broadcast 192.168.200.255 + pre-up /etc/init.d/dhcp3-server stop + post-up /etc/init.d/dhcp3-server start auto eth1 iface eth1 inet static address 192.168.201.254 netmask 255.255.255.0 broadcast 192.168.201.255 + pre-up /etc/init.d/dhcp3-server stop + post-up /etc/init.d/dhcp3-server start |
ここでは、そのインターフェースを有効化する前に実行するコマンドをpre-upで、そのインターフェースを有効化した後に実行するコマンドをpost-upで指定しています。
(2012年4月25日追記。こちらも、Ubuntu 11.10の場合はDHCPサーバの起動スクリプトのパスを以下のように書き換える必要があります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
auto eth0 iface eth0 inet static address 192.168.200.254 netmask 255.255.255.0 broadcast 192.168.200.255 + pre-up /etc/init.d/isc−dhcp-server stop + post-up /etc/init.d/isc−dhcp-server start auto eth1 iface eth1 inet static address 192.168.201.254 netmask 255.255.255.0 broadcast 192.168.201.255 + pre-up /etc/init.d/isc−dhcp-server stop + post-up /etc/init.d/isc−dhcp-server start |
)
これで、Ubuntu PCがDHCPサーバになりました。
DHCPサーバ自身となっているUbuntu PCは固定IPのままにしておく必要がありますが、それ以外の新しいLANに参加するクライアントは、DHCPサーバによる動的なIPアドレスの割り当てを利用できます。せんとくん1号2号の設定を元に戻して、固定IPの割り当てを解除しておきましょう。
せんとくん2号も同じ手順で設定できます。
インターフェースを再起動した段階で、ネットワークの構成はこのようになっているはずです(せんとくん1号2号のIPアドレスが、固定で割り当てた物ではなく、DHCPで割り当てられた物になります)。
192.168.1.0/24 ↑ wlan0(192.168.1.100) ↑ [Ubuntu PC]→eth0(192.168.200.254) │ └→192.168.200.0/24→(192.168.200.2)eth0[せんとくん1号] │ └→eth1(192.168.201.254) └→192.168.201.0/24→(192.168.201.2)eth0[せんとくん2号]
DHCPによるIPアドレスの自動割り当てが正常に機能しているかどうかは、せんとくん1号2号のGnome端末でifconfigを実行して確かめられます。DHCPの割り当て範囲に設定している範囲のアドレスのうち最初のアドレス(せんとくん1号は192.168.200.2、2号は192.168.201.2)がせんとくん1号2号のeth0に割り当てられていれば、DHCPサーバが正常に動作していると分かります。
現状では、せんとくん1号2号から既存LAN上にあるコンピュータにはpingが通りませんし、せんとくん1号と2号の間でもpingが通りません。これは、3つのLANが物理的には繋がっていても、その接点になっているUbuntu PCが通信を遮断しているためです。Ubuntu PCがルータとして機能していれば、この状態は解消されます。
Ubuntu PCをルータとして働かせるというのは、
といった働きをさせるということです。これによって、異なるLANにあるコンピュータ同士がお互いに通信できるようになります。
ただ、Ubuntu PCが新しいLANから受け取ったパケットをそのまま既存LANのルータに渡すようになっても、新しいLANのコンピュータはインターネットには接続できません。これは、既存LANのルータが新しく作られた192.168.200.0/24や192.168.201.0/24のLANの存在を知らないせいです。そのため、インターネットから返ってきたレスポンスのパケットに「192.168.200.10宛」と書かれていても、既存LANのルータは「192.168.200.0/24のLANなんて知らないよ」とパケットの配送を拒否してしまいます。
この問題を解消するには、
という2つの解決策が考えられます。今回は既存のルータの設定はいじらないで済ませたいので、後者の方法を使うことにします。
NAT(IPマスカレード)を設定すると、
という動作が行われるようになります。(大抵の場合、NTT等からレンタルされているルータも、インターネットとLANの間でこれと同じ事をしています。)
Ubuntu PCをルータとして動作させる設定は、先程も編集した /etc/network/interfaces に記述します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
auto eth0 iface eth0 inet static address 192.168.200.254 netmask 255.255.255.0 broadcast 192.168.200.255 + pre-up /sbin/sysctl net.ipv4.conf.all.forwarding=1 + pre-up /sbin/iptables -t nat -A POSTROUTING -s 192.168.200.0/24 -j MASQUERADE pre-up /etc/init.d/dhcp3-server stop # Ubuntu 10.10の場合。Ubuntu 11.10以降では # pre-up /etc/init.d/isc-dhcp-server stop # とする。 post-up /etc/init.d/dhcp3-server start # Ubuntu 10.10の場合。Ubuntu 11.10以降では # post-up /etc/init.d/isc-dhcp-server start # とする。 + post-down /sbin/iptables -t nat -D POSTROUTING -s 192.168.200.0/24 -j MASQUERADE + post-down /sbin/sysctl net.ipv4.conf.all.forwarding=0 auto eth1 iface eth1 inet static address 192.168.201.254 netmask 255.255.255.0 broadcast 192.168.201.255 + pre-up /sbin/sysctl net.ipv4.conf.all.forwarding=1 + pre-up /sbin/iptables -t nat -A POSTROUTING -s 192.168.201.0/24 -j MASQUERADE pre-up /etc/init.d/dhcp3-server stop # Ubuntu 10.10の場合。Ubuntu 11.10以降では # pre-up /etc/init.d/isc-dhcp-server stop # とする。 post-up /etc/init.d/dhcp3-server start # Ubuntu 10.10の場合。Ubuntu 11.10以降では # post-up /etc/init.d/isc-dhcp-server start # とする。 + post-down /sbin/iptables -t nat -D POSTROUTING -s 192.168.201.0/24 -j MASQUERADE + post-down /sbin/sysctl net.ipv4.conf.all.forwarding=0 |
ここではpre-upに加えて、そのインターフェースを停止した後に実行するコマンドをpost-downで指定しています。追加した行では以下のようなコマンドを実行しています。
変更を保存したら、以下のコマンドを実行してeth0とeth1のインターフェースを停止→再起動します。
$ sudo ifdown eth0 $ sudo ifdown eth1 $ sudo ifup eth0 $ sudo ifup eth1
これで、Ubuntu PCが192.168.200.0/24と192.168.201.0/24に対するルータになりました。
Ubuntu PCが期待通りのルータになっているかどうかは、以下のようにして確認できます。
せんとくん1号からせんとくん2号宛にpingを打ってみる。
$ ping 192.168.201.20
レスポンスが返ってくれば成功。
せんとくん2号からせんとくん1号宛にpingを打ってみる。
$ ping 192.168.200.10
レスポンスが返ってくれば成功。
せんとくん1号から既存LAN上のコンピュータ宛にpingを打ってみる。
$ ping 192.168.1.1
レスポンスが返ってくれば成功。
せんとくん2号から既存LAN上のコンピュータ宛にpingを打ってみる。
$ ping 192.168.1.1
レスポンスが返ってくれば成功。
せんとくん1号からインターネット上のコンピュータ宛にpingを打ってみる。
$ ping 8.8.8.8
レスポンスが返ってくれば成功。(※8.8.8.8はGoogle DNSのアドレス)
せんとくん2号からインターネット上のコンピュータ宛にpingを打ってみる。
$ ping 8.8.8.8
レスポンスが返ってくれば成功。
ここまでの設定で、せんとくん1号2号はインターネットにも繋がるようになっています。ただし、「www.clear-code.com」のようなホスト名ではサーバにアクセスできず、ホストのIPアドレスを直接指定する必要があります。実際に、例えばせんとくん1号で ping www.google.com とやっても ping: unknowon host www.google.comと言われてしまいます。これは、せんとくん1号が「www.google.comというホスト名に対応するIPアドレスが分からない」と音を上げているためです。
この状態を解消するには、
という3つの解決策が考えられます。
せんとくん1号にDNSとして既存のDNSを直接参照させるには、Gnomeメニューの「システム」→「管理」→「ネットワーク」の「DNS」タブで「1番目のDNS」に「192.168.1.1」などの既存DNSのIPアドレスを指定します。これで、ping www.google.com が通るようになります。
ただ、192.168.200.0/24や192.168.201.0/24にコンピュータを接続する度にDNSの設定を編集するのは面倒です。そこで、DHCPサーバの機能の1つであるDNSのアドレスを通知する機能を使うというのが、2番目の案です。
DHCPでDNSのアドレスを通知する場合は、Ubuntu PC(DHCPサーバ)の /etc/dhcp3/dhcpd.conf に以下のように書き加えます。 (2014年7月16日追記。Ubuntu 14.04LTS以降の場合は、 /etc/dhcp/dhcpd.conf を編集します。)
1 2 3 4 5 6 7 8 9 10 11 |
subnet 192.168.200.0 netmask 255.255.255.0 { range dynamic-bootp 192.168.200.2 192.168.200.20; + option domain-name-servers 192.168.1.1; (略) } subnet 192.168.201.0 netmask 255.255.255.0 { range dynamic-bootp 192.168.201.2 192.168.201.20; + option domain-name-servers 192.168.1.1; (略) } |
しかしながら、この場合でも、DNSのアドレスが192.186.1.1から他のアドレスに変わった場合に面倒な事になります。DNSのアドレスが変わった時には、Ubuntu PCのDHCPサーバの設定をそれに合わせて変更しないといけませんし、何より、192.168.200.0/24と192.168.201.0/24に接続している各コンピュータも、DHCPサーバにもう一度問い合わせを行って情報を更新する必要があります。
そこで、Ubuntu PC自身をDNSとして動作させ、Ubuntu PCの固定IP(これは変動しませんよね)をDHCPで通知するというのが3番目の案になります。
Ubuntu PCをDNSにするといっても、Ubuntu PCのDNS自体にあれこれと設定する必要は今の所ありません。Ubuntu PCでDNSのためのサービスが起動していれば、単純に、新しいLANのクライアントからDNSルックアップの要求が来た時に、さらに上位のDNS(Ubuntu PC自身が参照しているDNS)に問い合わせを丸投げしてくれるようになります。
そのように動作させるためには、Ubuntu PCにbind9(DNS用のサーバ)をインストールします。
$ sudo aptitude install bind9
次に、Ubuntu PCの /etc/dhcp3/dhcpd.conf に以下のように書き加えて、自身のIPアドレスをDNSとして通知するようにします。 (2014年7月16日追記。Ubuntu 14.04LTS以降の場合は、 /etc/dhcp/dhcpd.conf を編集します。)
1 2 3 4 5 6 7 8 9 10 11 |
subnet 192.168.200.0 netmask 255.255.255.0 { range dynamic-bootp 192.168.200.2 192.168.200.20; + option domain-name-servers 192.168.200.254; (略) } subnet 192.168.201.0 netmask 255.255.255.0 { range dynamic-bootp 192.168.201.2 192.168.201.20; + option domain-name-servers 192.168.201.254; (略) } |
変更を保存したら、DHCPサーバを再起動して設定を反映させます。
$ sudo /etc/init.d/dhcp3-server restart
また念のため、eth0とeth1が有効になる際に必ずbind9も起動している状態になるよう、/etc/network/interfaces にbind9のサービスの自動起動のためのコマンドも追記しておきましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
auto eth0 iface eth0 inet static address 192.168.200.254 netmask 255.255.255.0 broadcast 192.168.200.255 pre-up /sbin/sysctl net.ipv4.conf.all.forwarding=1 pre-up /sbin/iptables -t nat -A POSTROUTING -s 192.168.200.0/24 -j MASQUERADE pre-up /etc/init.d/dhcp3-server stop # Ubuntu 10.10の場合。Ubuntu 11.10以降では # pre-up /etc/init.d/isc-dhcp-server stop # とする。 + pre-up /etc/init.d/bind9 stop post-up /etc/init.d/dhcp3-server start # Ubuntu 10.10の場合。Ubuntu 11.10以降では # post-up /etc/init.d/isc-dhcp-server start # とする。 + post-up /etc/init.d/bind9 start post-down /sbin/iptables -t nat -D POSTROUTING -s 192.168.200.0/24 -j MASQUERADE post-down /sbin/sysctl net.ipv4.conf.all.forwarding=0 auto eth1 iface eth1 inet static address 192.168.201.254 netmask 255.255.255.0 broadcast 192.168.201.255 pre-up /sbin/sysctl net.ipv4.conf.all.forwarding=1 pre-up /sbin/iptables -t nat -A POSTROUTING -s 192.168.201.0/24 -j MASQUERADE pre-up /etc/init.d/dhcp3-server stop # Ubuntu 10.10の場合。Ubuntu 11.10では # pre-up /etc/init.d/isc-dhcp-server stop # とする。 + pre-up /etc/init.d/bind9 stop post-up /etc/init.d/dhcp3-server start # Ubuntu 10.10の場合。Ubuntu 11.10では # post-up /etc/init.d/isc-dhcp-server start # とする。 + post-up /etc/init.d/bind9 start post-down /sbin/iptables -t nat -D POSTROUTING -s 192.168.201.0/24 -j MASQUERADE post-down /sbin/sysctl net.ipv4.conf.all.forwarding=0 |
これで、Ubuntu PCがDNSになりました。
最後に、せんとくん1号2号のeth0を再起動して、DHCPサーバからの情報を最新のものに更新しておきましょう(やり方は先程と同じです)。
せんとくん1号2号でDNSを利用できるようになっているかどうかは、以下のようにして確認できます。
また、Ubuntu PCが本当にDNSとして動作しているかどうかは、せんとくん1号2号からdigコマンドでインターネット上のホストの名前でDNSルックアップを試みて、
$ dig www.google.com ; <<>> DiG 9.7.1-P2 <<>> www.google.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 23336 ;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;www.google.com. IN A ;; ANSWER SECTION: www.google.com. 69989 IN CNAME www.l.google.com. www.l.google.com. 300 IN A 66.249.89.104 www.l.google.com. 300 IN A 66.249.89.99 ...
といった結果が得られるかどうかで確認できます。
なお、この状態であれば、せんとくん1号2号でFirefox等を起動してWebブラウズすることもできるようになっています。
digの結果が
$ dig www.google.com ; <<>> DiG 9.7.1-P2 <<>> www.google.com ; (1 server found) ;; global options: +cmd ;; connection timed out; no servers could be reached
となる場合は、DNSを利用できていないということになります。
以上の内容をまとめると、
192.168.1.0/24 ↑ wlan0 ↑ [Ubuntu PC]→eth0→192.168.200.0/24 └→eth1→192.168.201.0/24
このような形で新しく2つのLANを構築する場合にUbuntu PCに対して実際に行う操作は、
必要なソフトウェアをインストールする。
$ sudo aptitude install dhcp3-server bind9
/etc/dhcp3/dhcpd.conf に以下の内容を書き加える。 (2014年7月16日追記。Ubuntu 14.04LTS以降の場合は、 /etc/dhcp/dhcpd.conf を編集します。)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
subnet 192.168.200.0 netmask 255.255.255.0 { range dynamic-bootp 192.168.200.2 192.168.200.20; option domain-name-servers 192.168.200.254; option routers 192.168.200.254; option subnet-mask 255.255.255.0; option broadcast-address 192.168.200.255; default-lease-time 6000; max-lease-time 72000; } subnet 192.168.201.0 netmask 255.255.255.0 { range dynamic-bootp 192.168.201.2 192.168.201.20; option domain-name-servers 192.168.201.254; option routers 192.168.201.254; option subnet-mask 255.255.255.0; option broadcast-address 192.168.201.255; default-lease-time 6000; max-lease-time 72000; } |
/etc/network/interfaces に以下の内容を書き加える。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
auto eth0 iface eth0 inet static address 192.168.200.254 netmask 255.255.255.0 broadcast 192.168.200.255 pre-up /sbin/sysctl net.ipv4.conf.all.forwarding=1 pre-up /sbin/iptables -t nat -A POSTROUTING -s 192.168.200.0/24 -j MASQUERADE post-up /etc/init.d/dhcp3-server stop # Ubuntu 10.10の場合。Ubuntu 11.10では # pre-up /etc/init.d/isc-dhcp-server stop # とする。 pre-up /etc/init.d/bind9 stop post-up /etc/init.d/dhcp3-server start # Ubuntu 10.10の場合。Ubuntu 11.10では # post-up /etc/init.d/isc-dhcp-server start # とする。 post-up /etc/init.d/bind9 start post-down /sbin/iptables -t nat -D POSTROUTING -s 192.168.200.0/24 -j MASQUERADE post-down /sbin/sysctl net.ipv4.conf.all.forwarding=0 auto eth1 iface eth1 inet static address 192.168.201.254 netmask 255.255.255.0 broadcast 192.168.201.255 pre-up /sbin/sysctl net.ipv4.conf.all.forwarding=1 pre-up /sbin/iptables -t nat -A POSTROUTING -s 192.168.201.0/24 -j MASQUERADE pre-up /etc/init.d/dhcp3-server stop # Ubuntu 10.10の場合。Ubuntu 11.10では # pre-up /etc/init.d/isc-dhcp-server stop # とする。 pre-up /etc/init.d/bind9 stop post-up /etc/init.d/dhcp3-server start # Ubuntu 10.10の場合。Ubuntu 11.10では # post-up /etc/init.d/isc-dhcp-server start # とする。 post-up /etc/init.d/bind9 start post-down /sbin/iptables -t nat -D POSTROUTING -s 192.168.201.0/24 -j MASQUERADE post-down /sbin/sysctl net.ipv4.conf.all.forwarding=0 # source: diff |
ということになります。
Ubuntu PCをこのままの状態にしていると、eth0やeth1について、ケーブルの抜き差しだけでネットワークを自動認識するといったUbuntuのネットワークマネージャの機能を利用できません。また、実験用のLANではない192.168.200.0/24や192.168.201.0/24なネットワークに接続した際に、自分がDHCPサーバとして振る舞ってしまうため、ネットワークが不調になる可能性もあります。なので、必要が無くなったら、ここまでで行った設定を解除しておきましょう。
インターフェースを停止し、ルーティング設定を解除する。
$ sudo ifdown eth0 $ sudo ifdown eth1
DHCPサーバとDNSを削除する。
$ sudo aptitude remove dhcp3-server bind9
この操作では設定ファイルは残るので、再度aptitudeでインストールすればまた同じ設定で使えるようになる。設定ファイルも含めて完全に削除したい場合は
$ sudo aptitude purge dhcp3-server bind9
とする。
サーバを削除したくないのであれば、
$ sudo aptitude install sysv-rc-conf
でサービス管理用のツールをインストールして、
$ sudo sysv-rc-conf dhcp3-server off (※Ubuntu 11.10の場合は sudo sysv-rc-conf isc-dhcp-server off) $ sudo sysv-rc-conf bind9 off
でサーバを恒久的に停止させる。この場合、また必要になった時は
$ sudo sysv-rc-conf dhcp3-server on (※Ubuntu 11.10の場合は sudo sysv-rc-conf isc-dhcp-server on) $ sudo sysv-rc-conf bind9 on
で再度サーバを有効化できる。
以上で、Ubuntu PCは元の状態に戻ります。
今回は2つのLANを作りたいという前提があるためそのようにしましたが、作るLANの数が1個でも3個でもN個でも、基本的な手順は変わりません。ただし、構築するLANの数を増やすには、ルータになるコンピュータのLAN用インターフェースがその分だけ必要になります。(インターフェースが足らない場合は、ルータ役のコンピュータ自体を増やしたり、今回のようにUSB接続のLANアダプタを付け足したりする必要があります。)
また、これを応用すると、「インターネットに接続できるPCが1台しかない環境で他のPCでもインターネットを利用したい」という時に、「インターネットに接続できる1台をルータとして一時的にLANを組んで、みんなでインターネットを利用する」ということもできます。
ルータやDHCPサーバになれるPCが1台あれば、追加投資をせずにクリーンなLANを必要に応じて作る事ができます。既存のLANに影響を与えずに実験をしてみたいけれどもネットワーク機器が足りないという場合は、今回の事例のように、手元のLinux PCをネットワーク機器の代わりに使用してみてはいかがでしょうか。
(まだMLではアナウンスしていませんが)milter manager 1.6.2をリリースしました。
このリリースではRubyでmilterを書くために必要な機能がすべて実装されました。これまではメールを拒否したり、隔離する機能は提供していたのですが、差出人を変更する、宛先を追加する、本文を変更するなどメッセージを変更する機能は部分的にしか対応していませんでした。このリリースからメッセージを変更する機能も提供されるようになったので、ほとんどのmilterはRubyでも実装できるようになりました。
Rubyでmilterを書くとどのようになるかはhbstudy#15の発表内容で紹介しています。
milter manager 1.6.2のインストール方法・アップグレード方法は以下にまとまっています。
milter managerを使ってRubyでメールフィルターを作ってみてはいかがでしょうか?