LinuxでPPTPを使う

Contents


PPTPとは

VPN技術の比較のページでもちょっとふれまし たが、PPTPは、Point-to-Point Tunneling Protocolの略で、TCP/IP上にPPPコ ネクションを張ってVPNをするというプロトコルです。
PPTPの利点として、IPSecなどはIPしか通しませんが、PPTPであればNetwareの IPXなど、PPPを通すことのできるプロトコルなら何でも通せます。また、 Windowsで標準実装になっているので、PPTPサーバーさえ用意すれば気軽に出 先からVPN接続できるのも魅力でしょう。

PPTPの認証と暗号化

ちょっと話がそれますが、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の組み合わせだけを使うようにしましょう。


kernelとpppの準備

暗号化が不要な場合は、このセクションを読み飛ばしてください。

PPTPでは、上記のようにMPPEという方法で暗号化を行っていますが、Linuxは 標準ではMPPEをサポートしていません。LinuxでMPPEを使った暗号通信をする 場合は、パッチをあててカーネルとpppパッケージの両方がMPPEに対応する必 要があります。

まず、pppパッケージですが、開発版のppp-2.4.2を取ってくるのが良いでしょ う。PPTP Clientのダウンロードセクションに、ppp-2.4.2があるので、それを取っ てきてインストールしてください。RPMが使えるなら、以下のようにして簡単 にインストールできます。

# rpm -i ppp-2.4.2_cvs_20030610-1.i386.rpm

続いて、LinuxカーネルのMPPE対応ですが、上記のppp-2.4.2開発版の中に、 Linuxカーネルのパッチが含まれています。linux/mppeディレクトリ以下がそ れです。パッチ当ては以下のようにして行います。

# tar xfvz ppp-2.4.2_cvs_20030610.tar.gz
# cd ppp-2.4.2_cvs_20030610/linux/mppe
# sh mppeinstall.sh /usr/src/linux-2.4.22

おまけとして、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に以下の行を書き込んでおきましょう。

alias char-major-108 ppp
alias ppp ppp_generic
alias ppp-compress-18 ppp_mppe
alias ppp-compress-21 bsd_comp
alias ppp-compress-24 ppp_deflate
alias ppp-compress-26 ppp_deflate
alias tty-ldisc-3  ppp_async
alias tty-ldisc-13 n_hdlc
alias tty-ldisc-14 ppp_synctty

PPTP Clientを使う

PPTP Clientのインストール

LinuxからPPTPサーバーに接続するには、PPTP Clientを使います。 インストールは、PPTP Clientのダウン ロードセクションからRPMパッケージをとってきて、以下のようにするだ けです。

# rpm -i pptp-linux-1.3.1-1.i386.rpm

Debian GNU/Linuxを使っているなら、公式パッケージに含まれているので、以 下のようにしたら自動でインストールされます。

# apt-get install pptp-linux

PPTPサーバーによっては、うまく接続できないことがあります。この場合、 PPTP ClientがWindows NT 4.0互換モードで接続するようにしてみてください。 pptp_options.hの中に"#define STANDARD"と書いて コンパイルしなおします。めんどくさければ、NT 4.0互換モードで動くパッケー ジを置いておくのでこれを持っていってください。

PPTP Clientの設定

PPTP Clientは、pptp-commandを使って対話式で設定できるようになっていま す。/etc/ppp/peersディレクトリが無いと途中で怒られるので、先に作ってお くと良いでしょう。

# mkdir /etc/ppp/peers
# pptp-command

最近は、pptp-php-gtkという、X Window System上で動く便利な設定ツールが あるので、こちらを使ってもいいでしょう。

前節で書いたように、安全に通信するために、MS-CHAP-v2とMPPE-128だけを許 可するようにしましょう。具体的には、/etc/ppp/options.pptpに以下を書き 足します。ppp-2.4.1以前とppp-2.4.2以降で、オプションが変わっているので 注意してください。

refuse-mschap
require-mppe-128

PoPToP(PPTP server)を使う

PoPToPのインストール

Linux上で動くPPTPサーバーとして、PoPToPがあります。インストールは、 RPMなら以下のようにします。

# rpm -i pptpd-1.1.3-4.i386.rpm

Debian GNU/Linuxなら、pptpdが公式パッケージに含まれているので、以下の ようにしてインストールできます。

# apt-get install pptpd

PoPToPの設定

PoPToPで設定しなければならないファイルは、/etc/pptpd.conf, /etc/ppp/options.pptpd, /etc/ppp/chap-secretsの3つです。PoPToPをインス トールすると、雛形ができているはずなので、それをいじればOKです。

/etc/pptpd.confの設定

書き換えなければならない部分は、"option /etc/ppp/options.pptpd"の行のコメントを外すことと、 localip/remoteipの設定です。
localip/remoteipには、PPPの両端に割り振るIPを書きます。LANのサブネット からいくつかを割り振ったらいいと思います。例えば、PPTPの接続を最大10箇 所から受け付けて、LAN側が192.168.1.0/24のネットワークを使っているなら、 pptpd.conf は以下のように書いたら良いでしょう。

option /etc/ppp/options.pptpd
localip  192.168.1.200
remoteip 192.168.1.201-210

localipは1つで済みますが、remoteipは接続を受け付けるクライアント数確保 しておかなければなりません。また、LAN内のコンピューターとIPが重なると 通信できないので、192.168.1.200〜192.168.1.210のIPをLANで使わないよう にしてください。

/etc/ppp/options.pptpdの設定

/etc/ppp/options.pptpdの設定は以下を参考にして行ってください。そのまま コピー&ペーストして、IPとサーバー名を書き換えるだけで使えると思い ます。

#
lock
# debug

# PPTPサーバー名の設定
name pptp-server
domain example.com

# nodefaultrouteを書かないと、インターネット宛パケットを
# PPTP接続に投げてしまう
nodefaultroute

# pptpd.confのlocalip/remoteipに書いたIPが
# LAN側のサブネットに含まれる場合に必要
proxyarp

# 認証と暗号化の設定
auth
refuse-mschap
require-mschap-v2
require-mppe-128

# LAN側にあるDNSとWINSサーバーのIPを指定する
# DNSやWINSが無ければコメントアウトする
ms-dns  192.168.1.1
ms-wins 192.168.1.1

/etc/ppp/chap-secretsの設定

chap-secretsには、接続用のパスワードを書き込みます。4項目あって、左か ら順に、ユーザー名/サーバー名/パスワード/接続元IP です。サーバー名は、 options.pptpdの"name pptp-server"で指定したものを書き込みま す。接続元IPは、どこからでも接続するなら"*"にしておきます。
具体的に、ユーザー"bill"と"steve"がそれぞれパスワー ド"hogehoge"と"foo"で接続する場合のchap-secretsを 以下にあげます。

# Secrets for authentication using CHAP
# client server       secret      IP addresses
bill     pptp-server  "hogehoge"  *
steve    pptp-server  "foo"       *

パケットフィルターの設定

外部からPPTP接続を受け付けるLinuxは、通常iptablesなどでパケットフィル ターの設定を行っていると思います。PPTPでは、TCPのポート1723と、GREプロ トコル(IPプロトコル47番)を使うため、これらのパケットを通すようにしなけ ればなりません。iptablesなら、以下のような感じで設定します。

# iptables -A INPUT -p tcp --dport 1723 -j ACCEPT
# iptables -A INPUT -p 47 -j ACCEPT

WindowsのPPTP

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)
NICIntel 82558BRealtek 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)のデーターを転送して、転送速度を測って みます。

Windows 98とLinux

暗号設定転送方向経過時間転送速度
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実装に問題があるような気がします。

LinuxとLinux

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 2000とLinux

Windows 98のダメダメな結果に対し、NT系列のWindowsの性能をみてみるため に、Windows 2000とLinuxのPoPToPで転送速度を測ってみます。手持ちの環境 の都合で、サーバー側がLibrettoに、クライアント側が自作のDuron 700MHz 機へと入れ替わっています。

PPTPサーバーPPTPクライアント
テスト用PC Libretto L5 (TM5800 800MHz) 自作(Duron 700MHz)
NICRealtek RTL-8139CIntel 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

ご意見、ご感想は、小本 真広 <webmaster@komoto.org>まで。メールする前にtop pageの注意書を読んでください。