IP Masquerade(マスカレード)

作成:

さて、前回の作業で、Linuxサーバそのものからインタネットへ接続することはできるようになりました。
次にする作業は、LAN内部のホストからインターネットへ接続できるようにすることです。
ぶっちゃけた話、実は前回までの作業で既にこの機能は働いているため、 何もしなくても一応、最低限のアクセスできるようにはなっています。
では、今回はこれでおしまい・・・というわけではありません。

まあ、いろいろやらないと快適なネットワークとは言い難いので、その作業をやります。

IP マスカレードとは?

さて、まずはIPマスカレードとは何か、適当に解説(本当に適当なので読み飛ばしたほうがいいかも)

インターネットで通信をするにはインターネット上でユニークなIPアドレス(グローバルIPアドレス)が必要です。
しかし、LANの内部で用いられるプライベートIPアドレスは、インターネットでは通用しません。
そこで、LAN内のホストがインターネットにアクセスするときに、 ルータ(この場合ゲートウェイか?)が持っているIPアドレスに変換してやって通信を可能にするというのが、IP NAT(Network Address Translation)です。
これは、プライベートIPアドレスとグローバルIPアドレスの対応が1対1なので、非常に単純ですが、 ルータが持っているグローバルIPアドレスの数以上のホストは外部にアクセスできません。

そこで、同一ホスト内の通信を区別しているポート番号も一緒に変換してやることで、 複数のホストが1つのIPアドレスで通信をできるようにしたのが、IP Masqueradeです。(Masqueradeとは仮装舞踏会のことらしい)
他にも呼び名はあってIP NAPT(Network Address Port Translation)、動的NATなどいろいろあります。
最近は先に説明したNATというものは、現在ではほとんど使われていないので、NATがIP Masqueradeと同じ意味で使われていたりもします。

この方法では、インターネット側からはルータしか見えません。 LAN内のホストが通信していても、それはルータが通信しているように見えるのです。
このため、インターネット側からはLAN内のホストに対して直接アクセスすることはできません
このことは、利点でもあり欠点でもあります。

IPマスカレードを有効にするには

では、IPマスカレードを使うにはどうしたらいいのでしょうか。
これにはまずIPフォワーディングが可能である必要があります。 IPフォワーディングとは、自分が受け取ったパケットが自分宛でなかったとき、それを転送する機能です。 これはマスカレードをするか否かに関係なくルータとして動作するのに必須の機能です。
これにはLinuxのカーネルが対応している必要があります。
これはカーネルのビルドのときに指定するのですが、Vine Linuxではデフォルトで組み込まれています。
/proc/sys/net/ip_forwardというファイル(本当はファイルではないんだけど)が存在すれば対応していると分かります。
ですが、これは通常、起動した時点ではまだ有効になっていません。
/proc/sys/net/ip_forwardの中身が0のとき無効、1のとき有効です。

# cat /proc/sys/net/ipv4/ip_forward
0
# echo 1 > /proc/sys/net/ipv4/ip_forward

このようにするとIPフォワーディングが有効になります。 ところが、これは再起動するとまた元に戻ってしまうため、毎回この作業をしないといけません。
これを自動で行ってくれるように、一般には/etc/rc.d/rc.local(起動時に実行される初期化スクリプトのうち最後に実行されるファイル) の最後に、上で示した「echo~」を追加します。

しかし、前回のrp-pppoeの設定でファイアウォールをMASQUERADEに設定しました。
このように設定したとき、ADSLの接続時に自動的に実行されるのが/etc/ppp/firewall-masqというファイルです。
このファイルを開いてみると、最後の行に「echo~」というものが書かれています。 ですから、よけいなことをしなくても、ADSLに接続すればIPフォワーディングが可能になります。
ファイアウォールの選択でMASQUERADE以外を選択した場合、 有効にするには前に書いたように/etc/rc.d/rc.localの最後に「echo~」という行を追加してください。

さて、IPフォワーディングが可能になった後どうすればよいかですが、それにはipchainsという機能を使います。 これはパケットフィルタリングも可能でファイアウォールの設定でも用います。
こいつの機能は、早い話パケットの性質から、その動作を振り分けることです。
マスカレードを行う設定で一番単純なのが/etc/ppp/firewall-masqの最後の方に書かれていますが、

ipchains -A forward -j MASQ

とします。つまりフォワーディングが必要なパケットはマスカレードせよという指定です。 ipchainsではパケットの種類に関して非常に細かな指定ができるので、 例えば~から来たパケットで~宛ならマスカレード、~から来た場合はそのままルーティングといった設定が可能です。 自分の環境に合わせた設定を行ってください。 詳しくは次回で説明します。

DNSの起動

次に、DNSを起動するように設定します。
LAN内のホストが直接ISPの指定したDNSに接続するようにしてもいいのですが、 LAN内のホスト名をDNSで解決したい場合は、自前サーバでDNSを立ち上げLAN内のホストはこれを参照するようにします。
DNSは自分の知らないアドレスを問い合わせられると上位のDNSに問い合わせるようになっていますので とりあえず、インターネット上のアドレス解決だけをしたい場合は特に何も設定する必要はありません。
既に、rp-pppoeの設定でDNSを指定してあるので上位DNSの指定も不要です。
ちゃんと指定してあるかどうか不安な場合は

# cat /etc/resolv.conf
nameserver <プライマリDNSのIPアドレス>
nameserver <セカンダリDNSのIPアドレス>

と表示されればOKです。

画面1:サービスの選択

起動時に自動的にDNSが立ち上がるように設定するには「ntsysv」というコマンドを使います。
画面1の中でnamedという項目を探してスペースキーで*をつけます。 これで次回から起動時に自動的にネームサーバーが起動します。
LAN内のホストの設定でDNSをこのサーバーのIPアドレスを指定するようにすれば完了です。

ちなみに、再起動せずにサービスを立ち上げるには、「service <サービス名> <指示>」という風にします。 <指示>としてはstart, stop, restartなどがあります。

# service named start
Starting named:                                            [  OK  ]

といった感じです。
これで、LAN内のホストから外部に接続する準備が整いました。 試しにブラウザで適当なサイトへいってみてちゃんと表示できるか確認します。

特殊プロトコル用モジュールの組み込み

さて、ここまでの設定で、ブラウジングぐらいなら使えるようになりました。 ところが、FTPサイトに接続してみるとエラーが出てしまいます。
実は、FTPなど一部のプロトコルはこちらからサーバに接続した後、 別のポートを使ってサーバからもこちらに接続してくる必要のあるものがあります。
こうなるとルータはサーバからの接続がLAN内のどのホスト向けの接続なのか、あるいは自分宛の接続なのか が分からないために通信が不能になってしまいます。
これを解決するためには、通信を監視してサーバからの接続を中継できるようにするモジュールを組み込みます。
このモジュールは/lib/modules/2.2.19-r0/ipv4/に入っています。

# ls /lib/modules/2.2.19-r0/ipv4/
ip_gre.o           ip_masq_mfw.o     ip_masq_vdolive.o  ip_vs_wlc.o
ip_masq_autofw.o   ip_masq_portfw.o  ip_vs_lblc.o       ip_vs_wrr.o
ip_masq_cuseeme.o  ip_masq_quake.o   ip_vs_lblcr.o      ipip.o
ip_masq_ftp.o      ip_masq_raudio.o  ip_vs_lc.o         rarp.o
ip_masq_irc.o      ip_masq_user.o    ip_vs_rr.o

「ip_masq_~」というのがそのモジュールです。
どのプロトコルに対応しているのかは名前を見れば分かります。 ip_masq_ftp.oはFTP、ip_masq_raudio.oはReal Playerと言った具合です。
必要のないモジュールを組み込んでも意味が無いのですが、 とりあえずすべてを組み込むようにします。
組み込むには「modprobe」というコマンドを使います。

modprobe ip_masq_autofw
modprobe ip_masq_cuseeme
modprobe ip_masq_ftp
modprobe ip_masq_irc
modprobe ip_masq_mfw
modprobe ip_masq_portfw
modprobe ip_masq_quake
modprobe ip_masq_raudio
modprobe ip_masq_user
modprobe ip_masq_vdolive

という内容を/etc/rc.d/rc.localの最後に追加しておきます。
ちなみに、組み込まれているモジュールを見るには、

# lsmod
Module                  Size  Used by
ip_masq_vdolive         1472   0  (unused)
ip_masq_user            2736   0  (unused)
ip_masq_raudio          3136   0  (unused)
ip_masq_quake           1488   0  (unused)
ip_masq_portfw          2688   0  (unused)
ip_masq_mfw             3248   0  (unused)
ip_masq_irc             2240   0  (unused)
ip_masq_ftp             3776   0  (unused)
ip_masq_cuseeme         1216   0  (unused)
ip_masq_autofw          2608   0  (unused)
ppp                    20240   2  (autoclean)
slhc                    4496   0  (autoclean) [ppp]
mousedev                3728   0  (unused)
hid                    11712   0  (unused)
input                   3104   0  [mousedev hid]
autofs                  9232   1  (autoclean)
viarhine               11488   2  (autoclean)

と、します。

さあ、これでLAN内部からの接続もほとんど不自由なくできる・・・はずですが、甘かった。
モジュールを組み込んでもFTPができないじゃないですか。
実は、これはファイアウォールの設定の問題なんです。
とりあえず今回はここまでで、次回はファイアウォールについて設定していきたいと思います。