OpenBSDでPPTPサーバつくってiPhoneからつなげるようにしてみたり、そのiPhoneをひかり電話の端末にしてみたり

そんなことをやってたらこんな時間。例によって後でやりかた忘れたときのためにメモ。

そもそもの経緯

たまたまhttp://journal.mycom.co.jp/column/osx/321/なんていう記事が出てたので、同じようなことをやってみようと思ったわけで。
わが家はBフレッツマンションタイプの回線で、ひかり電話もつかってるので、NTT東日本からRV-230SEっていうVDSLモデム内蔵のひかり電話対応ルータが送られてきてる。こいつは物理的につないだアナログ電話のほかに、SIP対応のソフトフォンとか電話機とかがつなげるようになってる。

OpenBSDPPTPサーバをつくって、VPN接続できるようにする

↑の記事にあるようなVPNルータを買うような予算はないので、ふだん家で動いてるOpenBSD 4.5のPCをPPTPのサーバにする。

サーバ側のインストール前準備

PPTPで接続してきた端末には、このサーバがルータになってつながるようにしたいのだけど、パケットフォワーディングが有効になってない。なので、sysctl(8)を使って有効にする。

$ sudo sysctl net.inet.ip.forwarding=1

GRE*1が通るようにする必要があるので、これもsysctl(8)で設定する。

$ sudo sysctl net.inet.gre.allow=1

再起動しても同じ設定になるように、/etc/sysctl.conf(5)にも追記。

$ sudo vi /etc/sysctl.conf

下記を追記。

net.inet.ip.forwarding=1
net.inet.gre.allow=1

net.inet.ip.forwardingに関しては、/etc/sysctl.conf(5)の上のほうでコメントアウトされてる行があるので、そこのコメントをはずすだけでOK。

このサーバでいろいろやってる関係で、pf(4)でパケットフィルタをやってるので、/etc/pf.conf(5)に追加設定。これに関しては、直接ここに書いちゃうと、うちの構成がバレちゃうので概要だけ。必要なのは下記の設定

  • サーバ自身に対するPPTP(TCP 1723番)での接続許可
  • PPTPで接続してくる端末に割り当てるネットワークに対する通信許可
  • GREの通過許可(最初これを忘れてて、全然つながらなくなってはまった)

パケットフィルタやってなければ、これは不要。

/etc/pf.conf(5)をかきかえたら、忘れずに有効にしておくこと。

syslogを/var/log/ppp.logに吐いてほしいので、それも有効にしておく。これは/etc/syslog.conf(5)を編集。

$ sudo vi /etc/syslog.conf

こんな感じの行を追加。

!ppp
*.*                                                     /var/log/ppp.log
ひかり電話ルータの設定

まず、静的NATの設定。TCP 1723番(=PPTP)に対する通信の宛先を、さっきから設定してるサーバにする。

次に、ルータ側のルーティング設定。端末に割り当てるネットワークのゲートウェイを、さっきから設定してるサーバにする。これを忘れると、VPNはつながるのに電話が使えないとか、外に出られないとかいうことになる。

電話機能の設定は、デフォルトのままで使ってればとくに何もしなくてよさそうなのでそのまま。

PPTPサーバの設定

portsから、PPTPサーバのPoptopをインストールする。packagesからでもいいかもしれないけどやってない。

$ cd /usr/ports/net/poptop
$ sudo make install-all

インストールしたら、設定。これに関しては、汝の隣人のブログを愛せよ | LOVELOGに書いてあることをそのまま。設定自体はFreeBSDでもOpenBSDでも同じみたいなんで。リンク先が消えたときのことを考慮して、自分のもさらしておく。まず/etc/ppp/ppp.conf。/etc/ppp/にサンプルがあるけど無視。

$ sudo vi /etc/ppp/ppp.conf

内容はこちら。

loop:
 set timeout 0
 set log phase chat connect lcp ipcp command
 set device localhost:pptp
 set dial
 set login
 set ifaddr 192.168.2.1 192.168.2.2-192.168.2.100 255.255.255.0
 set server /tmp/loop "" 0177

loop-in:
 set timeout 0
 set log phase lcp ipcp command
 allow mode direct

pptp:
 load loop
 disable CHAP MSCHAP PAP
 enable MSCHAPv2
 disable deflate pred1
 deny deflate pred1
 set mppe 128 stateless
 enable MPPE
 accept MPPE
 enable chap81
 enable proxy
 set device !/etc/ppp/secure
 accept dns
 set dns 192.168.0.1

リンク先にも書いてあるけど、「set ifaddr 192.168.2.1 192.168.2.2-192.168.2.100 255.255.255.0」はPPTPでつなぐ端末に192.168.2.0/24を割り当てるということ。

次に、/etc/ppp/ppp.confに書いてあって呼ばれる/etc/ppp/secure。

$ sudo vi /etc/ppp/secure

内容はこちら。

#!/bin/sh
exec /usr/sbin/ppp -direct loop-in

つくったら、実行属性つけておく。

$ sudo chmod 700 /etc/ppp/secure

最後に、ユーザ名とパスワードを書いたファイルである/etc/ppp/ppp.secretをつくる。

$ sudo vi /etc/ppp/ppp.secret

内容は、ユーザ名とパスワードをタブ区切りで、1行に1ユーザずつ書いていく。つまり、

user1	password1
user2	password2

こんな感じ。ちゃんとタブで区切る。つくったら、忘れずにroot以外が読めないようにしておく。

$ sudo chmod 500 /etc/ppp/ppp.secret

あとは、/etc/pptpd.confの編集。

$ sudo /etc/pptpd.conf

ここでは、

option /etc/ppp/options.pptpd

という行を見つけて、頭に#を入れてコメントアウト

設定ファイルをひととおり作ったら、pptpdを起動。

$ sudo /usr/local/sbin/pptpd -d

起動時のログは、/var/log/daemonあたりに出てるようなので、そちらを参照。うまくいけば、

$ netstat -an | fgrep 1723

とやると

tcp        0      0  *.1723                 *.*                    LISTEN

こんな感じで、TCP 1723番でListenしてることになってるはず。

ちゃんと起動したら、サーバを再起動したときに自動で起動するようにしておく。

$ sudo /etc/rc.local

こんな感じの内容を追加。

if [ -x /usr/local/sbin/pptpd ]; then
    echo -n " pptpd";    /usr/local/sbin/pptpd -d
fi
iPhoneの設定

iPhoneVPNの設定。設定アプリを起動して、「一般」-「ネットワーク」-「VPN」-「VPN構成を追加」-「PPTP」の順に選んで、下記のような感じで設定して保存。

説明
適当な名前
サーバ
インターネット側からみたときのサーバのIPアドレスとかFQDN名とか。つまり、サーバのアドレス。
アカウント
/etc/ppp/ppp.secretに書いたユーザ名
RSA SecurID
オフ
パスワード
/etc/ppp/ppp.secretに書いたパスワード
暗号化レベル
自動
すべての信号を送信
オン

ここまで設定したら、VPNをオンにしてみるとつながるはず。Wi-Fiでサーバと同じ内部ネットワークにいるとテストにならんので、一時的にWi-Fiを切って3Gだけにしてからつないでみるとよさげ。

このときのログは、/var/log/daemonや、さっきつくった/var/log/ppp.logあたりに出てるので、トラブルシューティングにはそれを使うとよさげ。あとはtcpdump(8)とか:-p

iPhoneひかり電話

無料のfringSIP対応で、以前アカウントを作ってたので使いたかったのだけど、うまくいかなくて、原因もよくわからなかったので、不本意ながら有料のSipPhone on iPhone(本日時点で800円)を使用。

設定方法はhttp://journal.mycom.co.jp/column/osx/321/に書いてあるのと同じ。「Accounts」タブを開いて、[Add new SIP acco...]を選んで、

Domain
ひかり電話ルータのLAN側IPアドレス
Username
内線番号
Password
内線番号に対応するパスワード

をそれぞれ入力。さらに「Advanced」を選んで、

Auth User
ユーザID
Proxy Server
空白
Reg.Timeout
リンク先に3600って書いてあるから3600にしてみた。デフォルトは0。

を入力して、「SIP Account」に戻ってSave。

アカウントができたら、そのアカウントをONにする。3Gでの接続だと、VPNでつないでいても落ちるみたいなので注意。問題なければ、何も言わずにONになってくれる。設定がまちがってると怒られる。

この状態で、「Dialer」タブにして電話番号を入れて、「SIP」ボタンを押すと、ひかり電話経由で外に電話がかけられる。アナログ電話の内線番号(1 or 2)をダイヤルすると、そっちをコールできる。逆に、アナログ電話からiPhoneを呼びだすことも可能。

ただし、さすがに3GでVPN接続してると、SIP経由で電話をかけさせてくれないみたい。公衆無線LANだと使えるらしいので、BBモバイルポイントとかでやってみよう。

このほか、参考にしたサイト

*1:どうでもいいけど、日本語のWikipediaって、GREで引くとGraduate Record Examinationのことしか載ってないのね。ここでのGREGeneric Routing Encapsulationのこと。