IP Masquerade システムの構築
SERVER
IP Masquerade とは
IP マスカレードとは、限りある IP アドレスを複数のコンピュータで共有することが出来る技術です。
インターネット、TCP/IP ネットワークにおいて、コンピュータを特定するための IP アドレスは、ほかのどのコンピュータとも同じではいけません。
もし同じ IP アドレスが複数のコンピュータにつけられていたとすると、IP アドレスから一台のコンピュータを特定することが出来なくなってしまい、正常なデータ通信が行えなくなってしまいます。
しかし現在の IP アドレスは数に限りがあり、今日のインターネットの普及によってインターネットに参加しているすべてのコンピュータに対して一意の IP アドレスをつけることは非常に困難な状況になりました。
そこで不足気味の IP アドレスを補うための短期的な措置として、IP マスカレードという技術が存在します。
通常、TCP/IP で通信をする際には、相手先の IP アドレスと接続するポート番号、そして返事をもらうための自分の IP アドレスとポート番号を使います。
IP マスカレードは、上記でいう ”自分” と ”相手” の中間に存在して機能します。
”自分” が ”相手” にデータを送る際に一度 IP マスカレードが機能したコンピュータへデータを通過させます。
そのとき IP マスカレードは、通過する情報の ”自分” の IP アドレスとポート番号を記録します。そして、送信元( ”自分” ) の IP アドレスを、IP マスカレードが機能している自分の IP アドレスと置き換えて ”相手” へデータを送ります。
こうすることで、IP マスカレード機能を通過したデータの送信元は、IP マスカレードを提供しているコンピュータのみとなります。これによって何台のコンピュータでも IP マスカレードを通過させれば、ひとつの IP アドレスでほかのコンピュータへデータを送ることが出来ます。
そして ”相手” は受信したデータをもとに、送信元に返事を返します。
IP マスカレード機能を通過させたので、送信元は IP マスカレードを提供しているコンピュータとなります。したがって、”相手” 側が返すデータは IP マスカレードを提供しているコンピュータへ送られてきます。
すると IP マスカレードシステムは、あらかじめ記録しておいた情報を元に、適切なコンピュータ ( ”自分” ) にデータを返却します。
こうすることで、ひとつの IP アドレスだけでデータ通信が可能となります。
ただし上記の性質上、必ず最初に ”自分” からデータを送らないと正常にデータ通信を行うことが出来ません。”相手” から突然データを送ってこられても、IP マスカレードシステム側にあらかじめ登録された情報がないので、適切なコンピュータへ情報を送ることが出来なくなってしまうからです。
つまり、相手側から折り返しで接続が行われるようなものは、特別な処置を行わないと正常に通信できないので気をつけましょう。
カーネルの設定
IP マスカレードを行うためには、Linux カーネルに firewall 機能と IP Masquerade 機能を追加する必要があります。
通常の TCP/IP ネットワークを構成する設定はもちろんのこと、
Network firewalls
IP:firewalling
IP:always defragment
IP:transparent proxy support
IP:masquerading
IP:ICMP masquerading
といったオプションが必要になるようです。
以下、Slackware 7 を想定して話を進めていきます。
PC ルータとしての Linux
IP マスカレードを機能させるには、Linux をルータとして機能させる必要があります。
通常は Linux に 2 枚の Network Adapter を装着して、2 つのネットワーク (内部と外部) とをつなぐ位置に設置します。そして内部ネットワーク内のコンピュータは Gateway に IP マスカレードを提供するコンピュータを設定します。
ここでは、2 枚のネットワークアダプタが既に認識されている状態で話を進めていくことにします。
2 枚のネットワークアダプタを認識させるには、当然ながらその2枚のカードの両方に適したドライバを Kernel に組み込んだりモジュールとして導入したりしなくてはいけません。
また、両方とも PCI カードの場合は簡単に2枚を見つけてくれるのですけど、片方に ISA のカードが混じっていたりすると ISA の方の LAN カードが見つからない場合があります。そのときは /etc/lilo.conf の中に、append="ether=0,0,eth0 ether=0,0,eth1" というようなのを書き足しておく必要があります。なお、/etc/lilo.conf を書き換えたら、コマンドラインから lilo を実行するのを忘れないようにしましょう。
IP マスカレードの機能しているコンピュータの IP アドレスを、10.0.0.1 、内部ネットワークを 192.168.0.0/24 と仮定します。
あらかじめ認識させておいたネットワークアダプタに IP アドレスを次のように振ってあるとします。
eth0 : 10.0.0.1
eth1 : 192.168.0.1
2つのネットワーク間をまたいでデータを流せるようにするために、フォワーディング機能を ON にする必要があります。
echo "1" > /proc/sys/net/ipv4/ip_forward
と入力することで、フォワーディング機能が有効になります。
ipchains の設定
フォワーディング機能を有効にしたら、いよいよマスカレード機能の設定です。
ipchains -P forward DENY
ipchains -A forward -s 192.168.0.0/24 -j MASQ
これで完了です。
まず1行目で、フォワードするデータは基本的には無効とする設定を行っています。その上で、次の行で 192.168.0.0/24 (内部ネットワーク) からのフォワードに関してはマスカレード機能を通過させるという設定です。
ipchains はもっと細かな設定が出来ますので、いろいろと実験してみるのも面白いかもしれません。
その他の設定
フォワーディングや IP マスカレードの設定は、Linux を起動するたびに必要ですので、あらかじめスクリプトファイルを作成しておくといいと思います。
たとえば、/etc/rc.d/rc.ipmasq というファイルを作成し、
#!/bin/sh
echo "1" > /proc/sys/ipv4/ip_forward
ipchains -P forward DENY
ipchains -A forward -s 192.168.0.0/24 -j MASQ
というファイルを記述します。
これを起動時に実行できるように、
chmod a+x /etc/rc.d/rc.ipmasq
として実行可能として、/etc/rc.d/rc.local に以下の行を追加します。
if [ -x /etc/rc.d/rc.ipmasq ]; then
. /etc/rc.d/rc.ipmasq
fi
こうしておけば、起動時に毎回マスカレードの設定を行う手間がなくなります。
また、FTP といった特殊な通信をするものの場合は、IP マスカレードをそれに対応させるためのモジュールも組み込みます。
/etc/rc.d/rc.modules のなかにコメントアウトされていますので、中から
/sbin/modprobe ip_masq_ftp
という記述の項目を見つけてコメントを解除します。
接続するクライアントコンピュータの設定で注意することは、IP マスカレード機能を持ったコンピュータと同一のネットワークに参加できるように設定します。
今回の場合は 192.168.0.0/24 のネットワーク内に存在するようにします。そして、ディフォルトゲートウェイに IP マスカレードを提供するコンピュータ、今回の場合は 192.168.0.1 を設定すれば完了です。