LinuxにおけるPPTPサーバ
PPTPプロトコルは,いわばPPPのイーサネット版と位置づけられるものだ。このため,最近ではADSLで広く利用されているプロトコル「PPPoE」に近い構造である。この記事では,Linux用のPPTPサーバデーモンソフトとして「PopTop」を紹介する。
仕組みについてさらに詳細に触れよう。PPTPでは,認証や暗号化をPPPレイヤーに任せられている。そのため,暗号化方式(接続手段)についてはPPPで定められたものを利用することになる。
Windowsでは,PPTP接続を行うための手段が「仮想プライベートネットワーク」と称されており,このPPTPでは「MS-CHAPv2」と呼ばれる暗号化方式が使われている。そのため,Linuxで構築されたPPTPサーバにWindowsから接続できるようにするためには,PPTPサーバがMS-CHAPv2方式に対応していなければならない。
実は,現在公開されているほとんどのディストリビューションのLinuxカーネルは,標準でMS-CHAPv2がサポートされていない。そのため,カーネルにMS-CHAPv2対応パッチを適用し再構築する必要がある。また,PPTPはPPPのモジュールを使って認証するため,PPPのデーモン(pppd)もアップデートしなければならない。この点がハードルを高くするものだろうが,この記事ではなるべく順を追って解説しているつもりだ。
これから解説する手順について概要を挙げておこう。
1. カーネルにパッチを適用する
カーネル再構築を行い,MS-CHAPv2に対応するパッチを適用する。
2. PPPをアップデートする
PPPをアップデートしMS-CHAPv2に対応できるようにする。
3. PPTPサーバのインストール
PPTPサーバのプログラム(今回はPopTop)をインストールする。
特に「1.」に挙げたカーネルに対するパッチと再構築がもっとも手間な作業だろう。脅かすわけではないが,カーネルの再構築を誤ると二度とLinuxが起動しなくなってしまう可能性がある。そのため,カーネル再構築については十分に注意をしてほしい。
また,カーネルにパッチを当てるということから、カーネルがレッドハットなどのディストリビュータから配布される純正なものではなくなる点に注意したい(オープンソースのため純正と表現するのは正しくないが)。もしかするとカーネルにパッチを当てることによって,一部の機能が誤動作する可能性も否定できない(可能性は極めて低いが)。
このため基幹で利用しているものをPPTPサーバとして機能させるのは,筆者としては推奨できない。まずは他のサーバにインストールして様子を見るか,場合によってはPPTP専用のサーバをもう1台構築したほうがよいかもしれない。
MS-CHAPv2対応のカーネルパッチを適用する
実際の作業に移ろう。まずはカーネルにパッチを当てて再構築をする。まずは,万が一の事態を想定し,緊急起動用のフロッピーディスクを作っておこう(参考Tips「起動用のフロッピーを作成したい」)。
カーネル再構築が始めてという人は,まず最初にレッドハットのサイト上で公開されている「Red Hat Linux 7.2 オフィシャル Red Hat Linuxカスタマイズガイド」の「23章 カーネルのアップグレード」や「24章 カーネルモジュール」,そして「付録A カスタムカーネルの構築」が,とても参考になるだろう。
Red Hat Linux 7.2では2.4.16用のパッチが使える
まずは,カーネルに当てるパッチをダウンロードしよう。カーネルに当てるパッチは,http://planetmirror.com/pub/mppe/で手に入る。
カーネルへのパッチは,次の3つのうちのいずれかだ。利用しているカーネルのバージョンによって,どのパッチを適用するかを選択する。
- linux-2.4.0-openssl-0.9.6-mppe.patch.gz
- linux-2.4.16-openssl-0.9.6b-mppe.patch.gz
- linux-2.4.4-openssl-0.9.6a-mppe.patch.gz
Red Hat Linux 7.2の場合には,公式なカーネル最新バージョンが2.4.10なので合致するパッチが存在しない。しかし,2.4.16用のlinux-2.4.16-openssl-0.9.6b-mppe.patch.gzを利用すれば問題ない。また,2002年5月現在最新のカーネル2.4.18-3(Red Hat Linux 7.3)でもパッチを当てることができた。
まずはカレントディレクトリをLinuxカーネルのソースファイルが置かれているディレクトリに移動する。
# cd /usr/src/linux-2.4
※ linux-2.4 -> linux-2.4.10-xなどとシンボリックリンクされている場合
ちなみにLinuxのインストール時にカーネルのソースファイルをインストールしなかった場合には,/usr/src/linux-2.4/ディレクトリ下にカーネルのソースファイルが無い可能性がある。その場合には,インストールCDからカーネルソースファイルのRPMをインストールしよう(kernel-source-xxxx.i386.rpmなどとファイル名に「source」が含まれているもの)。
具体的な方法は,カーネルのソースファイルのインストールについては,Red Hat Linux 7.2: オフィシャル Red Hat Linuxカスタマイズガイドの「第23章 カーネルのアップグレード」を参照してほしい。
カレントディレクトリを移動したならば,次のようにしてダウンロードしたパッチを適用する(実際には,linux-2.4.16-openssl-0.9.6b-mppe.patch.gzは,ダウンロードしたディレクトリ名も含めて指定することになる)。
# cd /usr/src/linux-2.4
# wget http://planetmirror.com/pub/mppe/linux-2.4.16-openssl-0.9.6b-mppe.patch.gz
# zcat linux-2.4.16-openssl-0.9.6b-mppe.patch.gz | patch -p1
パッチが適用されると,途中には次のように問われる。これは両者とも「n」と答えれば問題ない。
patching file drivers/net/Makefile
Hunk #1 succeeded at 131 (offset 1 line).
The next patch would create the file drivers/net/Makefile.orig,
which already exists! Assume -R? [n] n
Apply anyway? [n] n
次のようにパッチが適用されたことが表示される。
Skipping patch.
1 out of 1 hunk ignored -- saving rejects to file drivers/net/Makefile.orig.rej
patching file drivers/net/md32_common.h
patching file drivers/net/mppe.h
patching file drivers/net/ppp_generic.c
patching file drivers/net/ppp_mppe.c
patching file drivers/net/rc4_enc.c
patching file drivers/net/rc4_locl.h
patching file drivers/net/rc4_skey.c
patching file drivers/net/sha1dgst.c
patching file drivers/net/sha_locl.h
patching file include/linux/ppp-comp.h
patching file include/openssl/opensslconf.h
patching file include/openssl/opensslv.h
patching file include/openssl/rc4.h
patching file include/openssl/sha.h
カーネルの再構築
続いてパッチを適用したカーネルを使い,再構築の作業に移る。
カーネルの再構築手順と再構築におけるオプション設定の意味については,Linux How-To「カーネル2.4アップグレードガイド」を参照にしてほしい。ここでは,最低限必要な説明のみを解説している。
これまでにいちどもカーネルを再構築したことがないのであれば,次のようにmake oldconfigを実行しておこう。
# make oldconfig
make oldconfigを実行すると,カーネルの再構築オプションがRed Hat Linuxのインストール時の設定と同じにリセットされる。
続けて必要に応じて「make config」,「make menuconfig」,「make xconfig」のいずれかを実行してカーネルオプションを設定していく(Linux Tips「カーネル再構築を行うmake方法はどれが最適なのか?」を参照)。
# make menuconfig
この際,PPTPはPPPのバイナリを利用するため予めPPP関連のモジュールが含まれていなければならない。make oldconfigを実行した場合には,PPP関連はモジュールとして組み込まれるようになっているはずだが念のため確認しておこう。
PPP関連の設定は,「Network device support --->」の下に表示されているので,「PPP(point-to-point ptorocol) support」の部分を選択してモジュールとして組み込むよう設定する(Fig.2)。
以上の指定を終えたらカーネル再構築を実行する。一連の手順は次の通りだ。
# make dep; make clean; make bzImage
さらに,次のようにモジュールも再構築してインストールする必要がある。
# make modules; make modules_install
もしも構築している環境がSCSIディスクを利用しており,且つSCSIディスク上にルートパーティションが存在するのであれば,この後に「mkinitrd」コマンドを使って「initrd」ファイルを作成する必要がある。ここでは省略させていただく。
最後に,次のようにしてカーネルを作成する。通常であれば,現在のカーネルをバックアップするなどを考えたいが,ここでのパッチを適用したものは,後述するように「custom」とファイル名に付加された状態で生成されるため安心してほしい。
# make install
Red Hat Linux 7.2以降では,ブートローダにLILOではなくGRUBを利用している。このため,make installを実行すると,lilo.confファイルが存在しないというエラーが表示されるが無視して構わない。
コマンド実行後は,/bootディレクトリに「vmlinuz-[バージョン番号]custom」と付けられたファイルが作成されているはずだ。例えば,バージョン番号が2.4.7-10であれば,vmlinuz-2.4.7-10customというファイル名になる(ちなみにカーネルのバージョンは,uname -rとしても確認ができる)。
次に,この作成したカーネルから起動できるようにGRUBの設定を変更しよう。
GRUBについての詳細は,Linux How-To「GRUBによるブートのカスタマイズ」を参考にしてほしいが,すぐに進めたいならば,/boot/grub/menu.lst(/etc/grub.conf)ファイルの末尾に次のように書き加えればよい。ただし,カーネルバージョン,ハードディスクのパーティション指定などは,環境によって異なるので適時読み替えてほしい。
判断するには,現在使用されているカーネルの記述を探し「custom」だけを付け足した組み合わせにすればよいだろう。もし失敗しても元のカーネルが保存されているため,心配することはない。
title Red Hat Linux MS-CHAPV2 Support
root (hd0,0)
kernel /vmlinuz-2.4.7-10custom ro root=/dev/hda2
以上でカーネル再構築設定が完了だ。ここでひとまず再起動をしてみよう。
# reboot
再起動時には,GRUBの表示でFig.3のようにmenu.lstファイルに書き加えた項目――Red Hat Linux MS-CHAPV2 Support――が表示されているはずだ。これをカーソルキーで選択して起動すれば,パッチ適用されたカーネルで起動することができる。