pockestrap

Programmer's memo

たまたま家にあったWiFiルータが PPTP 対応だったので、自宅 VPN を構築した。

動機

最近PCを組みました。 そこそこ性能のいいやつです。 (PC を組んだ時の記事はこちら パソコンくんだ - pockestrap)

当然の如くノートPCよりもデスクトップのスペックが高いので、出先で作業するのがつらくなってきました。
ノートPCは RAM が 8GB しかないんです。CPU もコアがデスクトップの半分です。
人権が危ういレベルですね。

そこで、出先のノートPC からデスクトップにつないで作業しよう、と思い立ちました。

SSH

まずは SSH を通すことを考えました。
インターネットとおしゃべりしている Aterm さんの22番を空けて、デスクトップの22番にアドレス変換するようにしました。
また、X port forward を有効にして、GUIアプリを SSH で使えるようにしました。

そうすることで、ノートPCからデスクトップの計算資源を使えるようになりました。
GUIアプリまで使えます。やったね!

しかし、少し試してみるといくつか不満点があることに気が付きました。

通信量

テザリング回線で試したところ、X port forward をしているとかなりの通信量を持っていく上、ブラウザなどは実用的ではないぐらいにカクつきました。
固定回線であれば実用に耐えうるかも知れませんが…

IME の機嫌が悪い

IME に Fcitx を使用しているのですが、 X port forward で起動したアプリに対して IME が有効になりませんでした。

ノートPCのブラウザでWeb開発が出来ない

私は普段 Rails で Web 開発をしていることが多いです。
Rails はデフォルトだと TCPの3000番で Web サーバーが立ち上がります。
ですが、自宅ネットワーク内の3000番は自宅ネットワーク内からしかアクセス出来ません。 port forward で立ち上げたブラウザであれば 3000番を見ることは出来ますが、前述したとおり X port forward でのブラウザはかなりの負荷になります。

3000番を外部に公開することも出来ますが、セキュリティ的に厳しいです。
また、例えば3001番を使いたくなった場合などの柔軟性に欠けます。

VPN

前項の SSH での問題点の解決法を考えると、VPNを使用することが妥当であるように思えました。

  • 通信量
    • GUI アプリはノートPCのものを使用する。これは仕方ない…
  • IME
    • 通信量と共に解決
  • Web 開発
    • 自宅ネットワークにノートPCを存在させることで、外部にポートを公開することなく解決

全て解決出来そうですね。 調べたところ、ちょうど使用しているWiFiルータに PPTP による VPN 機能がついていたため、それを使用することにしました。

使用機器

構成図

f:id:Pocke:20150923115345p:plain

手順

Air Station を Router モードに変更

これまで Air Station が Auto モードで動いていたのですが、Routerモードに変更しないと PPTP 機能を有効にすることが出来ないようです。 ということで、Air Station背面のスイッチをRouterに切り替えます。

Air Station の IP を固定

ルータのIPがころころ変わると不便なので、固定します。 見たところ、192.168.0.2から64個が DHCP で配られるように設定されているので、適当に192.168.0.100を割り当てました。

f:id:Pocke:20150923115412p:plain

Air Station の Firewall を解除

Air Station はインターネットに直接繋がれていないため、Firewall を解除しても問題ありません。

f:id:Pocke:20150923115435p:plain f:id:Pocke:20150923115445p:plain

192.168.0.0/24 -> 192.168.11.0/24 へのルーティングを書く

Router モードにする以前は一つのネットワークだったのですが、Router モードにしたことで Air Station で二つのネットワークに分かれてしまいました。
192.168.0.0/24 のデフォルトゲートウェイはインターネットになっていることが構成図からわかりますが、これだと 192.168.0.0/24 -> 192.168.11.0/24 の通信が出来ません。
そのため、上記の通信を先ほど設定した192.168.0.100に流してやります。

Aterm の 詳細設定 → 静的ルーティング設定から設定します。

f:id:Pocke:20150923115507p:plain

Air Station の NAT を無効にする

上記設定で 192.168.0.0/24 -> 192.168.11.0/24 への通信が出来るようになった…と見せかけて、まだ出来ません。
何故ならば、Air Station のアドレス変換機能が有効になってしまっているからです。
ということで、これを無効にします。

f:id:Pocke:20150923115534p:plain

これで、上記ルーティングが機能するはずです。

PPTP サーバ機能を有効にする

本命の PPTP サーバ機能を有効にします。

f:id:Pocke:20150923115556p:plain

また、下部の PPTP 接続ユーザーの編集ボタンからユーザーを追加します。

PPTP 用ポートを空ける

詳細設定 → パケットフィルタ設定から設定します。

PPTPTCP の 1723番と、greプロトコル(47番)を使用します。
そのため、その二つの通信を許可します。

f:id:Pocke:20150923115607p:plain

一番下の 47番 out はいらないかもしれない

PPTP パケットを Air Station に流す NAT変換を書く

詳細設定 → ポートマッピング設定から設定します。

TCP の 1723番と、47番のプロトコルAir Station のIPに流すような NATエントリを追加します。

f:id:Pocke:20150923115619p:plain


多分これでルータの設定は完了です。 もしかしたらなんか抜けてるかもですが。

クライアントPCの設定

今回はクライアントに Arch Linux を使用しますが、他のLinuxでもたいして変わらない手順だと思います。

パッケージインストール

$ sudo pacman -S pptpclient

初期設定

$ sudo pptpsetup --create <Profile Name> --server <IP Address> --username <User Name> --password <Password> --encrypt

<Profile Name>は任意の識別しやすい名前をつけます。
<User Name><Password>は、作成したPPTP接続ユーザーのユーザー名とパスワードを使用します。
<IP Address>には、インターネットに接続しているIPアドレスを入力します。
Aterm であれば、 情報 → 現在の状態 から確認することが出来ます。

接続

$ sudo pppd call <Profile Name> updetach

また、192.168.0.0/24192.168.11.0/24VPNのネットワークインターフェイスを使用するようにrouteコマンドを使ってルーティングテーブルを編集します(という認識だけど合ってるかな?)
ppp0の部分はもしかしたら違う名前かも? ip link とかで確かめてそれっぽいやつを使います。

$ sudo route add -net 192.168.11.0 netmask 255.255.255.0 ppp0
$ sudo route add -net 192.168.0.0 netmask 255.255.255.0 ppp0

まだ実際に外で使用していないのでなんとも言えないのですが、とりあえず構築は出来ました。
まだPPTPの仕組みを理解していないので、きちんと理解しておきたいですね…

参考

追記

2015/09/26 routeコマンドを使ったルーティングテーブルについて追記