サーバ整備:pptpdをインストールして、自宅サーバをVPNサーバに仕立て上げる

どうも、おひさしぶりです。
なんというか、まともな記事を書こうと思います。


最近、自宅のネットワークを再整備して
1. 無線LANのAPを設置する
2. 外部に出るときはみんなプロキシ通るようにしてキャッシュを有効活用する。ついでにある程度アクセス制限する
という2個の目的を達成するために色々悩んだ後、+αで安定稼動するようになったので、まとめたいと。

まず、1の無線LANのAPですが、なぜかうちの環境(Y!BB 8M)ではルータを繋ぐと、ルータにIPはもらえるものの、外に出られないという怪現象が起こるので、めんどくさくなってきたのでサーバに直接無線LANのUSBアダプタを装着しソフトウェアAPにするようにしました。
とは言うものの、サーバはLinuxマシン(Debian)なので、ドライバにndiswrapperを使わないと駄目だとか、それだとAPに出来ないとかなんとかで、これまた面倒なことになったので、linuxマシンの中にVirtualBoxでライセンスの余ったWindows2000をセットアップ。
VirtualBoxOracleのページより、.debをダウンロードしてきて dpkg -iでOK。
ose版はUSBサポートが無いので不可です。

VirtualBoxはホスト側のUSBデバイスを奪えるので、奪うよう設定(VirtualBoxを起動するユーザをvboxuserに追加すること)
その上で、Windows2000からVirtualBoxのNATを使って外に出るように設定。
Windows2000上にドライバとソフトウェアAP入れて、無線LANとNATをブリッジで繋いで、とりあえず外に出すように設定。
NAT側のネットワークアダプタをプロパティーから共有するだけでいけます。この辺はWindows楽ですね。

この状態で、既にSkypeは動いた。すごいぞSkype

外に出れることが確認できたので、今度は本題のプロキシを入れる。
squidとか入れたかったんですが、いかんせんWindowsマシンでは面倒なので、BlackJumboDogをインストール。
WinProxyという名の頃から使ってるけど、けっこういいプロキシなのであんまり考えずにこれを選択。
利用者(許可ホスト)に192.168.0.*体系を設定するとあっさり外にプロキシ経由で出れるようになった。良き事かな。

本当はこのあたりでやめておけばよかったんですが、次はDebianVPNサーバにして、外からメンテナンスできるように&外からiPhoneiPadでネットを見てもキャッシュに貯まるようにする。ここからが難航。

今まではこのサーバはwebとsshだけのサーバだったので、ssh経由で何でも出来たんだけど、中身の2000のメンテがVirtualBoxのNATを挟んでて、その上2000だしRDPも使えない、VirtualBox内蔵RDPは外部に向けるもんじゃない、という事で、中のWindows2000ではなく、Debian自体をVPNサーバにすることに。
あとVirtualBoxPPTPで使用するプロトコルGREをNATの中に渡せないので、ホストマシン側にぶら下げる必要が。

あ、PPTPはなんとなくPPTPを使用しました。

ここで少し悩んだり。
WLANのインターフェースはVirtualBoxに完全に奪われてて、linux側からは見えない。
eth0はグローバルIP
なので、新しい体系でVPN関連のネットワークを切ってMASQUERADEしてやらないといかん。

とりあえず、192.168.3.0/24を使用することに(思いつきで)決める。

まずaptitudeでpptpdを入れる。

aptitude install pptpd

これだけ。
あとはとりあえずの設定。

/etc/pptpd.conf

#ppp0というインターフェースが出来て、localipがローカルのIPアドレスになります。
localip 192.168.3.1
#ppp0に繋がる相手に割り振るIPアドレス。必要数だけの方がいいかも。
remoteip 192.168.3.127-191

/etc/ppp/options

#あとで必要な名前。
name pptpd 
#自分のドメインにする(必要ないかも)
domain my.domain.local
#nodefaultrouteが無いと、ppp0をデフォルトルートにされてしまうので、指定。
nodefaultroute
#同一サブネットにする場合はproxyarpが必要。
#proxyarp
#これが無いとiPhoneから繋いだときに切断される。
noauth
mtu 1400
#自分のISPDNSサーバを設定。googleDNSでもいいかも。
ms-dns xxx.xxx.xxx.xxx
ms-dns yyy.yyy.yyy.yyy

/etc/ppp/chap-secrets

#ユーザ名 再ほど設定したサーバ名 パスワード 対象。
user pptpd "password" *

ここまでやったら

/etc/init.d/pptpd restartでOK。

次にファイヤーウォールに穴を開ける。
firestarterを使用している場合は普通にiptablesに書いたりしても、ppp0がifupされるタイミングでfirestarterに上書きされるので、テスト段階から、firestarterユーザの皆さんは/etc/firestarter/user-preに設定を書くべし。
あと、/sys/proc/ipv4/ip_forwardが0で毎度書き換えられるので、その辺も設定。
自分は面倒なので、/etc/firestarter/sysctl-tuningの頭のほうで0をechoしてるところを1にしました。

設定
/etc/firestarter/user-pre

### allow TCP/IP 1723 port
$IPT -t filter -A INPUT -i eth0 -p tcp --dport 1723 -j ACCEPT

### Allow GRE/IP (Protocol number 47)
$IPT -t filter -A INPUT -i eth0 -p 47 -j ACCEPT

### Allow all packets from PPTP interface
$IPT -t filter -A INPUT -i ppp+ -j ACCEPT
$IPT -t filter -A FORWARD -i ppp+ -j ACCEPT

### NAT

$IPT -t nat -A POSTROUTING -s 192.168.3.0/255.255.255.0 -o eth0 -j MASQUERADE
$IPT -t nat -A POSTROUTING -o ppp+ -j ACCEPT
$IPT -t nat -A POSTROUTING -o lo -j ACCEPT

#PPPからは結構無条件にACCEPTする。
$IPT -A INPUT -i ppp+ -s 192.168.3.0/255.255.255.0 -j ACCEPT
$IPT -A FORWARD -i ppp+ -o eth0 -s 192.168.3.0/255.255.255.0 -j ACCEPT
$IPT -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -t filter -A INBOUND -i ppp+ -j ACCEPT
$IPT -t filter -A INPUT -i ppp+ -j ACCEPT

$IPT -A INBOUND -i ppp+ -j ACCEPT
$IPT -A INPUT -i ppp+ -j ACCEPT

ppp+のあたりのACCEPTはかなり適当なので、正しいのがわかる方はコメントよろしくお願いします。

これでとりあえずVPNの設定が完了です。
iPhoneの設定より、一般→ネットワーク→VPNVPN構成を追加、より、構成を追加します。

未だ、VirtualBox内のプロキシに設定が無いので、普通にネットに繋がると思います。
ここでVPNの設定は完了。

あとは、VirtualBoxのNATに穴を開けます。
VirtualBoxをいったん終了して、次のコマンドをたたきます。w2kがVirtualBox上でのマシン名、内部では8080でプロキシが待ち受けてることと想定します。

VBoxManage setextradata "w2k" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/guestproxy/Protocol" TCP
VBoxManage setextradata "w2k" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/guestproxy/GuestPort" 8080
VBoxManage setextradata "w2k" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/guestproxy/HostPort" 8080

で、VirtualBoxを再起動。BlackJumboDogの許可ホストに10.0.2.2を追加して、iPhoneVPN設定のプロキシに192.168.3.1 8080を設定すると中に飛ぶことが確認できます。

外から8080が見えないことを確認して、完了。
四日ほどかかりました。

しかし、自宅サーバのファイルをいつでもセキュアに持ち出せるのがこんなに楽だとは思いませんでした。