次のページ 前のページ 目次へ

5. ワイヤレスネットワーク構築の概要

5.1 基礎的な段階

一旦必要なものを入手して、必要なコンパイルをすべて実行してしまったら、 基礎的なワイヤレスの設定段階へ進みましょう。

  1. カーネルの低レベルの設定 - カーネルの低レベルの設定を行い、Linux のカーネルがワイヤレスカードを認識できるようにしましょう。 (低レベルとは、例えば I/O Port とか、割り込み(IRQ)とか、DMA などです) つまりカーネルから、「ワイヤレスカードを正しく認識して設定しました」という表示が 出るように設定しなければなりません。
  2. データリンク層の設定 - 各ワイヤレスカードには、データリンク層における標準値を設定するためのツールが提供されています。 例えば Proxim Symphony の場合、"rl2cfg" と呼ばれるツールです。 これは PCMCIA カードでの設定とは別で、そちらは PCMCIA 設定ファイルで行います。 自分の持つ全てのワイヤレスカードに対して、互いに交信できるようにするために、 首尾一貫して設定する必要があります。
  3. IP 層の設定 - ここまでくれば、ifconfig や route のコマンドを使い、IP 関係の設定ができます。
  4. 性能を十二分に発揮させつつ、競合を避けるコツ - この段階までくれば、あなたのワイヤレスネットワークは、基本的な動作はしています。 ここに加えて、特殊な機能の設定をする必要があります。 例えば proxy-arp とか、icmp echo redirect、ブリッジ、チャンネル変更などです。 これらの設定を施す事で、ネットワークを最適化し、 原因究明が困難で、バンド幅を狭くしてしまうような競合を回避します。

注意点 - ステップ 1 2 3 は、ISO/OSI 標準モデルのレベル 1 2 3 に相当します。 一方ステップ 4 は、ネットマスクが 255.255.255.255 という状況時に発生する 問題を解決するために付け加えたものです。 実際 32bit のネットマスクは、ISO/OSI 標準を守っていないので、 ネットワークに対して、ブロードキャストとマシンの IP に同じアドレスを使い、 ネットワークアドレスが存在しないような割り当てを強制することになります。

この見方には批判をする人がいるでしょう。しかし、もしあなたが ワイヤレスネットワークを設定するために標準 ISO/OSI モデルを使うのであれば、 サブネットのために多くのアドレスが無駄になりますし(個々のサブネットにおいて、2 つの IP ナンバー(ネットワークとブロードキャスト)を捨ててしまうので)、また柔軟な IP 割り当て(地理的な条件などで発生する) ができなくなります。 これについては、 付録 Aで詳しく解説します。

先のステップ 2 は、ケーブル接続のネットワーク設定では出てこない事柄です。 というのは、ケーブル接続のカードでは、この部位の特別な設定はないからです。

5.2 低レベルのカーネル設定

Linux カーネルに限らず、ハードウェアを認識させる事は PC を管理する上でいつも頭 の痛い問題です。

ワイヤレスカードは、たいてい PCMCIA 形式なので、少しばかり複雑です。 まず第一に、カーネルから PCMCIA アダプターを認識できるようにする必要があります。 それができれば、ワイヤレスカード用の特定ドライバのインストールに挑戦できます。

PCMCIA の設定において、以下の事をしなければなりません -

  1. linux のカーネルソースをインストールします。ソースは、 http://www.kernel.org から取得して /usr/src/linux に展開しましょう。 (展開の方法がわからない人は tar と gzip の使い方をみてください)
    訳注 - カーネルソースは、できるだけ国内のミラーサーバーから入手するようにしましょう。
  2. linux pcmcia のソースをインストールしましょう。ソースは、 ftp://projects.sourceforge.net/pub/pcmcia-csから取得して /usr/src/pcmcia に展開してください。 (展開方法がわからない人は tar と gzip のマニュアルをみてください)
    訳注 - カーネルのソースと同様、できるだけ国内のミラーサーバーから入手しましょう。
  3. カーネルの設定を行い、自分用のカーネルをコンパイルします。 この作業では、linux ディレクトリ (/usr/src/linux) 内にある README ファイルを読んでください。
    訳注 - JF プロジェクトでは、このファイル群も日本語への翻訳を進めています。 詳しくは JFを見てください。
  4. PCMCIA ソースの設定と再コンパイルを行います。 ディレクトリ /usr/src/pcmcia で configure, make コマンドを使います。 事前に、必要なドライバがあるか確認してください。 無い場合には、ドライバの説明に従いインストールする必要があります。 (たいてい pcmcia のディレクトリで "tar zxvf driver.tgz" を実行すれば OK です) 準備が整った後、コンパイルするため "make all" を実行します。 コンパイルが終わった後、"make install" を実行し、インストールしましょう。
  5. インストールを実行した後、有用な設定ファイル群は /etc/pcmcia 以下にあります。

PCMCIA では無い場合 -

  1. もし必要なドライバが linux のソースに含まれているのであれば(そんな事は 99% 無いと思いますが)、それをディレクトリにインストールし、 コンパイルする必要があります。

この段階にまで進めば、読み込む必要のあるモジュールの名前がわかっているはずです。 PCMCIA の設定は、PCMCIA のデーモンを起動すればよいだけです。 (RedHat ならば,"/etc/rc.d/init.d/pcmcia start")、 他のディストリビューションの場合は、"modprobe module_name options" です。 ここのオプションの項目で、ワイヤレスドライバが使う、ioport, irq, data-link の値 を与えます。( 5.3 章参照) とにかく、ハードウェアがドライバから正しく認識されているかどうか確認するには、以下のようにします -

  1. "tail /var/log/messages" : このコマンドで、syslog が吐き出す情報を見る事ができます。
  2. "dmesg" : このコマンドで、より詳しい情報を得る事ができます。
  3. /proc ディレクトリ : このディレクトリ以下のファイル群から、ioport, デバイス, irq やドライバの情報がわかります。

5.3 データリンク層の設定

それって何 ? 

ケーブルで繋がれたこれまでのネットワークでは、機器間をケーブルで繋いでし まえば、データリンク層の設定をしなくとも、TCP/IP パラメータを設定することができました。

ワイヤレスネットワーク環境では、これとは対照的に、データリンク層の設定が必要です。例えば、

  1. 私が接続するワイヤレスネットワークは、どの種類(アドホックかインフラストラクチャか)でしょう?
  2. どのチャンネルを使わなければならないの?
  3. これから接続するネットワークのサブネット( BSSID )は何? また ESS ID は?
  4. 私の通信は、encryption アルゴリズムのようなもので守られているのでしょうか? もし守られているならば、Length キーは何?

このように、調整が必要な設定項目はたくさんあります。 理由は、ワイヤレスネットワークの基本設計によるものです。 誰か近くにいる人が、アンテナをこちらに向けて、正しい TCP/IP の設定をするだけ で、あなたのパケットを見ることも、サービスを使うことも出来ます。

加えてワイヤレス環境の下では、互いに混信を起こしそうな多くのワイヤレスサ ブネットが、同時に存在している可能性があります。

従って、下記のような設定項目があります -

  1. load-time モジュールのオプション設定 - 例えば "modprobe ray_cs essid='LINUX'"
  2. run-time ドライバのユーティリティの使用 - 例えば "rl2cfg eth1 master"

5.4 IP の設定

これはあなたが直面しなければならない、三番目の問題です。 この問題は、ワイヤレスネットワークがさらに大きくなってきたときに、顕在化してくるでしょう。

ワイヤレス IP ネットワークは、負荷をかけて使わないのなら、あなたの負担にもならないことを覚えておいてください。

簡単な構成例

                       全てのホストは、互いが見えます
 
                               A - - - - - C
                                \       /
                               |  \   /   |
                                     /
                               |   /  \   |
                                 /      \
                               B - - - - - D

このような構成はとても単純で分かりやすく、また特殊な設定( IP レベルの設定など) を必要としません。 それぞれのホストへの IP アドレスと、正しい汎用ネットマスクを 割り当てればよいだけです。

ちょっと複雑な構成例

                       ホスト A は 直接ホスト B が見えません
 
                                A <- - - -
                              通信\        |
                            不可能\        C
                                 \        |
                                B <- - - -
 

A と B は、C を通してのみ交信が可能です。

もしネットワークがインフラストラクチャ・モードで構成されていて、C がアクセ スポイントであるならば、別に問題はありません。 アドホック・モードの場合、 "master" ホストが構成した BSS に対し、他のホストは接続する事ができます。 (「"master" ホスト」という言い方が正式なもので無い事は、十分承知していますけどね!)

これで IP レベルの完全な相互接続が実現できています。 つまり A と B は、C が持つ同じインターフェースを使って通信をおこないます。 もし A から B に ping を打とうとすると、C からたくさんの ICMP REDIRECT パケットを受信します。 この理由は、 C は A に対して、"パケットの目的地が、要求が来た所と同じネット ワーク内にあるよ"という事を伝えているからです。

解決方法 - これを抑止するため、コマンドラインから "echo 0 > /proc/sys/net/ipv4/conf/ethx/send_redirects" と入力してみましょう。 (ここの ethx は、A と B に向けた C 上のインターフェースです)

他の問題 - A と C には、どんなネットマスク値を割り振ったらよいのでしょう? 仮に A に対して、A と C を含んだネットマスクを設定すると、ネットワークはうまく動かないでしょう。 というのは、A はゲートウェイ(この場合 C )を使う事なく、 行き先の知らない MAC アドレスと共に ARP 要求を出しているからです。

あなたは proxy arp の利用を思いつくかもしれません。 しかし、proxy arp から行き先を知る事ができるのは、送り先が要求先のインターフェース とは別のインターフェースにある時だけなので、今回のケースには該当しません!!

この様な場合、とっても小さなネットマスク (Win9x ならば 255.255.255.254 を、WinNT ならば、すくなくとも 255.255.255.248) を設定する必要があります。 またホスト A と C が同じネットアドレスを持たないように、確実に設定する必要があります。

例 : 

  1. IP(ホスト A) = x.y.z.2/31, IP(ホスト B) = x.y.z.3/31 この設定では、うまく動きません。 というのは、 A はネットワークに対して B の事を尋ねますが (ARP の要求)、 A と B が同じインターフェースに繋がっているにも関わらず(従って proxy arp は無し)、 C は要求に応答してくれません。
  2. IP(ホスト A) = x.y.z.1/31, IP(ホスト B) = x.y.z.2/31 この設定は動作します。 なぜなら、A は C に対して B の事を聞くからです。 ( B に対して、C の MAC アドレスと一緒にして要求を出すので)

一般的にシステムは、ネットマスク値 255.255.255.254 という状態下において、 最終ビットだけが違う 2 つの IP アドレスを与えることで動きます.

これらすべては、TCP/IP を強制しています。 しかしこれは、高いレベルの柔軟性を得るためには、唯一の方法です。

注意点 - もしアクセスポイントを利用しているのであれば、 (ネットワークはインフラストラクチャ・モード) すべての問題はデータリンク層で解決されてしまうので、このような問題に直面する事はありません。 (ほとんどのアクセスポイントは、ブリッジとして機能しますから...) しかしアクセスポイントは高価です。(だいたい 1000 US$ か、それ以上) ですから、2、3 個のワイヤレスカード程度であれば、転送用に Pent133MHz,32MByte の RAM を積んだ程度の PC を使うと、 けっこう経済的です。

インターネットへのアクセス

                               A - - - - - C - - インターネット
                                \       /
                               |  \    /  |
                                     /
                               |   /  \   |
                                 /      \
                               B - - - - - D

いくつかの状況が想定されます

  1. C だけが唯一、公の IP アドレスを持っています。 このワイヤレスネットワークを動かすためには、プライベートな IP アドレス(例えば 192.168.x.y)を 設定し、C 上において転送やマスカレードを行うだけでよいです。 A, B, D は、C を標準のゲートウェイとします。
  2. インターネットからアクセス可能な、一般的なネットマスクを割り当てられており、 C はこのネットワークからインターネットへ接続するための、標準ゲートウェイです。 必要なのは、C 上で転送機能を有効にする事と、A, B, D に対して C を標準ゲートウェ イとするだけです。
  3. インターネットからアクセス可能な、一般的なネットマスクを割り当てられており、 加えて C は、インターネットへアクセスするための標準ゲートウェイではない場合を考えます。 この場合二つの方法があります。 一つは、ネットワークに対して、C を標準ゲートウェイとして使うように構築することです。 対称的に C に対しては、インターネットにアクセスするために、標準ゲートウェイを指すように 仕向けなければなりません。 この方法のかわりにできる事は、C に対して proxy arp 機能を有効にする事です。 (echo 1 > /proc/sys/net/ipv4/conf/ethx/proxy_arp ここの ethx は、標準ゲートウェイ に繋がっているインターフェースです) そして C 上の標準ゲートウェイを、インターネットへアクセスする 標準ゲートウェイを指すように設定します。 Proxy arp は TCP/IP に対して強引に振る舞いますが、うまく機能します。

ケーブルで繋がったネットワークとワイヤレスネットワークが混在している場合

                               インターネット
                                   \
                                     \        E
                                       \     /
                                         \  /       ワイヤレス
                               A - - - - - C - - F
                                \       /   \
                               |  \   /   |   \
                     ケーブル         /           G
                               |   /  \   |
                                 /      \
                               B - - - - - D

 

ここの C は、二つのネットワークの中継をしています。 右側はワイヤレスネットワークで、左側はケーブル接続のネットワークです。

加えて、インターネットへのアクセスも可能です。 つまり C には、3 枚のネットワークカードが搭載されているのです。

ホストに対して、どんな IP アドレスを割り振ったらよいのでしょう? これには二つの解決策があります。

  1. ネットワークを二つのサブネットに分割する方法 - 例えば 192.168.1.0/24 と 192.168.2.0/24 のように分割します。 この解決方は手っ取り早い方法ですが、もしインターネット IP アドレスを使っていると、 多くの IP が無駄になるので拡張性に欠けます。
  2. 二つ目の解決策は、C 上の二つのインターフェースに対して Proxy Arp 機能を有効にする事です。 ネットワークパラメータ(ネットアドレスや、ネットマスク)は、ワイヤレスでも ケーブル接続ネットワークでも一緒です。しかし、 proxy-arp を有効にすることで、どの IP がケーブル接続ネットワーク上のものか、あるいは ワイヤレスネットワークなのか、選択できるようになります。

2 つ目の解決策について検討してみましょう

例 - インターネットの公なサブネット x.y.z.0/24 を持っている場合を想定します

各インターフェースの設定は以下のとおり

  1. ifconfig eth0 x.y.z.C netmask 255.255.255.255 (ケーブル接続ネットワーク)
  2. ifconfig eth1 x.y.z.C netmask 255.255.255.255 (ワイヤレスネットワーク)
  3. ifconfig eth2 x.y.z.C netmask 255.255.255.255 (インターネットへ)

eth2 上における静的な配送

  1. route add IPGW dev eth2
  2. route add default gw IPGW

この配送経路指定では、全てのインターネットからのアドレス指定要求に対して、 自分の標準ゲートウェイを指定します。 つまりお気づきのように、最初に Linux に対して何処にルーターがあるのか教える必要があり、 そうすれば、標準の要求がそこを通過するようにできます。

eth0 上における静的な配送

  1. route add x.y.z.A dev eth0
  2. route add x.y.z.B dev eth0
  3. route add x.y.z.D dev eth0

ホスト A B D は、ケーブル接続のネットワーク上にあります。

eth1 上における静的な配送

  1. route add x.y.z.E dev eth1
  2. route add x.y.z.F dev eth1
  3. route add x.y.z.G dev eth1

ホスト E F G は、ワイヤレスネットワークに繋がっています。

注目すべき点は、柔軟性が大変高い事です。 しかし、それぞれのホスト毎に手動で設定しなければなりませんが。


次のページ 前のページ 目次へ