IP Masquerade


IP Masquerade

NAT(Network Address Translator)は、ゲートウェイでパケットの送信元や受信先の IPアドレスの変換を行うものです。NATは、このように IPアドレスのみを変換 しますが、TCP/IP や UDP/IP を使用した通信には、IPアドレスだけではなく、 ポート番号も使用されるため、IPアドレスだけでなく、ポート番号も変更する 方式があります。これが IP Masquerade です。
IPアドレスのみを書き換える NAT では、送信元が異なる場合には、それぞれ 異なるグローバルアドレスを割り当てる必要がありましたが、IP Masquerade では ポート番号も変換することで、異なる送信元に対しても同じグローバルアドレスを 使用することができます。
ポート番号はおよそ 6万個あるため、実際にはたった 1つのグローバルアドレス (ファイアウォール自身が使用しているグローバルアドレス)を使用することで 十分足ります。

Linux

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の設定

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系

Port Forwarding

IPのフィルタリング

IPパケットの送信元には、どんなアドレスでも指定することができるため、故意に 絶対ありえない送信元アドレスを持つパケットを送りつけることで、ホストをダウン させたり、ネットワークを麻痺させたりすることができます。
これを防ぐために、詐称した送信元アドレスを持つパケットは排除するようにします。

2.0系カーネル

カーネル2.0系では、ipfwadm を使用して、以下のように実行します。
ファイアウォール自身のアドレスを詐称したものを通さない
# ipfwadm -I -a deny -S 127.0.0.0/8 -D 0/0 -W eth0
# ipfwadm -I -a deny -S 127.0.0.0/8 -D 0/0 -W eth1
外部から内部のアドレスを詐称したものを通さない
# ipfwadm -I -a deny -S 192.168.1.0/24 -D 0/0 -W eth1
内部から外部のアドレスを詐称したものを通さない
# ipfwadm -I -a accept -S 192.168.1.0/24 -D 0/0 -W eth1
# ipfwadm -I -a deny -S 0/0 -D 0/0 -W eth1

2.2系カーネル

カーネル2.2系では、ipfwadm を使用して、以下のように実行します。
ファイアウォール自身のアドレスを詐称したものを通さない
# ipchains -A input -j DENY -s 127.0.0.0/8 -d 0/0 -i eth0
# ipchains -A input -j DENY -s 127.0.0.0/8 -d 0/0 -i eth1
外部から内部のアドレスを詐称したものを通さない
# ipchains -A input -j DENY -s 192.168.1.0/24 -d 0/0 -i eth0
内部から外部のアドレスを詐称したものを通さない
# ipchains -A input -j DENY -s 192.168.1.0/24 -d 0/0 -i eth1
# ipchains -A input -j DENY -s 0/0 -d 0/0 -i eth1

自動起動

クライアントマシンからインターネットにアクセスできるかどうか、確認をします。 もし、正常にインターネットに接続できるようなら、システムの起動時に、 自動的に IP Masquerade の設定をするようにします。 /etc/rc.d/rc.local ファイルに、実行したいコマンドを記述します。

戻る

sakai@oak.eg.t.kanazawa-u.ac.jp
Last modified: Wed Jun 14 20:50:16 JST 2000