宅内ラズパイVPNサーバをWireGuardに
ずっと家庭内サーバのVPNサーバには、OpenVPNを使用してきました。
それを、Macを迎えるにあたってWireGuardに。
そう、未だにOpenVPNを使い続けていたのです。
というのも、以前からネットワーク周りの検証に、SoftEtherの仮想LANと仮想HUBを使用していたから。
前職でも、顧客とクラウドサーバを接続するのにSoftEtherを使用したりと色々と活用していて慣れていたのと、SoftEther付属のOpenVPNは設定がめちゃくちゃ楽だった事から、もうずっとSoftEther+OpenVPN一択でやってきました。
ただ、最近は環境もかなりシェイプアップしてしまい、仮想HUBも使うことが無くなってて。昔は「凄くレイテンシの大きいHUB」「パケロスが多いHUB」とか用意して色々やってましたが、もうさっぱりそういうレイヤの遊びができてません。
最近、遊ぶ時間は家族が寝てから1時間のみ、としているのですが、この縛りはなかなかキツく、翌日には戻さないといけない遊びと非常に相性が悪い。
なので、これを機に「実用サイドに振ったシンプルなVPN」を考えてみようかと。
そこで、前評判として
- ユーザIDとかそういうの無くて、公開鍵でサクッと繋がる
- 設定が簡単
- 軽い
- UDPで通信して、さらに、正規通信じゃなかったら無視するステルス性がある1
- クライアントがAndroid2、iOS、Mac、Windows揃ってる
という内容を聞いていた、WireGuardを構築することにしました。
作業も簡略化して、PiVPNを使います。
結論としては信じられないほど簡単だったので、是非共有をしようかと。
インストール
まぁ、このコマンド投入は好きではないのですが、公式がこう言ってるので。
$ curl -L https://install.pivpn.io | bash
心配なので私は気休めに
$ curl -L https://install.pivpn.io > install.sh
$ cat install.sh
$ cat install.sh | bash
で、一度保存して確認してから実行しました。
基本的にウィザードにひたすら答えるタイプです。
途中、静的アドレスが振ってあるよね? DHCPっぽいけど、ちゃんとアドレスは予約してあるんだよねこれ? 意味がわかんないなら『違う』だよ。とか色々聞いてきますが、とにかく親切。
信じられないことに、途中で「自動更新しような。unattended-upgrades入れさせてな」という事まで言ってきます。
途中、2回ぐらい再起動を求められました3が、再起動後もう一回cat install.sh | bash
を実行するとそのまま続いて、あっという間にインストールが完了しました。
起動後は、とりあえずポート開放。
そして、クライアントを接続していきます。
WireGuardは鍵を使って接続するので、クライアント用の鍵を生成します。コマンドはpivpn add
。入力すると、
$ pivpn add
Enter a Name for the Client:
となり、さらにクライアント名を入力します。
そうすると、自動的に/etc/wireguard/wg0.conf
にクライアントの公開鍵を追記。そして接続用の秘密鍵はconfファイルとして出力してくれました。さらにすぐに繋がるようにWireGuardのデーモン再起動までしてくれます。
出てきた秘密鍵ですが、スマホだとコピーするまでもなく、
$ pivpn -qr クライアント名
これでQRコードが表示されるので、公式アプリからスキャンすると設定できます。
実際、Androidアプリからスキャンすると、サクッと設定が保存され、ワンタップで接続出来てしまいました。拍子抜け過ぎん?
思わず、2台持ち両方に設定して、4G回線経由で立てたNASを確認して楽しんだり。
外に出るにはもう少し設定が必要で、先ほどの/etc/wireguard/wg0.conf
に下記の2行を追記します。
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE; iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE; iptables -t nat -D POSTROUTING -s 10.0.0.0/24 -j MASQUERADE
VPNサーバにしたことが無い場合は、/etc/sysctl.conf
もチェック。
下記がコメントアウトされている場合は、コメントアウトを解除してください。
net.ipv4.ip_forward=1
設定が完了したら、
$ sudo reboot
で再起動して、自動的に上がって来た状態でVPN接続して、ネットワーク内、そして外にアクセス出来るか確認できれば、構築は完了です。
使ってみた感想として、うちのネットワークは上りが10Mbpsに制限されてる悲しいネットワークなのですが、10Mbpsまでガッツリ出てるし、たいしてCPU負荷も上がらない良いVPNだと。
しばらく使ってみて、良い感じであればOpenVPNは停止し完全に移行しようと思ってます。
なお、脚注ですでに述べましたが、OpenVPNの時と同様に、ChromebookでもAndroid用のWireGuardクライアントをインストールして接続すると普通に接続出来ます。duetのカメラではQRコードが読み取れなかったのはちょっとだけ悲しかった。