VPN技術の比較のページでもちょっとふれまし
たが、PPTPは、Point-to-Point Tunneling Protocolの略で、TCP/IP上にPPPコ
ネクションを張ってVPNをするというプロトコルです。
PPTPの利点として、IPSecなどはIPしか通しませんが、PPTPであればNetwareの
IPXなど、PPPを通すことのできるプロトコルなら何でも通せます。また、
Windowsで標準実装になっているので、PPTPサーバーさえ用意すれば気軽に出
先からVPN接続できるのも魅力でしょう。
ちょっと話がそれますが、PPTPプロトコルで使われる認証方法と暗号化につい て簡単に予習しておきましょう。
まず認証ですが、MS-CHAPもしくはMS-CHAP-v2が使われます。これらは、pppで 標準的なCHAP認証を拡張して、パスワード変更や暗号鍵の交換ができるように したものです。ただし、MS-CHAPについてはかなり容易にパスワードを盗める という問題があるため、使うべきではありません。
続いて、暗号化ですがPPTPではMPPE(Microsoft Point-to-Point Encryption) という方法を使っています。なかで使われている暗号アルゴリズムは、RC4(鍵 長40bitもしくは128bit, 以下MPPE-40/MPPE-128と表記)です。現在、 DES-56bitでも専用ICがあれば1日〜数日で解読できてしまいます。40bit 鍵で は、おおざっぱに見積もってもDES-56bitの1万分の1以下の時間で解読できて しまいます。見られてもかまわない通信以外は、MPPE-128を使うようにしましょ う。
Linuxのppp-2.4.2は、MS-CHAP/MS-CHAP-v2, MPPE-40/MPPE-128のどの組み合わ せでもサポートしていますが、上記のように安全に通信したければ、 MS-CHAP-v2とMPPE-128の組み合わせだけを使うようにしましょう。
暗号化が不要な場合は、このセクションを読み飛ばしてください。
PPTPでは、上記のようにMPPEという方法で暗号化を行っていますが、Linuxは 標準ではMPPEをサポートしていません。LinuxでMPPEを使った暗号通信をする 場合は、パッチをあててカーネルとpppパッケージの両方がMPPEに対応する必 要があります。
まず、pppパッケージですが、開発版のppp-2.4.2を取ってくるのが良いでしょ う。PPTP Clientのダウンロードセクションに、ppp-2.4.2があるので、それを取っ てきてインストールしてください。RPMが使えるなら、以下のようにして簡単 にインストールできます。
続いて、LinuxカーネルのMPPE対応ですが、上記のppp-2.4.2開発版の中に、 Linuxカーネルのパッチが含まれています。linux/mppeディレクトリ以下がそ れです。パッチ当ては以下のようにして行います。
おまけとして、ppp-2.4.2_cvs_20030610.tar.gzからカーネルパッチだけを抜
き出したものを以下に置いておきます。
linux-2.4.22とlinux-2.6.0-test5で動くことは確認しました。
カーネルにパッチを当てたら、カーネル設定の"Network Device support"以下にある、"PPP support", "PPP support for async serial ports", "PPP MPPE compression"の3つを 使うようにして、カーネルを作り直してください。
それから、pppをカーネル組み込みではなく、モジュールとした場合は、 /etc/modules.confに以下の行を書き込んでおきましょう。
LinuxからPPTPサーバーに接続するには、PPTP Clientを使います。 インストールは、PPTP Clientのダウン ロードセクションからRPMパッケージをとってきて、以下のようにするだ けです。
Debian GNU/Linuxを使っているなら、公式パッケージに含まれているので、以 下のようにしたら自動でインストールされます。
PPTPサーバーによっては、うまく接続できないことがあります。この場合、
PPTP ClientがWindows NT 4.0互換モードで接続するようにしてみてください。
pptp_options.hの中に"#define STANDARD"と書いて
コンパイルしなおします。めんどくさければ、NT 4.0互換モードで動くパッケー
ジを置いておくのでこれを持っていってください。
PPTP Clientは、pptp-commandを使って対話式で設定できるようになっていま す。/etc/ppp/peersディレクトリが無いと途中で怒られるので、先に作ってお くと良いでしょう。
最近は、pptp-php-gtkという、X Window System上で動く便利な設定ツールが あるので、こちらを使ってもいいでしょう。
前節で書いたように、安全に通信するために、MS-CHAP-v2とMPPE-128だけを許 可するようにしましょう。具体的には、/etc/ppp/options.pptpに以下を書き 足します。ppp-2.4.1以前とppp-2.4.2以降で、オプションが変わっているので 注意してください。
Linux上で動くPPTPサーバーとして、PoPToPがあります。インストールは、 RPMなら以下のようにします。
Debian GNU/Linuxなら、pptpdが公式パッケージに含まれているので、以下の ようにしてインストールできます。
PoPToPで設定しなければならないファイルは、/etc/pptpd.conf, /etc/ppp/options.pptpd, /etc/ppp/chap-secretsの3つです。PoPToPをインス トールすると、雛形ができているはずなので、それをいじればOKです。
書き換えなければならない部分は、"option
/etc/ppp/options.pptpd"の行のコメントを外すことと、
localip/remoteipの設定です。
localip/remoteipには、PPPの両端に割り振るIPを書きます。LANのサブネット
からいくつかを割り振ったらいいと思います。例えば、PPTPの接続を最大10箇
所から受け付けて、LAN側が192.168.1.0/24のネットワークを使っているなら、
pptpd.conf は以下のように書いたら良いでしょう。
localipは1つで済みますが、remoteipは接続を受け付けるクライアント数確保 しておかなければなりません。また、LAN内のコンピューターとIPが重なると 通信できないので、192.168.1.200〜192.168.1.210のIPをLANで使わないよう にしてください。
/etc/ppp/options.pptpdの設定は以下を参考にして行ってください。そのまま コピー&ペーストして、IPとサーバー名を書き換えるだけで使えると思い ます。
chap-secretsには、接続用のパスワードを書き込みます。4項目あって、左か
ら順に、ユーザー名/サーバー名/パスワード/接続元IP です。サーバー名は、
options.pptpdの"name pptp-server"で指定したものを書き込みま
す。接続元IPは、どこからでも接続するなら"*"にしておきます。
具体的に、ユーザー"bill"と"steve"がそれぞれパスワー
ド"hogehoge"と"foo"で接続する場合のchap-secretsを
以下にあげます。
外部からPPTP接続を受け付けるLinuxは、通常iptablesなどでパケットフィル ターの設定を行っていると思います。PPTPでは、TCPのポート1723と、GREプロ トコル(IPプロトコル47番)を使うため、これらのパケットを通すようにしなけ ればなりません。iptablesなら、以下のような感じで設定します。
Windows 98 SE以前のPPTPの実装は、標準ではMPPE-128をサポートしていませ
ん。そのため、上のようにMPPE-128しか受け付けないようにPoPToPを設定する
と、Windows 9xでは接続できないことがあります。
Windows 95/98でMPPE-128を使うために、ダ
イアルアップネットワーク 1.4 アップグレードをインストールする必要
があります。Windows 98版は、DUN-1.4
ダウンロードから取得できます。
某所で、PPTP接続が遅いという噂を聞いたので、試しにスループットを測って みました。テスト環境は、手持ちの2台のパソコンをスイッチングハブを介し て繋いでいるだけです。
| PPTPサーバー | PPTPクライアント | |
| テスト用PC | 自作(Duron 700MHz) | Libretto L5 (TM5800 800MHz) |
| NIC | Intel 82558B | Realtek RTL-8139C |
| OS | TurboLinux 8 WS (kernel 2.4.22) | Windows 98 SE |
| PPTP | pptpd-1.1.3 ppp-2.4.2 |
Windows 98 SE + DUN-1.4 |
| FTP | ProFTPD 1.2.7 | Windows 98 SE 付属のコマンドラインftp |
ftpにより、100MB(104857600 byte)のデーターを転送して、転送速度を測って みます。
| 暗号設定 | 転送方向 | 経過時間 | 転送速度 |
| MPPE-40 | サーバー -> クライアント | 509秒 | 1.6Mbps |
| MPPE-40 | クライアント -> サーバー | 1059秒 | 760kbps |
| MPPE-128 | サーバー -> クライアント | 512秒 | 1.6Mbps |
| MPPE-128 | クライアント -> サーバー | 1060秒 | 750bps |
あまりに遅すぎます。100MbpsのEthernetでkbpsってどういうことでしょう。
通信中、サーバー側はCPU負荷は10%未満です。それに対して、クライアント側
は、CPU負荷100%になっています。CPUの性能は若干(せいぜい2割ぐらい)クラ
イアント側が劣る程度でそんなに大差はないのですが。
最初、蟹さんNICに問題があるのかとも考えましたが、PPTPトンネルを通さな
ければ60Mbpsぐらいで通信できるため、そういう問題ではないようです。また、
ftpクライアントをMozillaに変えても通信速度はほとんど変わりませんでした。
Windows98のPPTP実装に問題があるような気がします。
Windows98の成績が悪いので、試しにLibretto L5でLinuxを起動して pptp-clientを使ったときも測ってみます。
| 暗号設定 | 転送方向 | 経過時間 | 転送速度 |
| MPPE-40 | サーバー -> クライアント | 73秒 | 11Mbps |
| MPPE-40 | クライアント -> サーバー | 40秒 | 20Mbps |
| MPPE-128 | サーバー -> クライアント | 74秒 | 11Mbps |
| MPPE-128 | クライアント -> サーバー | 43秒 | 19Mbps |
Linux+pptp-clientで測るとまともな速度になります。クライアント側のCPU負 荷は、受信時で90〜100%、送信時で60%ぐらいでした。
Windows 98のダメダメな結果に対し、NT系列のWindowsの性能をみてみるため に、Windows 2000とLinuxのPoPToPで転送速度を測ってみます。手持ちの環境 の都合で、サーバー側がLibrettoに、クライアント側が自作のDuron 700MHz 機へと入れ替わっています。
| PPTPサーバー | PPTPクライアント | |
| テスト用PC | Libretto L5 (TM5800 800MHz) | 自作(Duron 700MHz) |
| NIC | Realtek RTL-8139C | Intel 82558B |
| OS | TurboLinux 8 WS (kernel 2.4.21) | Windows 2000 SP2 |
| PPTP | pptpd-1.1.3 ppp-2.4.2 |
Windows 2000 SP2 |
| FTP | ProFTPD 1.2.7 | Windows 2000 付属のコマンドラインftp |
テスト結果は以下のようになりました。Windows 98 の10倍以上の速度がでま
す。いったいどうなっているんでしょう? ここまで差がでると、意図的に通
信速度を落としているのではないかと疑いたくなってしまいます。>>
Windows98
| 暗号設定 | 転送方向 | 経過時間 | 転送速度 |
| MPPE-40 | クライアント -> サーバー | 35秒 | 23Mbps |
| MPPE-40 | サーバー -> クライアント | 29秒 | 28Mbps |
| MPPE-128 | クライアント -> サーバー | 35秒 | 23Mbps |
| MPPE-128 | サーバー -> クライアント | 30秒 | 27Mbps |