ずっと家庭内サーバの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コードが読み取れなかったのはちょっとだけ悲しかった。


  1. なにげにこの機能待ち望んでたかも。
    SoftEtherもOpenVPNも、変なポートで開いてても発見されるとしつこめにアクセスが来ます。 ↩︎

  2. ということは、Chromebookでも。 ↩︎

  3. うち1回は「おまえのapt-getの状況古くない?1回最新にしてから出直せよ」みたいな悲しい怒られ方しました。 ↩︎