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

6. IP 関係、イーサネット関係の情報

この章では、イーサネットと IP に固有の情報を説明します。この章に含 まれる内容は、以前の版で「それぞれのネットワーク技術についての情報」 という章に含まれていた内容から、筆者が特に面白いと思ったものを ピックアップして別個にまとめたものです。 LAN を引いている人なら誰でも、この章の内容は役に立つはずです。

6.1 イーサネット

イーサネットのデバイス名は `eth0', `eth1', `eth2'のようになります。カーネルが検出した最初のカードが `eth0'で、以下カードが検出する順に番号が振られていきます。

デフォルトでは Linux カーネルはイーサネットデバイスを一つしか検出しな いので、それ以上のボードをカーネルに検出させるためには、コマンドライン 引数で指定する必要があります。

Linux でイーサネットカードを使う方法の詳細については Ethernet-HOWTO を参照してください。

お使いのイーサネットカードをサポートするようにカーネルをきちんと再構築 してしまえば設定そのものは簡単です。

設定は通常、以下のようになります(ほとんどのディストリビューションは、 イーサネットをサポートするように設定すれば自動的にこの設定も行う はずです):

        root# ifconfig eth0 192.168.0.1 netmask 255.255.255.0 up
        root# route add -net 192.168.0.0 netmask 255.255.255.0 eth0
        

ほとんどのイーサネットデバイスは Donald Becker becker@CESDIS.gsfc.nasa.gov が開発しました。

6.2 EQL - 複数回線のトラフィックイコライザ

EQL のデバイス名は `eql' です。標準のカーネルソースでは一台の マシンで一つの EQL デバイスしか使えないかもしれません。EQL を使えば、 PPP や slip、plip といった二点間接続を複数用意して、それらを一つの論理 的な接続のように利用できます。たいていの場合、高速の専用線よりも低速回 線を複数まとめた方が安価に回線速度を稼げます。

カーネルのコンパイルオプション:

        Network device support  --->
            [*] Network device support
            <*> EQL (serial line load balancing) support
        

この機能を使うためには、接続先のマシンも EQL 機能を持っていなければい けません。Linux、 Livingstone Portmaster シリーズ以降のダイアルイン サーバなどがこの機能をサポートしています。

EQL を設定するには、 metalab.unc.edu から入手できる EQL 用ツールが必要になります。

EQL の設定はごく簡単です。まず最初に eql インターフェイスを設定します。 eql インターフェースは他のネットワークデバイスとほとんど同じです。 IP アドレスや mtu は ifconfig を用いて下記のように設定します。

        root# ifconfig eql 192.168.10.1 mtu 1006
        

次に、使おうとしている回線それぞれを手動で起動します。二点間接 続を複数用意することになるでしょう。どのように起動するかは使う接続の種 類に依存しますので、詳しい情報はそれぞれの接続形態について説明した章を ご覧ください。

最後にシリアル接続を EQL デバイスに結びつけます。これは「スレーブ化 (enslalving)」と呼ばれ、eql_enslave コマンドによって 以下のように行います:

        root# eql_enslave eql sl0 28800
        root# eql_enslave eql ppp0 14400
        

eql_enslave コマンドに与える「推定回線速度(estimated speed)」 パラメータは、直接には何もしません。このパラメータは EQL デバイス がデータグラムをそれぞれの回線からどのような割合で受けるかを決定するた めに使われるので、この数字をうまく調整して最適値を探してください。

EQL デバイスから回線を開放するには、以下のように eql_emancipate コマンドを使います:

        root# eql_emancipate eql sl0
        

他の二点間接続と同じく、EQL デバイスを使った経路制御も可能ですが、 その場合実際のシリアルデバイスではなく eql デバイスを経路に 使います。例えば、以下のように経路を設定できます:

        root# route add default eql
        

EQL ドライバは Simon Janes simon@ncm.com が開発しました。

6.3 IP パケット統計情報の取得(Linux 2.0 用)

カーネルに IP パケット統計情報の取得機能(IP accounting 機能)を組み込め ば、ネットワークの使用記録を取ることができます。記録できるデータは、最 後にカウンタをリセットしてからやりとりしたパケット数とデータのバイト数 です。カテゴリごとに異なるルールを指定でき、目的に応じた設定が可能です。 このオプションはカーネル 2.1.102 でなくなりました。古い ipfwadm ベース のファイアウォールが ``ipfwchains'' によって置き換えられたからです。

カーネルのコンパイルオプション:

        Networking options  --->
            [*] IP: accounting
        

カーネルに必要な機能を組み込んで再起動した後、ipfwadm コマン ドを使って IP パケット統計取得機能を設定します。IP パケットの統計情報 を細分するための方法はいろいろあります。以下に実際に使えそうな簡単な設 定例を示してみます。詳細については ipfwadm の man ページを読 んでください。

状況設定: PPP 経由でインターネットに接続されたイーサネットのネットワークが あるとします。イーサネットのネットワーク上にはさまざまなサービスを提供 しているマシンがあり、ftp や WWW といったトラフィックがどれくらい生じ ているかを知りたいとします。また tcp, udp 全体についても同様のことを 知りたいとします。

以下のようなコマンド群を実行することになります。シェルスクリプト の形にまとめて示します:

        #!/bin/sh
        #
        # Flush the accounting rules
        ipfwadm -A -f
        #
        # Set shortcuts
        localnet=44.136.8.96/29
        any=0/0
        # Add rules for local ethernet segment
        ipfwadm -A in  -a -P tcp -D $localnet ftp-data
        ipfwadm -A out -a -P tcp -S $localnet ftp-data
        ipfwadm -A in  -a -P tcp -D $localnet www
        ipfwadm -A out -a -P tcp -S $localnet www
        ipfwadm -A in  -a -P tcp -D $localnet
        ipfwadm -A out -a -P tcp -S $localnet
        ipfwadm -A in  -a -P udp -D $localnet
        ipfwadm -A out -a -P udp -S $localnet
        #
        # Rules for default
        ipfwadm -A in  -a -P tcp -D $any ftp-data
        ipfwadm -A out -a -P tcp -S $any ftp-data
        ipfwadm -A in  -a -P tcp -D $any www
        ipfwadm -A out -a -P tcp -S $any www
        ipfwadm -A in  -a -P tcp -D $any
        ipfwadm -A out -a -P tcp -S $any
        ipfwadm -A in  -a -P udp -D $any
        ipfwadm -A out -a -P udp -S $any
        #
        # List the rules
        ipfwadm -A -l -n
        #
        

``ftp-data'' や ``www'' といった名前は /etc/services にお ける設定を参照します。最後のコマンドはそれぞれの IP パケット統計の取得 規則を列挙し、集めたデータの合計値を表示します。

IP パケット統計情報を解析する際に注意すべきなのは、マッチしたす べての規則における各合計エリアに対して(転送バイト数やパケット数が)それ ぞれ足しこまれるということです。このため、差として現れる値を得る には多少の計算が必要です。例えば、ftp でも www でもないデータ量を知る ためには、全てのポートにマッチする規則より得た転送量から、ftp や www といった個々のプロトコルで転送したデータ量を引く必要があります。

root# ipfwadm -A -l -n
IP accounting rules
 pkts bytes dir prot source               destination          ports
    0     0 in  tcp  0.0.0.0/0            44.136.8.96/29       * -> 20
    0     0 out tcp  44.136.8.96/29       0.0.0.0/0            20 -> *
   10  1166 in  tcp  0.0.0.0/0            44.136.8.96/29       * -> 80
   10   572 out tcp  44.136.8.96/29       0.0.0.0/0            80 -> *
  252 10943 in  tcp  0.0.0.0/0            44.136.8.96/29       * -> *
  231 18831 out tcp  44.136.8.96/29       0.0.0.0/0             * -> *
    0     0 in  udp  0.0.0.0/0            44.136.8.96/29       * -> *
    0     0 out udp  44.136.8.96/29       0.0.0.0/0            * -> *
    0     0 in  tcp  0.0.0.0/0            0.0.0.0/0            * -> 20
    0     0 out tcp  0.0.0.0/0            0.0.0.0/0            20 -> *
   10  1166 in  tcp  0.0.0.0/0            0.0.0.0/0            * -> 80
   10   572 out tcp  0.0.0.0/0            0.0.0.0/0            80 -> *
  253 10983 in  tcp  0.0.0.0/0            0.0.0.0/0            * -> *
  231 18831 out tcp  0.0.0.0/0            0.0.0.0/0            * -> *
    0     0 in  udp  0.0.0.0/0            0.0.0.0/0            * -> *
    0     0 out udp  0.0.0.0/0            0.0.0.0/0            * -> *

6.4 IPパケット統計取得(Linux 2.2 用)

新しい IP パケット統計取得機能は「IP Firewall Chains」を通じて利用 します。詳しくは IP chains のホームページ を見てください。特に注意すべきなのは、フィルタの設定には ipfwadm ではなく ipchains を使う必要がある点です(最新版カーネルの Documentation/Changes より)。

6.5 IP エイリアス

1 つのネットワークデバイスに複数個の IP アドレスを設定できると便利 な用途がいくつかあります。インターネットサービスプロバイダ(ISP)はよく この機能を用いて、顧客に合わせて「カスタマイズした」WWW サービスや ftp サービスを提供しています。ここに書いている以上の情報については、 ``IP-Alias mini-HOWTO'' をご覧ください。

カーネルのコンパイルオプション:

        Networking options  --->
            ....
            [*] Network aliasing
            ....
            <*> IP: aliasing support
        

IP_Alias 機能を組み込んだカーネルを構築してインストールしてしまえば、 この機 能を設定するのはごく簡単です。alias 機能は、実際のネットワークデバイス に仮想的なネットワークデバイスを関連づけて追加します。仮想的なデバイスに割りあ てる名前は、<devname>:<virtual dev num> の形で、 eth0:0ppp0:10 のようになります。ifname:number 形式のデバイス は、メインのインタフェースの設定でなければ設定できない点に 注意してください。

たとえば、 2 つの異なった IP サブネットワークをサポートしている イーサネットネットワークに接続 したマシンがあるとして、同時に双方のサブネットにアクセスしたい場合、 以下のようにします。

        root# ifconfig eth0 192.168.1.1 netmask 255.255.255.0 up
        root# route add -net 192.168.1.0 netmask 255.255.255.0 eth0

        root# ifconfig eth0:0 192.168.10.1 netmask 255.255.255.0 up
        root# route add -net 192.168.10.0 netmask 255.255.255.0 eth0:0
        

エイリアスを削除する場合、仮想的なデバイス名の後に `-' を付けて ifconfig します。

        root# ifconfig eth0:0- 0
        

仮想デバイスを削除すれば、関連した経路も全て自動的に削除されます。

6.6 IP ファイアウォール(Linux 2.0 用)

IP ファイアウォールとファイアウォール全般については Firewall-HOWTO の方がずっと詳しく扱っています。IP ファイアウォールを使えば、許可した IP アドレスからのデータグラム以外は通さないように設定できます。 ファイアウォールの設定には、入ってくるデータグラムに対するもの、出てい くデータグラムに対するもの、内部で転送(forward)するデータグラムに対す るものの 3 種類があります。 入ってくるデータグラムに対するルールはネットワークデバイスが受けとった データグラムに対して適用され、出ていくデータグラムに対するルールはネッ トワークデバイスが送出するデータグラムに適用されます。転送するデータグラム に対するルールは、受けとったものの、自分宛てではないデータグラム、すな わち別の経路に送り出すデータグラムに適用されます。

カーネルのコンパイルオプション:

        Networking options  --->
            [*] Network firewalls
            ....
            [*] IP: forwarding/gatewaying
            ....
            [*] IP: firewalling
            [ ] IP: firewall packet logging
        

IP ファイアウォール機能は ipfwadm コマンドを使って設定します。 以前にも述べましたが、私はセキュリティについての専門家ではありません。 以下に応用可能な簡単な例を紹介しますが、セキュリティが重要な問題ならば、 ご自分で研究して必要な設定を開発してください。

IP ファイアウォール機能の最も一般的な使い方は、Linux マシンをルータや ファイアウォールゲートウェイとして用い、ローカルネットワークを ネットワーク外部からの許可されていないアクセスから守ることでしょう。

以下の設定は Arnt Gulbrandsen <agulbra@troll.no> が報告 してくれたものに基づいています。

以下に用いる例では、下図のような設定で、Linux マシンをファイアウォール /ルータにしています。

-                                   -
 \                                  | 172.16.37.0
  \                                 |   /255.255.255.0
   \                 ---------      |
    |  172.16.174.30 | Linux |      |
NET =================|  f/w  |------|    ..37.19
    |    PPP         | router|      |  --------
   /                 ---------      |--| Mail |
  /                                 |  | /DNS |
 /                                  |  --------
-                                   -

ファイアウォールを設定するためのコマンドは、通常 rc ファイルに まとめて、システムの起動時に自動的に実行するように設定します。セキュリ ティを最大限に強化するには、ネットワークインターフェイスが設定されてか らこれらの設定を行うべきですが、ファイアウォールマシンをリブートした際 に誰かがイタズラするのを防ぐため、ネットワーク設定の前に実行する必 要があるかもしれません。

        #!/bin/sh

        # Flush the 'Forwarding' rules table
        # Change the default policy to 'accept'
        #
        /sbin/ipfwadm -F -f
        /sbin/ipfwadm -F -p accept
        #
        # .. and for 'Incoming'
        #
        /sbin/ipfwadm -I -f
        /sbin/ipfwadm -I -p accept

        # First off, seal off the PPP interface
        # I'd love to use '-a deny' instead of '-a reject -y' but then it
        # would be impossible to originate connections on that interface too.
        # The -o causes all rejected datagrams to be logged. This trades
        # disk space against knowledge of an attack of configuration error.
        #
        /sbin/ipfwadm -I -a reject -y -o -P tcp -S 0/0 -D 172.16.174.30

        # Throw away certain kinds of obviously forged packets right away:
        # Nothing should come from multicast/anycast/broadcast addresses
        #
        /sbin/ipfwadm -F -a deny -o -S 224.0/3 -D 172.16.37.0/24
        #
        # and nothing coming from the loopback network should ever be
        # seen on a wire
        #
        /sbin/ipfwadm -F -a deny -o -S 127.0/8 -D 172.16.37.0/24
        
        # accept incoming SMTP and DNS connections, but only
        # to the Mail/Name Server
        #
        /sbin/ipfwadm -F -a accept -P tcp -S 0/0 -D 172.16.37.19 25 53
        #
        # DNS uses UDP as well as TCP, so allow that too
        # for questions to our name server
        #
        /sbin/ipfwadm -F -a accept -P udp -S 0/0 -D 172.16.37.19 53
        #
        # but not "answers" coming to dangerous ports like NFS and
        # Larry McVoy's NFS extension.  If you run squid, add its port here.
        #
        /sbin/ipfwadm -F -a deny -o -P udp -S 0/0 53 \
                -D 172.16.37.0/24 2049 2050
        
        # answers to other user ports are okay
        #
        /sbin/ipfwadm -F -a accept -P udp -S 0/0 53 \
                -D 172.16.37.0/24 53 1024:65535
        
        # Reject incoming connections to identd
        # We use 'reject' here so that the connecting host is told
        # straight away not to bother continuing, otherwise we'd experience
        # delays while ident timed out.
        #
        /sbin/ipfwadm -F -a reject -o -P tcp -S 0/0 -D 172.16.37.0/24 113

        # Accept some common service connections from the 192.168.64 and
        # 192.168.65 networks, they are friends that we trust.
        #
        /sbin/ipfwadm -F -a accept -P tcp -S 192.168.64.0/23 \
                -D 172.16.37.0/24 20:23
        
        # accept and pass through anything originating inside
        #
        /sbin/ipfwadm -F -a accept -P tcp -S 172.16.37.0/24 -D 0/0
        
        # deny most other incoming TCP connections and log them
        # (append 1:1023 if you have problems with ftp not working)
        #
        /sbin/ipfwadm -F -a deny -o -y -P tcp -S 0/0 -D 172.16.37.0/24
        
        # ... for UDP too
        #
        /sbin/ipfwadm -F -a deny -o -P udp -S 0/0 -D 172.16.37.0/24
        

よいファイアウォールの設定は多少トリッキーになっているものですが、ここ に示した例は出発点として十分役に立つはずです。 設定方法の詳細については ipfwadm の man ページを参照してくだ さい。ファイアウォールを設定する場合、周囲の人にたずねて、信頼するに足 る情報源からのアドバイスを可能な限り受けてください。そして、設定が正し く機能しているかどうか、外部から確認してもらいましょう。

6.7 IP ファイアウォール (Linux 2.2 用)

新しいファイアウォール機能は ``IP Firewall Chains'' を使って利用で きます。詳しくは IP chains のホームページ を見てください。特に注意すべきなのは、フィルタの設定には ipfwadm ではなく ipchains を使う必要がある点です(最新版カーネルの Documentation/Changes より)。

この説明は非常に古くなっていることは筆者らもわかっており、この節を書き 直すべく現在作業中です。1999 年の 8 月には新しい版を出すのでお待ちくだ さい。

6.8 IPIP カプセル化

IP データグラムの中に IP データグラムをカプセル化して入れると、なんの役に立つん でしょうか? 前もって使い途を知っていなければ、この手法はきっと奇妙に思 えることでしょう。では、これがよく使われる目的を 2 つ示しましょう。 モバイル IP と IP マルチキャストです。もっとも広く使われているけ れど、ほとんど知られていない利用目的としてはアマチュア無線があります。

カーネルのコンパイルオプション:

        Networking options  --->
            [*] TCP/IP networking
            [*] IP: forwarding/gatewaying
            ....
            <*> IP: tunneling
        

IP トンネルデバイスは `tunl0', `tunl1' 等となります。

「でも、どうしてこんなものを使うの?」かって? はいはい、説明しましょう。 今までの IP 経路制御では、IP ネットワークはネットワークアドレスと ネットワークマスクから構成されることになっていました。これにより、連続 した一連のアドレスの全てに対して 1 つの経路制御エントリを使った経路制御 が行えました。これは大変便利ですが、ある特定のネットワークの一部に接続 している間は特定の IP アドレスしか使えないということでもあります。ほと んどの場合はこれでも大丈夫なのですが、あなたがモバイル派であれば、ずっ と 1 つの場所に接続したままというわけにはいかないと思います。 IP/IP カプセル化(IP トンネリング)を使うと、自分の IP アドレス宛の データグラムに IP の皮をかぶせて別の IP アドレスに送ることによって、こ の制限を克服できます。しばらく別の IP ネットワークで作業をすることが分 かっていれば、自分の元々のネットワーク上のマシンがあなたの IP アドレス 宛のデータグラムを受け付け、これを現在一時的に使っているアドレスに送る ように設定できます。

トンネリングを行うネットワーク設定

 192.168.1/24                          192.168.2/24

     -                                     -
     |      ppp0 =            ppp0 =       |
     |  aaa.bbb.ccc.ddd  fff.ggg.hhh.iii   |
     |                                     |
     |   /-----\                 /-----\   |
     |   |     |       //        |     |   |
     |---|  A  |------//---------|  B  |---|
     |   |     |     //          |     |   |
     |   \-----/                 \-----/   |
     |                                     |
     -                                     -

この図は、IPIP カプセル化が必要となる別の理由、すなわち 仮想プライベートネットワーク(virtual private networking, VPN)を示して います。この例では、ダイアルアップによる単純なインターネット接続をして いるマシンが 2 台あることを前提とします。それぞれのホストは IP アドレ スを 1 つだけ割り当てられています。これらのマシンの後ろには、予約済み の IP ネットワークアドレスを使う設定のプライベートな LAN がいくつかあ ります。このとき、ネットワーク A 上のホストとネットワーク B 上のホスト を、あるネットワーク経路を使って正しくインターネットに接続しているかの ように接続したいとします。IPIP カプセル化を使うとこれが可能になります。 カプセル化では、ネットワーク A と B のホストをインターネット上の別のホ ストと通信させるという問題は解決されないので注意してください。 これを 行うには、さらに IP マスカレード等の技が必要となります。カプセル化は普 通、マシンをルータのように機能させることで実現します。

Linux によるルータ `A' は、以下のようなスクリプトを使って設定しま す:

        #!/bin/sh
        PATH=/sbin:/usr/sbin
        mask=255.255.255.0
        remotegw=fff.ggg.hhh.iii
        #
        # Ethernet configuration
        ifconfig eth0 192.168.1.1 netmask $mask up
        route add -net 192.168.1.0 netmask $mask eth0
        #
        # ppp0 configuration (start ppp link, set default route)
        pppd
        route add default ppp0
        #
        # Tunnel device configuration
        ifconfig tunl0 192.168.1.1 up
        route add -net 192.168.2.0 netmask $mask gw $remotegw tunl0
        

Linux によるルータ `B' も同様のスクリプトを使って設定します:

        #!/bin/sh
        PATH=/sbin:/usr/sbin
        mask=255.255.255.0
        remotegw=aaa.bbb.ccc.ddd
        #
        # Ethernet configuration
        ifconfig eth0 192.168.2.1 netmask $mask up
        route add -net 192.168.2.0 netmask $mask eth0
        #
        # ppp0 configuration (start ppp link, set default route)
        pppd
        route add default ppp0
        #
        # Tunnel device configuration
        ifconfig tunl0 192.168.2.1 up
        route add -net 192.168.1.0 netmask $mask gw $remotegw tunl0
        

以下のコマンド

        route add -net 192.168.1.0 netmask $mask gw $remotegw tunl0
        

は、「192.168.1.0/24宛の全てのデータグラムを、終点アドレスが aaa.bbb.ccc.ddd である IPIP カプセル化データグラムの中に送ること」 と読みます。

設定は両端で対になる点に注意してください。トンネルデバイスは、経路を指 定するために受け取ったデータグラムを入れた IP データグラムの終点 として、経路の中で `gw' を使います。そのマシンは IPIP データグラム のカプセル化解除の方法を知っていなければなりません。 つまり、トンネルデバイスが設定されていなければなりません。

トンネリングを行うホストの設定

ネットワーク全体でまとめて経路制御を行う必要はありません。例えば、1 つ の IP アドレスだけの経路を指定することもできます。この場合には、「リモー ト」のマシンのtunl デバイスにホームの IP アドレスを設定し、A 側で はトンネルデバイスを通じて、ネットワークの経路制御ではなくホストの経路 制御(および Proxy Arp)を行うだけです。構成図を正しく書き直してみましょ う。今度の場合は、両方がインターネットに完全に接続し、かつホスト `A' がサポートしているリモートのネットワークの一部であるかのよう に動作させたいホスト `B' があるだけです:

 192.168.1/24

     -
     |      ppp0 =                ppp0 =
     |  aaa.bbb.ccc.ddd      fff.ggg.hhh.iii
     |
     |   /-----\                 /-----\
     |   |     |       //        |     |
     |---|  A  |------//---------|  B  |
     |   |     |     //          |     |
     |   \-----/                 \-----/
     |                      also: 192.168.1.12
     -

Linux によるルータ `A' は以下のシェルスクリプトを使って設定します:

        #!/bin/sh
        PATH=/sbin:/usr/sbin
        mask=255.255.255.0
        remotegw=fff.ggg.hhh.iii
        #
        # Ethernet configuration
        ifconfig eth0 192.168.1.1 netmask $mask up
        route add -net 192.168.1.0 netmask $mask eth0
        #
        # ppp0 configuration (start ppp link, set default route)
        pppd
        route add default ppp0
        #
        # Tunnel device configuration
        ifconfig tunl0 192.168.1.1 up
        route add -host 192.168.1.12 gw $remotegw tunl0
        #
        # Proxy ARP for the remote host
        arp -s 192.168.1.12 xx:xx:xx:xx:xx:xx pub
        

Linux ホスト `B' は以下のシェルスクリプトを使って設定します:

        #!/bin/sh
        PATH=/sbin:/usr/sbin
        mask=255.255.255.0
        remotegw=aaa.bbb.ccc.ddd 
        #
        # ppp0 configuration (start ppp link, set default route)
        pppd
        route add default ppp0
        #
        # Tunnel device configuration
        ifconfig tunl0 192.168.1.12 up
        route add -net 192.168.1.0 netmask $mask gw $remotegwtunl0
        

このような設定は、モバイル IP を考えるとよりはっきりします。 モバイル IP では、1 つのホストがインターネット上であちこちに移動しつつ、 その間ずっと 1 つの IP アドレスを使い続けられると便利です。実際の モバイル IP の扱い方については、モバイル IP の節を参照してください。

6.9 IP マスカレード(IP Masquerade)

インターネットに接続するためにダイアルアップ接続を使っている人もたくさ んいることでしょう。こういった接続を用いているほとんどの人は、 ISP から IP アドレスを 1 つしかもらえません。 1 台のホストが完全 にネットワークにアクセスするには、普通は IP アドレスが 1 つあれば十分だからで す。IP マスカレード(IP Masquerade)というのは、1 つの IP アドレスを複数 のコンピュータで使うためのうまい仕掛けです。IP マスカレードを使えば、 「マスカレード(masquerade, 変装)」という言葉の通り、他のホストを ダイアルアップ接続しているマシンに見せかけて IP アドレスを共有できます。 ただし注意点も少しあって、マスカレード機能はほぼ確実に片方向の通信でし か動作しません。つまり、マスカレードされているホストは自分からの接続は 行えますが、リモートホストからの接続を受け付けることはできません。 したがって、talk 等のネットワークサービスは動作しませんし、 ftp 等のサービスはパッシブ(PASV)モードで動作するように設定しなけ ればなりません。幸運なことに、telnet, WWW, irc を含む大部分 のネットワークサービスはうまく動作します。

カーネルのコンパイルオプション:

        Code maturity level options  --->
            [*] Prompt for development and/or incomplete code/drivers
        Networking options  --->
            [*] Network firewalls
            ....
            [*] TCP/IP networking
            [*] IP: forwarding/gatewaying
            ....
            [*] IP: masquerading (EXPERIMENTAL)
        

普通の場合、あなたの Linux マシンには slip か PPP ダイアルアップ 接続機能が組み込まれている事でしょう (あたかもスタンドアロンのマシンで あるかのように)。さらに、そのマシンには別のネットワークデバイス (多分 イーサネット) が設定されていて、ネットワークが一つ割り振られていることに なっているでしょう。 マスカレード経由で接続するホストはこの 2 つめのネットワーク上にあります。イーサネットネットワーク上にある各 マシンのデフォルトの経路には、 IP マスカレードを組み込んでインターネット とのゲートウェイになっている、この Linux マシンを指定します。

よくある IP マスカレードの設定は下図のようになります:

-                                   -
 \                                  | 192.168.1.0
  \                                 |   /255.255.255.0
   \                 ---------      |
    |                | Linux | .1.1 |
NET =================| masq  |------|
    |    PPP/slip    | router|      |  --------
   /                 ---------      |--| host |
  /                                 |  |      |
 /                                  |  --------
-                                   -

IPFWADM を使った IP マスカレード

この設定を行うため最も適切なコマンドは以下のようになります:

        # Network route for ethernet
        route add -net 192.168.1.0 netmask 255.255.255.0 eth0
        #
        # Default route to the rest of the internet.
        route add default ppp0
        #
        # Cause all hosts on the 192.168.1/24 network to be masqueraded.
        ipfwadm -F -a m -S 192.168.1.0/24 -D 0.0.0.0/0 
        

ipchains を使った IP マスカレード

これは ipfwadm を使う場合と似ていますが、コマンドの構造が変わって います:

        # Network route for ethernet
        route add -net 192.168.1.0 netmask 255.255.255.0 eth0
        #
        # Default route to the rest of the internet.
        route add default ppp0
        #
        # Cause all hosts on the 192.168.1/24 network to be masqueraded.
        ipchains -A forward -s 192.168.1.0/24 -j MASQ
        

IP マスカレード機能の詳しい説明は IP Masquerade Resource Page にあります。また、IP マスカレードに関する非常に詳しい説明として、 ``IP-Masquerade mini-HOWTO'' があります。この文書には、Linux を使った IP マスカレードサーバと他の OS を組み合わせて使うための設定も載ってい ます。

6.10 IP 透過プロキシ(IP Transparent Proxy)

IP transparent proxy 機能を使えば、別のマシンへのサービスリクエストや サーバへのアクセスをこのマシンにリダイレクトすることができます。この機 能は、Linux マシンをルータ兼プロキシサーバとして使っている場合に便利で、 外部のネットワークへ要求されたリクエストを全てローカルのプロキシサーバ で処理できるようになります。

カーネルのコンパイルオプション:

        Code maturity level options  --->
                [*] Prompt for development and/or incomplete code/drivers
        Networking options  --->
                [*] Network firewalls
                ....
                [*] TCP/IP networking
                ....
                [*] IP: firewalling
                ....
                [*] IP: transparent proxy support (EXPERIMENTAL)
        

透過プロキシ機能は ipfwadm コマンドで設定します。

役立ちそうな設定例を以下に示しておきます:

        root# ipfwadm -I -a accept -D 0/0 telnet -r 2323
        

この例を実行した場合、任意のホストの telnet(23 番)ポートに接続 しようとすると、透過プロキシホストの 2323 番ポートにリダイレクトされます。 このポートでサービスを実行すれば、telnet 接続を転送したりログを残す等、 必要に応じた動作をさせられます。

さらに面白い例として、全ての http トラフィックをローカルの キャッシュにリダイレクトすることもできます。しかし、プロキシサーバが使 うプロトコルはネイティブの http: とは異なります。つまり、http クライアント は www.server.com:80 に接続して /path/page を要求しますが、 ローカルキャッシュに接続した場合は proxy.local.domain:8080 に接続 して www.server.com/path/page を要求しなければなりません。

http リクエストにローカルプロキシのフィルタをかけるには、 transproxy と呼ばれる小さなサーバ(WWW で入手できます)を間に置いて、 プロトコルを一致させる必要があります。transproxy を 8081 番ポートで動作させるには、以下のコマンドを実行します:

        root# ipfwadm -I -a accept -D 0/0 80 -r 8081
        

こうすると、transproxy は外部サーバにアクセスしようとする全ての接続を 受け取り、プロトコルの相違点を直した後に、これをローカルのプロキシに渡 します。

6.11 IPv6

やっと IP ネットワークについて理解し始めたところだというのに、ルールが 変ってしまうなんて…、と思われるかもしれません。IPv6 とは Internet Protocol Version 6 の省略形です。IPv6 は、現在インターネットコミュニティ が直面している IP アドレスの枯渇問題に対応することを主目的に開発されて います。IPv6 のアドレスは 16 バイト長(128 ビット)になっています。それ以 外にも、IPv6 では主として単純化のためのさまざまな変更が施されて、既存 の IPv4 ネットワークよりも管理しやすいようになっています。

Linux 2.2.*シリーズには、既に IPv6 の実装が動作していますが、 まだ完全ではありません。

この次世代のインターネット技術を試してみたい場合や必要な場合は、 www.terra.net から入手できる IPv6-FAQ をまず読んでみましょう。

6.12 モバイル IP(Mobile IP)

「IP の可搬性(IP mobility)」とは、ある場所でインターネットに接続してい るホストが、別の場所に移っても IP アドレスを変更せずに接続できたり、接 続を切らずに場所を移動できることです。通常、IP アドレスを割り当てられ ているホストは、接続場所を変更すれば IP アドレスも変更しなければなりま せん。IP mobility 機能を使えば、ポータブルマシンにも決まった IP アドレ スを割り当て、自動ルーティング機能とIP カプセル化(トンネリング)機能を 使い、ポータブルマシン宛のデータグラムを、そのマシンが現在実際に使って いる IP アドレスに送ることができます。

Linux 用に IP mobility ツール一式を開発しようというプロジェクトが進行 中です。プロジェクトの進行状況とツールは Linux Mobile IP Home Page から入手できます。

6.13 マルチキャスト

通常、TCP/IP は接続先のマシンを指定した一対一の接続形態を取りますが、 IP マルチキャスト機能を使えば、異なる IP ネットワーク上にある任意の数 のホストへ、同時に IP データグラムを送ることが可能になります。この機能 は、インターネット全体へ音声やビデオの素材を「放送」するなど、 さまざまな新しいアプリケーションのために開発されました。

カーネルのコンパイルオプション:

Networking options  --->
        [*] TCP/IP networking
        ....
        [*] IP: multicasting

IP マルチキャストを使うには、ツール一式と多少のネットワークの設定が必 要です。Linux のマルチキャスト対応に関する詳しい情報については Multicast-HOWTO をご覧ください。

6.14 NAT - ネットワークアドレス変換(Network Address Translation)

IP ネットワークアドレス変換機能(NAT)は、Linux の IP マスカレード機能の 兄貴分が標準化されたもの、と思ってだいたいかまいません。NAT は RFC-1631 で詳しく仕様が決められています(RFC 文書はお近くの RFC アーカイブから入 手してください)。NAT にできて IP マスカレードにはできない機能があるの で、会社規模のファイアウォールの経路設計や大規模な設備で用いるには NAT の方がずっと適切です。

Linux 2.0.29 用の NAT のアルファ版の実装は Michael.Hasenstein Michael.Hasenstein@informatik.tu-chemnitz.de が開発しました。 Michaels が作成した文書と実装は以下の場所から入手できます:

Linux IP Network Address Web Page

新しい Linux 2.2.x でも、経路制御アルゴリズムに NAT 機能の一部が入って います。

6.15 Traffic Shaper - 許可する帯域幅の変更

traffic shaper は、ユーザが定義したようにトラフィックを制限するイン タフェースデバイスを新しく作成するドライバです。このデバイスは、実際の 送信を行う物理的なネットワークデバイスに依存します。また、ネットワーク トラフィックに対しては送信用の routed として使えます。

traffic shaper は Linux 2.1.15 で導入され、Linux 2.0.36 に バックポート(訳注: 開発版カーネルの機能を安定版カーネルに移植すること) されました(traffic shaper は、Alan Cox が配布している 2.0.36-pre-patch-2 に含まれています。Alan Cox は Linux 2.0 用の shaper デバイスの作者でありメンテナです)。

traffic shaper はモジュールとしてコンパイルしなければなりません。 このデバイスは shapecfg コマンドを以下のように使って設定します:

        shapecfg attach shaper0 eth1
        shapecfg speed shaper0 64000
        

shaper デバイスは送信するトラフィックの帯域幅の制御しかできません。 というのも、パケットは経路表に従って shaper デバイス経由で送信されるか らです。したがって、「始点アドレスを使った経路制御」機能を利用すれば、 Linux ルータを使っている特定のホストの全体の帯域幅を制限できます。

Linux 2.2 は最初からこのような経路制御に対応しています。Linux 2.0 でこの機能が必要ならば Mike McLagan によるパッチを調べてください。 このパッチは ftp.invlogic.com にあります。shaper デバイスに関する の詳しい情報については、Documentationnetworking/shaper.txt/ を 見てください。

受信するパケットの(試験的な)調整を試してみたければ、 rshaper-1.01 を試すとよいでしょう(さらに新しいバージョンがあ るかもしれません)。これは ftp.systemy.it から入手できます。

6.16 Linux 2.2 における経路制御

最新版の Linux であるバージョン 2.2 では、経路制御のポリシーは非常に柔 軟に設定できます。申し訳ありませんが、解説については本文書の次の版を待 つか、カーネルのソースを読むかしてください。


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