IP Masquerade 環境下へ PPTP 接続を提供する
SERVER
PPTP を導入したのですが、IP Masquerade を通過できないことが発覚。
なので、GRE を MASQ するパッチを充ててみました。
PPTP と IP Masquerade
PPTP は、VPN (Virtual Private Network) を構成するためのプロトコルのひとつです。通信経路を暗号化することによって、相互の通信をより安全に行うことができます。
この PPTP という技術は、TCP パケットのほかに GRE パケットを利用します。
なので普通に Linux + IP Masquerade システムのようないわゆる NAT 変換を通して PPTP サーバへ接続しようとしても、GRE パケットを NAT 変換の対象にしていないためにつながらないということがあります。
今回は、カーネルを 2.2.20 にバージョンアップした Linux Sackware 7.0 に、IP Masquerade で PPTP を通過させるパッチを充ててみました。
VPN 用のパッチを充てる
Linux の IP Masquerade で VPN をサポートするためのパッチとして、ip_masq_vpn というのが、http://www.impsec.org/linux/masquerade/ というサイトで公開されています。
このパッチをダウンロードするわけなのですが、このパッチは Linux カーネルのソースファイルに充てる必要がありますので、カーネルソースのない人は、別途入手する必要があります。
カーネルソースは http://www.kernel.org/ あたりでダウンロードできます。
パッチはカーネルのバージョンによって違うので気をつけましょう。
2002.01.29 現在、カーネルバージョン 2.2.10 / 2.2.11 / 2.2.12 / 2.2.13 / 2.2.14 / 2.2.15 / 2.2.17 / 2.2.18 用があるようです。今回のカーネルは 2.2.20 ですけど、だめもとで 2.2.18 用のパッチを充ててみることにしました。
とりあえず、自分流(?)なパッチの充て方で話を進めていきます。
とりあえず、ソースファイルが変更になるので、次のようにして既存のカーネルソースの複製を作ります。なお、作業は /usr/src/ で行っています。
cp -rfd linux-2.2.20 linux-2.2.20-vpn
rm linux
ln -s /usr/src/linux-2.2.20-vpn linux
これでオリジナルのソースが複製できました。上の記載ではついでに linux のシンボリックリンクも張りなおしてます。
続いてパッチの入手です。http://www.impsec.org/linux/masquerade/ から適切なバージョンのカーネルパッチを入手します。
今回は 2.2.20 ですが、これ用のパッチがないので、中では一番新しい ip_masq_vpn-2.2.18.patch.gz 版を試してみようと思います。
パッチを入手したら、/usr/src ディレクトリ中にそれを持ってきて、次のようにしてパッチを充てます。なお、/usr/src/linux のソースへパッチが適用されるので気をつけましょう。
zcat ip_masq_vpn-2.2.18.patch.gz | patch -p0
表示されるメッセージの中に、Hunk #?? succeeded at ... みたいな感じで、とくにエラーっぽいことが書かれていないので多分、パッチは正常に充てたれたようです。
カーネルの再コンパイル
パッチが充てられたら、続いてカーネルの再コンパイルです。
いわば Linux の中枢を変更する作業なので失敗すると Linux の起動に失敗するといったこともありえます。とりあえず、気をつけましょうv
なので、慣れていない人は Virtual PC とか VMware とかで練習しておくのもいいかもしれませんね。
さて、/usr/src/linux にディレクトリを移行して、次のように入力してカーネルの設定メニューを表示させます。
make menuconfig
ここではすでに IP Masquerade が機能しているものとして話を進めていくことにします。
表示されたメニューの一番最初の項目 Code maturity level options ---> Prompt for development and/or incomplete code/drivers にチェックを入れます。
こうすることで、Networking options ---> IP: masquerading special modules support の中に、新しく VPN 系のオプションが表示されます。
今回の目的は PPTP の通過が目的なので、IP: PPTP masq support を組み込んで完了します。モジュールか組み込みかを選べますが、<M> ではなく <*> として組み込むことにしました。
一応まとめておくと、次のような設定を新たにしたことになります。
Code maturity level options --->
[*] Prompt for development and/or incomplete code/drivers
Networking options --->
[*] IP: masquerading special modules support
<*> IP: PPTP masq support
さあ、設定を保存してメニューを抜け出したら、カーネルの再コンパイルです。
メニュー終了時には make zImage か make zdisk か make zlilo かを実行せよと言われますが、念のためきれいにカーネルを作り直すことにします。
なお、PPTP masq support をモジュールで組み込んだ場合は、make modules modules_install といった作業も必要になってくると思われます。
make dep clean bzImage
さてこれで特にエラーがなければ、lilo に書き込みましょう。というかわざわざ分けなくてもいいのでしょうけど。
make bzlilo
これで再起動をかけて、正常に再起動ができれば、GRE パケットもちゃんと IP Masquerade を通過できるようになっていると思います。
もしかすると場合によっては、ipchains -A forward -p 47 -s 192.168.0.0/24 -j MASQ みたいな記述が必要かもしれません。
ちなみに 47 というのは GRE パケットのプロトコル番号です。