Linux では、バージョン2.0以降のカーネルに IP Masquerade サポートが
組み込まれたため、Linux をインストールしてカーネルを再構築することで、
IP Masquerade を使用することができます。
ここでは、Vine Linux 1.1(カーネル2.0.36)を使用します。
Vine Linux 1.1 では、標準のカーネルに IP Masquerade が既に組み込まれている
ため、カーネルの再構築の必要はありません。
Linux をインストールしたマシンには、2枚の NIC を用意しておきます。
ISA の NIC では、割り込み要求や I/Oポートアドレスを設定する必要があるため、
PCI の NIC を用意します。Linux は、初期状態では、NICを 1枚しか認識
しません。2枚目の NIC を認識させるために、起動時に以下のようなオプションを
カーネルに渡す必要があります。
ether=0,0,eth1
LILOを起動して Linux を起動させているため、/etc/lilo.conf ファイルに
append="ether=0,0,eth1"
を追加し、
# /sbin/lilo
を実行することで、起動時に上記のオプションをカーネルに渡すことができます。
次に、NICのIPアドレスなどの設定を行います。
/etc/sysconfig/network-scripts/ifcfg-eth1 ファイルとして、以下のような
内容のファイルを用意します。
DEVICE=eth1
IPADDR=192.168.1.1
NETMASK=255.255.255.0
NETWORK=192.168.1.0
BROADCAST=192.168.1.255
ONBOOT=yes
その後、再起動します。起動時に、
eth0:
eth1:
で始まるメッセージが表示されれば、NICは 2枚ともカーネルに認識されています。
もしうまくいかない場合は、以下の記述を /etc/lilo.conf ファイルに記述して
試してみます。
append="ether=0,0,eth0 ether=0,0,eth1"
2枚の NIC がカーネルに認識されたら、2枚目の NIC の設定を行います。
内部ネットワークには、クラスCのプライベートアドレスを使用します。
ちなみに、プライベートアドレスには、以下のものがあります。
クラスA 10.0.0.0 〜 10.255.255.255
クラスB 172.16.0.0 〜 172.31.255.255
クラスC 192.168.0.0 〜 192.168.255.255
2枚目の NIC には、IPアドレスとして 192.168.1.1 を割り当てます。
以下のコマンドを実行します。
# ifconfig eth1 192.168.1.1 broadcast 192.168.1.255 netmask 255.255.255.0
また、カーネル2.0系では、以下のルーティングに関する設定も必要です。
# route add -net 192.168.1.0 netmask 255.255.255.0 eth1
Linux をインストールした初期状態では、IP Masquerade が使用できないように
設定されているため、カーネルの再構築が必要になります。
ただし、標準でIP Masquerade のサポートが組み込まれている
ディストリビューションでは、再構築の必要はありません。
カーネルを作成するには、Linux のソースコードが必要です。セキュリティや
バグ対策のため、ソースコードは、なるべく最新のカーネルを使用するように
します。
以下のURL
http://ring.gr.jp/pub/linux/kernel.org/kernel/
より、安定版で最新版のカーネルをダウンロードします。
以下に、カーネルのコンパイルの手順を示します。作業は root で行います。
まず、ダウンロードしたカーネルのソースファイルを解凍・展開します。
# cd /usr/src
# tar xvfz linux-2.x.y.tar.gz
続いて、カーネルオプションの設定を行います。
# cd linux
# make menuconfig
IP Masquerade を有効にするには、以下のカーネルオプションを有効にします。
カーネル2.2系には、IP:forwarding/gatewaying のオプションがありませんが、
それ以外のオプションを有効にします。
General setup
[*] Networking support
Networking options
[*] Network firewalls
[*] TCP/IP networking
[*] IP: forwarding/gatewaying # 2.2 系カーネルには存在しない
[*] IP: firewalling
[*] IP: masquerading
[*] IP: ICMP masquerading
[*] IP: always defragment
IP Masquerade の設定を行います。2.0系のカーネルと 2.2系のカーネルでは、
設定方法が異なります。
2.0系カーネル
2.0系カーネルでは、ipfwadm というコマンドを使用します。ipfwadm は、
最近のディストリビューションには標準でインストールされている場合が多いです。
インストールされていない場合は、パッケージまたはソースから
インストールします。
ソースからインストールする場合は、以下のように行います。
以下のURL
ftp://ftp.xos.nl/pub/linux/ipfwadm/
より、最新の ipfwadm を入手します。今回は、ipfwadm-2.3.0.tar.gz を入手
しました。入手後、適当なディレクトリで解凍・展開し、ディレクトリを移動します。
% tar xvfz ipfwadm-2.3.0.tar.gz
% cd ipfwadm-2.3.0
以下のようにして、コンパイル、インストールを行います。
% make
% su
Password:
# make install
ipfwadm が使用できるようになったら、以下のようにして IP Masquerade の
設定を行います。
# ipfwadm -F -a accept -m -S 192.168.1.0/24 -D 0.0.0.0/0
# ipfwadm -F -p deny
上記の設定より、内部ネットワーク(192.168.1.0/255.255.255.0)が送信元の
パケットは Masquerade して通すが、それ以外のパケットは通さない、という
設定になります。
2.2系カーネル
2.2系カーネルでは、ipfwadm の代わりに ipchains で IP Masquerade の設定を
行います。インストールされていない場合は、パッケージまたはソースから
インストールします。
ソースからインストールする場合は、以下のように行います。
以下のURL
ftp://ftp.rustcorp.com/ipchains/
より、最新の ipchains を入手します。今回は、ipchains-1.3.9.tar.gz を入手
しました。入手後、適当なディレクトリで解凍・展開し、ディレクトリを移動します。
% tar xvfz ipchains-1.3.9.tar.gz
% cd ipchains-1.3.9
以下のようにして、コンパイル、インストールを行います。
% make
% su
Password:
# make install
ipchains が使用できるようになったら、以下のようにして IP Masquerade の
設定を行います。2.2系では Forwarding が無効になっているので、最初のコマンドで
有効にしています。
# echo 1 > /proc/sys/net/ipv4/ip_forward
# ipchains -A forward -j MASQ -s 192.168.1.0/24 -d 0.0.0.0/0
# ipchains -P forward DENY
上記の設定より、内部ネットワーク(192.168.1.0/255.255.255.0)が送信元の
パケットは Masquerade して通すが、それ以外のパケットは通さない、という
設定になります。
モジュールの読み込み
HTTPやSMTPなどのプロトコルは、IP Masquerade を使用しても問題無く
使用できますが、プロトコルの中には IP Masquerade を使用した場合、
そのままではうまく通信できないものもあります。例えば FTP や IRC が
あります。
このようなプロトコルで使用できるようにするためには、それぞれのプロトコルに
対応したモジュールをカーネルに読み込む必要があります。
/lib/modules/2.x.y/ipv4 (x,yはカーネルのバージョン番号)の下にある
ファイル名が ip_masq で始まるファイルがこれらモジュールにあたります。
モジュールは modprobe コマンドでカーネルに組み込むことができます。例えば
FTP や IRC を使用可能にするには、以下のようにしてモジュールを読み込みます。
# depmod -a
# modprobe ip_masq_ftp
# modprobe ip_masq_irc
FTPやIRCの他にも、CU-SeeMe、QUAKE、VDOLiveなどのモジュールを組み込むことも
可能です。
timeoutの設定
Linux は、IP Masquerade で使用する IP アドレスとポート番号の変換テーブルを
内部に持っています。以下のコマンドでテーブルを見ることができます。
# ipfwadm -M -l カーネル2.0系
# ipchains -M -L カーネル2.2系
このテーブル内のエントリは、通信が問題無く終了した場合には削除されるように
なっています。しかし、通信している途中で相手ホストが落ちたり、ネットワークが
切断したりして、通信が途絶えてしまうと、そのまま残ってメモリを消費したままに
なってしまいます。これを防ぐために、一定時間、通信のパケットが流れない
場合には、その通信は途絶えたものとみなして、テーブルから削除してしまうように
なっています。初期状態では、TCP では 15分、通信終了パケットを受け取った後の
TCP(tcpfin)では 2分、UDP では 5分となっています。
この timeout するまでの時間は、調整することができます。例えば、
TCP の timeout を 30分(1800秒)、それ以外の timeout はそのままにするには、
以下のようにします。
# ipfwadm -M -s 1800 0 0 カーネル2.0系
# ipchains -M -S 1800 0 0 カーネル2.2系