2013年9月10日

PPTPD VPNサーバを走らせる

最近ハマっているVPNプロジェクトの中でPPTPサーバを走らせてみたが、巷の情報と実際が食い違ったり、よそ様の情報では不明瞭だった事柄が見つかったので書いてみる。
 

その1:PPPD

LinuxのPPTPやIPSecのようなVPNプロトコルの実装は、プロトコル独自の通信レイヤと、複数の異なるVPNプロトコルに共通の仮想ネットワークインタフェースレイヤが明確に分離していて、この共通部分はPPPD(Point-to-Point Protocol)というデーモンで実現される。PPPDはPPTPD(サーバ側)/PPTP(クライアント側)やIPSecといった「プロトコルプロセッサ」から起動され、ユーザが直接起動することはない。
 
ところで、実際にPPTPDを走らせる前にいろいろなサイトで情報を事前チェックしてみると、PPTPDが立ち上がるとすぐにPPPDが起動され仮想ネットワークインタフェースとしてppp+が作成されるようなことが書いてあったにもかかわらず、実際にPPTPDを走らせてみるとPPPDは起動されずppp+も作成されない。さては何かまずい設定か、といろいろなサイトと/etc/pptpd.conf/etc/ppp/options.pptpdの比較をしてみるが、問題は見つからない。PPTPDを起動するときにstraceで追っかけるが、PPPDの起動に失敗した形跡はなく、むしろPPPDなんか起動するつもりがなさそうな形跡だけが目につく。しかも、PPTPDはPPPDなしでそ知らぬ顔でデーモンとしてふんぞり返っている。
 
こういうミステリアスな状態にすっかり混乱し、LinuxQuestions.orgに質問を投げたりもしてみたが有益な情報は得られなかった。
 
ふと思い立って、PPTPDだけが走りPPPDのない状態でクライアントから接続を試みたら、ビックリ仰天!他にも問題があってこの時点でのVPN接続は最終的には失敗するも、サーバ側では接続の試行中にPPPDが走り、ppp+もIPアドレスこそ与えられていないが作成されているではないか!
 
PPTPD(そしてIPSecも)では、サーバデーモン起動時にはPPPD(およびppp+)は起動されず、クライアントから接続要求があったときにオンデマンドで動的に起動・作成されることが分かった。
 

その2:パケットフィルタリング

これは完全に私のチョンボだが、PPTPで開放しなければならないのはGREプロトコル(47)とTCPのPPTPポート(1723)。UDPを使ったOpenVPNのつもりでUDPを開いていたら最初のLCPのハンドシェークで失敗していた。
 

その3:options.pptpd

PPPDに様々なオプションを渡すために、/etc/pptpd.confに「option /etc/ppp/options.pptpd」というコマンドを書くようになっており、そのコメントには「指定省略時には/etc/ppp/optionsが使われる」と書いてある。これは正しくない、あるいは少なくとも正確ではない。PPPDには、「option」で指定したオプションファイルに加え、常に/etc/ppp/optionsのオプションファイルが渡される/etc/ppp/optionsはPPPDの共通オプションファイルで、VPNのプロトコルやサーバかクライアントかに関わらず常にPPPDに渡されるから、内容は真に共通な最小限にするか、または/etc/ppp/optionsが存在しないほうがよい。インストール時のデフォルトの/etc/ppp/optionsの内容は「Lock」の一行のみ。
 

この、PPPDがプロトコルやクライアント・サーバを区別しない(と言うより区別できない)問題はip-up.localip-down.localにも共通するから、PPPDを使う複数のVPNプロトコルやクライアントとサーバを同時に走らせるシステムでは適切な対応が必要。具体的には、これらのスクリプトは以下のような引数で起動されるので、(必要なら)それらで区別する。
  • PPTP(クライアント): インタフェース名(ppp+) pty名(pts+) ボーレート(38400) ローカル(クライアント側)エンドポイントアドレス リモート(サーバ側)エンドポイントアドレス
  • PPTPD(サーバ): インタフェース名(ppp+) pty名(pts+) ボーレート(38400) ローカル(サーバ側)エンドポイントアドレス リモート(クライアント側)エンドポイントアドレス クライアントの物理IPアドレス
PPTPDは6番目の引数としてクライアントの物理IPアドレス(正確にはVPNが走る下位ネットワークのIPアドレス)が追加される。インタフェース名は動的に割り当てられるので、これをプロトコルやクライアント/サーバの識別に使ってはいけない。
 
IPsecはどうなるのかは解析していない。
 

その4:ppp+

上でPPPDはクライアントから接続要求があったときにオンデマンドで起動されると書いたが、これは最初に接続するクライアントのみ。PPTPDは複数のクライアントを受け付けるが、二番目以降のクライアントは最初に起動されたPPPDが面倒をみるので、新たなPPPDプロセスは起動されず、したがってppp+仮想ネットワークインタフェースも「Point-to-Point」の名に反し一つだけで複数のクライアントと接続する。P-t-Pと言うことでOpenVPNのtunインタフェースのイメージを抱いていたが、むしろtapに近い。なおクライアントのエンドポイントアドレスは各クライアント個別に/etc/pptpd.confの「remoteip」で指定されたレンジの先頭からわりあてらていくようだ。ifconfigで見たときのppp+には、最初に接続したのクライアントのエンドポイントアドレスだけがリモート側に表示される。

0 件のコメント:

コメントを投稿