OpenBlockS266 を PPTP サーバとして利用する

1. 必要なものリスト

一般に Linux を PPTP サーバとして利用するには以下のものが必要です。

  1. MPPE パッチを当てた Linux カーネル (2.6.16以降はパッチの必要なし)
  2. PPTP サーバ (PoPToP)
  3. PPP サーバ (pppd)

1. の MPPE パッチを当てなくても PPTP 自体は利用できますが、 MS-CHAPv2 (認証方式) や MPPE-128bit (暗号化方式) が使えないので、 セキュリティ的に問題があります。

2. Linux カーネルの再構築

※注意:
以下の内容は SSD/Linux 0.3 以前のカーネル (2.4.x, 2.6.12) を利用する場合のものです。最新の SSD/Linux 0.4 ではカーネルが 2.6.16 になっており、カーネルコンフィグも MPPE が有効になっているので 特にこの項目を実行する必要はありません。

OpenBlockS の Linux カーネルにパッチを当てる方法としてはいくつか考えられますが、 i386 版 SSD/Linux で PowerPC 用 SSD/Linux をクロスビルドし、 その途中で MPPE パッチを当てておくのが最も楽だと思います。

別紙「OpenBlockSをほげってみる」 のとおりにクロスビルド環境を整えた上、以下の2つのパッチを入手します。

  1. カーネルに対する MPPE 機能追加パッチ ( 2.4.26用 | 2.6.12用 )
  2. SSD/Linux ソースツリーに対するパッチ

1. の MPPE 機能追加パッチのうち、2.4.26 用のものは Debian GNU/Linux の kernel-patch-mppe パッケージから取り出したパッチを私が SSD/Linux のカーネルソースツリーに 適用して、.rej が出たところは手で編集したものです。 2.6.12 用のものは kernel-patch-mppe パッケージに入っているものそのままです。 SSD/Linux のバージョンが 0.3 なら 2.4.26 用を、0.4 なら 2.6.12 用を使ってください。 このパッチは SSD/Linux ソースツリーのカーネルパッチの置き場所 (/usr/src/mkdist/kernel/2.x.x) に置きます。

client$ wget http://www.luna2.org/~yatt/dist/linux-2.4.26-mppe-20060204.patch
client$ wget http://www.luna2.org/~yatt/dist/linux-2.6.4-mppe-20040216.patch
client$ scp linux-2.4.26-mppe-20060204.patch root@ssdlinux:
client$ scp linux-2.6.4-mppe-20060216.patch root@ssdlinux:

ssdlinux# mv ~/linux-2.4.26-mppe-20060204.patch /usr/src/mkdist/kernel/2.4.26
ssdlinux# mv ~/linux-2.6.4-mppe-20040216.patch /usr/src/mkdist/kernel/2.6.12

2. のパッチは SSD/Linux のソースツリーに当てます。 中身は Makefile.inc と .config に MPPE 関係の行を付け加えて 1. のパッチを有効にするものです。

client$ wget http://www.luna2.org/~yatt/dist/ssdlinux-mppe.diff
client$ scp ssdlinux-mppe.diff root@ssdlinux:

ssdlinux# cd /
ssdlinux# patch -p0 < ~/ssdlinux-mppe.diff

ソースツリーを cvs update した場合はこのパッチの内容が消えるので、 パッチを再適用してください。

あとは bmake build するだけです。 途中、MPPE を有効にするかどうか質問されますので y と答えてください。

ssdlinux# cd /usr/src
ssdlinux# bmake CROSS_BUILD=powerpc OPENBLOCKS=obs266 DESTDIR=/home/dest build
(略)
  PPP MPPE compression (encryption) (CONFIG_PPP_MPPE) [N/y/m/?] (NEW) y
(略)
ssdlinux# cd distrib
ssdlinux# bmake CROSS_BUILD=powerpc OPENBLOCKS=obs266 DESTDIR=/home/dest bootfs
ssdlinux# cd powerpc-obs2xx/product/treeboot
ssdlinux# scp zImage.initrd.treeboot-product root@obs266:

obs266# flashcfg -f zImage.initrd.treeboot-product

3. PPTP/PPP サーバの用意

私の OpenBlockS 箱は Debian GNU/Linux 3.1 (sarge) をインストールした状態で常用しているので、 PPP サーバ (パッケージ名 ppp) は既にインストールされていました。 バージョンも 2.4.3-20050321 で、MPPE-128bit に対応済みです。

PPTP サーバのほうもパッケージでインストールするだけで OK です。

obs266# apt-get install pptpd

PPTP サーバの設定は以下のようにします。

obs266# vi /etc/pptpd.conf
option /etc/ppp/pptpd-options
logwtmp
localip 192.168.1.254
remoteip 192.168.1.244-253

localip は PPTP サーバ側の ppp0 インターフェイスに振る IP アドレスを 指定します。 普通は LAN 内のアドレス体系のうちの一つを振れば OK でしょう。 LAN 側インターフェイス (eth0) と同じ IP アドレスを振っても問題なく動作するようです。

remoteip は PPTP クライアントに振るアドレスです。 同時接続を許可する数の分だけ IP アドレスを確保しておきます。

PPTP サーバから呼ばれたときの PPP サーバの動作設定は以下のようにします。

obs266# vi /etc/ppp/pptpd-options
name pptpd
refuse-pap
refuse-chap
refuse-mschap
require-mschap-v2
require-mppe-128
ms-dns 192.168.1.13
proxyarp
nodefaultroute
lock
nobsdcomp

PAP、CHAP、MS-CHAP は全て拒否、MS-CHAPv2 と MPPE128 でしか接続できないように設定します。 name 行は chap-secrets ファイルで利用するためのネームタグです。 適当に設定して OK。

PPP のユーザとパスワードを設定して準備完了です。

obs266# vi /etc/ppp/chap-secrets
user1           pptpd   "hogehoge"              *

ユーザ名 user1、パスワード hogehoge でログインします。 第2フィールドの pptpd は /etc/ppp/pptpd-options の name 行で設定したものを書きます。

4. Windows クライアントの設定

1. クライアント動作条件

Windows 2000/XP には標準で PPTP クライアント機能が搭載されているので、 それを利用します (ただし Windows 2000 は SP2/暗号化アップグレード以上で 128bit 鍵長に対応とのこと)。

以下の記述では Windows XP SP2 を例にしています。

2. 設定手順

「ネットワーク接続」ウインドウを開き、左の「新しい接続を作成する」 または「ファイル」メニューから「新しい接続(N)...」を選択します。

ネットワーク接続

「新しい接続ウィザード」が開きます。

新しい接続ウィザード

「次へ」を選択して進むと、接続の種類の選択画面になります。 「職場のネットワークへ接続する」を選択して「次へ」。

接続の種類の選択

ダイヤルアップか VPN かを選択します。 「仮想プライベート ネットワーク接続(V)」を選択して「次へ」。

VPN の選択

接続の名前を決定します。例では「自宅」となっていますが 何でも良いです。適当に決めて「次へ」。

接続名の設定

Linux PPTP サーバのグローバル IP アドレスを指定します。

VPNサーバの選択

以上で接続の作成は終了です。「完了」をクリックします。

完了

ウィザードが閉じられて接続ダイアログが表示されますので、 サーバで設定したユーザ名とパスワードを入力してください。 サーバ側の設定により、認証と暗号化は自動的に「MS-CHAPv2・MPPE128」 が選ばれるはずですが、クライアント側でも指定するならば「プロパティ」 を開きます (そのまま「接続」しても OK)。

接続画面

接続のプロパティを開き、「セキュリティ」タブを選択します。 デフォルトでは「セキュリティで保護されたパスワードが必要」 なので CHAP 以上の認証方式を使い、「データの暗号化を必ず要求する」 にチェックがついていないので、 暗号化を使うかどうかはネゴシエーション次第になります (サーバ側で MS-CHAPv2 と MPPE128 しか許可していないので、これでも 問題ありません)。

接続のプロパティ

あえて手動で設定するなら下の「詳細 (カスタム設定)(D)」を選択して 「設定」ボタンを押します。

セキュリティタブ

上のメニューでは「最強の暗号化」を選択し、下の認証方式では 「Microsoft CHAP Version 2」だけにチェックをつけます。 これでクライアント側でも強制的に MS-CHAPv2 と MPPE128 を使用するようになります。

セキュリティの詳細設定

接続画面に戻って、「接続」ボタンを押すと PPTP サーバに接続しに行きます。 以下のようなダイアログが出た後、認証とネゴシエーションに成功すれば タスクトレイにアイコンが出て、接続完了です。

認証中画面

現在の接続状態を確認するには、 タスクトレイのアイコンを右クリックしてメニューから「状態」を選び、 状態プロパティ画面を出します。

タスクトレイアイコン

「詳細」タブをクリックすると現在の認証と暗号化方式が確認できます。

接続の詳細

5. その他の設定

1. ファイアウォールの設定

PPTP で利用するポートは TCP/1723 番と GRE (IP プロトコル番号 47) です。 この2つの通信が Linux PPTP サーバまで届くようにファイアウォールを 設定しておく必要があります。 私の場合は Linux PPTP サーバ自身が自宅のルータ/FWを兼ねていますので、 WAN 側インターフェイスからそれらのプロトコルを受けられるようにすることに なります。

# vi /var/lib/iptables/active
    (以下の4行を追加)
-A INPUT -d a.b.c.d -i eth1 -p tcp -m tcp --dport 1723 -j ACCEPT
-A INPUT -d a.b.c.d -i eth1 -p gre -j ACCEPT
-A INPUT -i ppp0 -j ACCEPT
-A FORWARD -i ppp0 -j ACCEPT

a.b.c.d は WAN 側グローバルアドレスです。

INPUT チェインのデフォルトを DROP にしているなら、PPTP の使う仮想インターフェイス ppp0 からの INPUT も開けてやらねばなりませんので、上の3行目が必要です。 同様に、FORWARD チェインのデフォルトが DROP なら、 上記の4行目が必要です。

2. クライアントのルーティング設定

クライアントの PPTP 接続を普通に作成すると、 実際に PPTP 接続したときにデフォルトゲートウェイが PPTP サーバになります。

C:\Documents and Settings\yatt>netstat -rn
Active Routes:
Network Destination        Netmask          Gateway       Interface  Metric
           0.0.0.0          0.0.0.0  192.168.100.250 192.168.100.202     30
           0.0.0.0          0.0.0.0    192.168.1.244   192.168.1.244      1
         127.0.0.0        255.0.0.0        127.0.0.1       127.0.0.1      1
     192.168.1.244  255.255.255.255        127.0.0.1       127.0.0.1     50
     192.168.1.255  255.255.255.255    192.168.1.244   192.168.0.244     50
         224.0.0.0        240.0.0.0    192.168.1.244   192.168.1.244     50
         224.0.0.0        240.0.0.0  192.168.100.202 192.168.100.202     30
(略)

ルーティング表示の1行目が最初からあるデフォルトゲートウェイです。 それよりも優先度の高い (メトリック値の低い) デフォルトゲートウェイが 2行目にできてしまったために、あらゆる通信が PPTP トンネル側へ 入っていってしまいます。

すべて自宅経由にするならこれでも良いのですが、私は

という形態にしたいと思います。 そのためには、クライアントの接続設定を少し変更します。 まずはタスクトレイのアイコンから接続のプロパティを開いて、 「ネットワーク」タブを選択してください。

ネットワークタブ

この中の「インターネット プロトコル (TCP/IP)」を選択し、 「プロパティ」を押します。

TCP/IP のプロパティ

「インターネット プロトコル (TCP/IP) のプロパティ」が開きますので、 「詳細設定(V)...」ボタンを押します。

TCP/IP 詳細設定

「全般」タブを選択し、 「リモート ネットワークでデフォルト ゲートウェイを使う(U)」 のチェックボックスを外します。 これで VPN トンネル方向にはデフォルトゲートウェイが作成されなくなります。 あとは「OK」を押してプロパティを閉じてください。

以上の設定を終えた後、ルートテーブルを見ると以下のようになります。

C:\Documents and Settings\yatt>netstat -rn
Active Routes:
Network Destination        Netmask          Gateway       Interface  Metric
           0.0.0.0          0.0.0.0  192.168.100.250 192.168.100.202     30
         127.0.0.0        255.0.0.0        127.0.0.1       127.0.0.1      1
       192.168.1.0    255.255.255.0    192.168.1.244   192.168.1.244      1
     192.168.1.244  255.255.255.255        127.0.0.1       127.0.0.1     50
     192.168.1.255  255.255.255.255    192.168.1.244   192.168.0.244     50
         224.0.0.0        240.0.0.0    192.168.1.244   192.168.1.244     50
         224.0.0.0        240.0.0.0  192.168.100.202 192.168.100.202     30
(略)

ご覧のように、デフォルトゲートウェイはローカルネットワークへの1つだけで、 トンネル方向には作成されていません。 3行目に自宅ネットワーク (192.168.1.0/24) へのスタティックルートが 作られているので、自宅へは問題なく接続できます。

最終的に出来上がったネットワーク構成は以下のようなものです。

ネットワーク構成図

5. PPTP 関連リンク

とりあえず Google の網で引っかかった参考文献をリストアップ。 ほかにもぐぐれば色々見つかります。

PPTP 一般・プロトコル仕様についての知識

Linux で PPTP サーバを構築するのに参考になるサイト

Misc 階層に戻る  |  ホームに戻る

Last modified: Fri Sep 14 11:26:06 JST 2007
You are the 140003rd visitor.