プライベートIPアドレスが割り振られる集合住宅のネット接続環境に、Webサーバーを設置して欲しいという依頼があり検討を開始しました。
当然のことながら公開Webサーバーを設置するには、グローバルIPアドレスが必要になります。グローバルダイナミックIPアドレスでもサーバーは設置出来ますが、普通は固定IPアドレスを使用したいところです。
グローバルIPアドレスの入手方法としては、
- 集合住宅ネットのサービス会社から固定グローバルIPをもらう。(契約内容を見直して、変更可能であれば行う)
- VPNを提供しているプロバイダーと契約する。具体的には、インターリンクのPPTP(MyIP)サービスを利用する。
が考えられます。どちらも調査が必要なのですが、VPNは設置済みルーターによっては利用できない場合があるため、事前調査を行うことにしました。
調査方法は、私がiPad 用に契約しているインターリンクのMyIP VPN契約を使って現地に行き接続確認を行うことで、試してみたところ、マイIPで無事にiPadにグローバルIPが割り当てられ正常に通信出来ることを確認しました。
接続確認のあとは、PPTPのVPN接続でWebサーバーが動くことを確認してもらうためのデモ機を構築することです。
2019/12 追記
以下の pptpclient による接続方法は、2019/12/05 のメンテナンスにより、仕様が変わり使う事が出来なくなりました。
2019/12/06以降の接続方法に関しては、マイIP仕様変更についてのメモを参照のこと。
PPTPクライアンでVPNのWebサーバーを作る
Webサーバーは FreeBSD 8.3 で構築します。ホストは、以前Windows XPを使っていたPentiumIII 1GHz + i815 のマザーボードPC。
インストール作業は毎度のことなのでメモは省略します。
PPTPのインストールと設定はインターリンクのサポートページの記述をほぼそのまま利用可能です。インターリンクはWin,Mac の他、Linux, FreeBSD のVPN接続まで準備してくれているし、接続サービスとサーバーサービスの契約が分かれていて、固定IP料金のコストパフォーマンスがよいサービスプロバイダーです。
VPNクライアントを構築するため、サポートページの指示通り pkg_add -r pptpclient でpptpクライアントソフトを入れておきます。
> pkg_info|grep pptp pptpclient-1.7.2_5 PPTP client for establishing a VPN link with an NT server
手動動作チェック
設定を行った後、OSを再起動する前に、コマンドラインから startpptp.sh を叩いて pptp が動作することを確認してみます。
# /etc/ppp/startpptp.sh add host 203.141.128.108: gateway 192.168.1.1 delete net default: gateway 192.168.1.1 /bin/ip: not found /bin/ip: not found add net default: gateway 120.143.11.1
# ifconfig rl0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 options=3808<VLAN_MTU,WOL_UCAST,WOL_MCAST,WOL_MAGIC> ether 00:50:fc:f6:4b:ae inet 192.168.1.31 netmask 0xffffff00 broadcast 192.168.1.255 media: Ethernet autoselect (100baseTX <full-duplex>) status: active tun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> metric 0 mtu 1400 options=80000<LINKSTATE> inet 120.143.xxx.yyy --> 120.143.11.1 netmask 0xffffffff Opened by PID 1535
上記のコマンド結果の通り、VPNで固定IPのホストが出来上がりました。startpptp.sh 発行時、「/bin/ip: not found」と表示されるのは pptpclient コマンド埋め込みコマンドの結果のようで、FreeBSDで使用する場合は無視するしかないようです。/bin の下に、ダミーコマンドでも作っておいておけば消えるかもしれませんが、特にテストはしません。
# /etc/ppp/stoppptp.sh
でVPNを停止。手動テストの結果は良好で、次はOS起動時に自動的にPPTPが起動してくれれば、リモートからのOSを再起動しても自動でインターネットに再接続できることになります。
OS起動時にPPTPを自動起動させる
続いてOSを再起動させる前に、/etc/rc.d/ppp で、pptp が自動起動するかどうかを確認してみました。
以下のようになり、結果はNG。
# /etc/rc.d/ppp start Starting PPP profile: papchappapchap: Configuration label not found .
FreeBSD 8.3 の場合、サポートページの記述どおりに、/etc/rc.conf に ppp_enable=”YES” と記述してpppからPPTPを起動させようとしても自動起動しませんでした。ppp起動スクリプトを読んでみたら、確かに起動しそうにない。(FreeBSD 4.3 の頃はこれで良かったのかな?)
/etc/rc.d/ppp から起動するのは諦めて、/etc/rc.local で /etc/ppp/startpptp.sh を書き込むことにしました。
そして、サーバーを再起動。
しかし、pptp は起動しません。/var/log/ppp.log をチェックすると以下のログが残っていました。
ppp[1452]: Alert: deflink: Can't create /var/run/pts/0.if: No such file or directory
/var/run/pts というディレクトリが存在しないのが原因のようなので、手動で /var/run/pts ディレクトリを作っておくことにしました。
再度OSを再起動して、PPTPの動作を確認しましたが、、、、、動いていない。
ppp.log を見てみると、PPTPが確立した後すぐに切断されてしまっています。
Phase: Chap Input: SUCCESS (Welcome!!) Phase: deflink: lcp -> open Phase: bundle: Network Phase: Signal 1, terminate. Phase: bundle: Terminate Phase: deflink: open -> lcp Warning: 0.0.0.0/0: Change route failed: errno: No such process Phase: deflink: Disconnected! Phase: deflink: Connect time: 26 secs: 816 octets in, 701 octets out Phase: deflink: 16 packets in, 24 packets out Phase: total 58 bytes/sec, peak 177 bytes/sec on Sat Nov 17 10:38:09 2012 Phase: deflink: lcp -> closed Phase: bundle: Dead Phase: PPP Terminated (normal).
ネットワークが安定していない時点でpptpを起動しようとしているのかと疑い、/etc/rc.local に書き込んだ /etc/ppp/startppp.sh の起動前に10秒間のポーズを入れてみましたが、やっぱりPPTPがすぐに終了してしまい駄目。ひょっとして /bin/ip コマンドが存在しないことをエラーと認識し終了となっているのか(/bin/ip: not found)と思い、次のようにスクリプトを変更してみました。(正常起動時しか動かない、いい加減なスクリプトですが現時点では十分。)
#!/bin/tcsh set runflag=`ps ax|grep myip |grep -v "grep" |wc -l` set dhcpgw=`netstat -rn | grep "default" | grep -v "grep" | awk '{print $2}'` if ( $runflag > 0) then echo "PPTP is already running." else route add -host 203.141.128.108 $dhcpgw route delete default $dhcpgw /usr/local/sbin/pptp 203.141.128.108 myip & sleep 10 route add -net default 120.143.11.1 endif exit 0
if 文はpptpが二重に動かないようにするためのもので現時点では余計ですが、とりあえず入れておきます。
サーバーを再起動してみると、自動的にPPTPが起動したままでグローバルIPを取得したままで維持。
Phase: Chap Input: SUCCESS (Welcome!!) Phase: deflink: lcp -> open Phase: bundle: Network
これで、プライベートネットワークの中に設置したサーバーが、公開サーバーとして機能するようになりました。
課題
現時点ではファイヤーウォールも動いていないし、アクセスコントロールも満足に行っていないので、殆どのパケットが素通り状態。放置しておくと怪しいパケットがたくさん届くことになります。インターネットサービスをメンテナンス用のSSHとftpくらいしか動かしていないので侵入されることはありませんが、Webサービスを立ち上げる前にファイヤーウォールの設定を行う必要があります。
また、このPPTP VPN設定では何らかの要因でVPNが切断されてしまうと、(恐らく自動再接続されないため)、再接続をするためにはホストを再起動する必要があります。または startpptp.sh を、定期的にpptpのセッションを監視して落ちていたら再度必要なコマンドを発行するようにもうちょっと高機能に書き直す必要があるでしょう。本番で使用する場合は、PPPoEの固定IPを使いたいところです。PPPoEなら自動再接続してくれますからね。