その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.localとip-down.localにも共通するから、PPPDを使う複数のVPNプロトコルやクライアントとサーバを同時に走らせるシステムでは適切な対応が必要。具体的には、これらのスクリプトは以下のような引数で起動されるので、(必要なら)それらで区別する。
- PPTP(クライアント): インタフェース名(ppp+) pty名(pts+) ボーレート(38400) ローカル(クライアント側)エンドポイントアドレス リモート(サーバ側)エンドポイントアドレス
- PPTPD(サーバ): インタフェース名(ppp+) pty名(pts+) ボーレート(38400) ローカル(サーバ側)エンドポイントアドレス リモート(クライアント側)エンドポイントアドレス クライアントの物理IPアドレス
IPsecはどうなるのかは解析していない。
0 件のコメント:
コメントを投稿