macOSにWireGuard
クライアントアプリが登場したので、raspi3にをサーバにしてmacOS(mojave)、iOSアプリからWireGuard
を使用してVPN接続してみた。
結果
- raspi3のraspbian(stretch)では
WireGuard
を問題なく導入できた。 - iOS、macOSの
WireGuard
クライアントアプリから問題なく接続できた。 - でもハマりポイントがあった
以下に検証した結果を書いていきます。
WireGuardとは
特徴としては
- 新しいオープンソースのVPNプロトコル(あくまでプロトコルでありOpenVPN等のソフトウェアではない)であり、実態はカーネルモジュール
-
OpenVPN
より高速で通信量が少ないらしい -
OpenSSL
に依存していないため導入がシンプル - まだ開発途上で安定していない?
- 使用できるプロトコルはUDPのみでTCPは使えない
ということらしい。
サーバ側
raspberrypi3(raspbian strech)にansibleでインストールしセットアップ。Playbookを公開しているので詳細はこちらを参照。
ポイントとしては
- カーネルモジュールとしてインストールしているので最後に
reboot
する必要がある。
起動後にlsmod
で見えていれば多分大丈夫。
root@raspi3-wireguard:~# lsmod | grep -i wireguard
wireguard 151552 0
ip6_udp_tunnel 16384 1 wireguard
udp_tunnel 16384 1 wireguard
ipv6 425984 25 wireguard
- Listenポートを53にしてFreeWifiでも接続できるようにしている。
-
templates/wg0.conf
のPublickey
は後述するmacOS、iOSアプリで生成した公開鍵を記述する。 -
peer
のAllowdIPsに後述するクライアントIPを指定する必要がある。
0.0.0.0/0
でanyで許可もできるが、今回の検証ではクライアントIPを/32
で指定しないとインターネットに出られなかった。
最初0.0.0.0/0
で指定していて結構ハマッた。
ぐらいでしょうか。
OpenVPN
みたいにopenssl
で証明書を作らなくていいのでとても楽。HeartBleed
のような重大な脆弱性の影響も受けないし導入、運用はOpenVPN
より簡単かなと思った。
クライアント(macOSアプリ)
- AppStoreからインストール。今回使用したバージョンは
0.0.20190207 (3)
- 鍵ペアを生成し、Publickeyはサーバ側で指定。
-
Peer
のPublickey
にサーバで生成したPublickey
を指定。 -
Peer
のEndpoint
にサーバのグローバルIPとListen
ポートを指定。IPは名前でも問題ないのでDDNSで指定することも可。 -
Interface
のAddresses
はサーバ側のインタフェースのIPレンジ内を指定
あとはStatus: Inactive
のチェックを入れるとWireGuard
サーバに接続できる。
クライアント(iOSアプリ)
- AppStoreからインストール。今回使用したバージョンは
0.0.20190207 (3)
-
Create from scratch
から鍵ペアを生成しmacOSアプリと同様にサーバ情報を入力。
おわりに
- いくつか詰まるところがあったがとりあえずmacOS、iOSでVPNで接続したいという目的を達成することができた。
- サーバ側でトラブルシューティングが辛かった。(ログが全く出せないので切り分けが非常に大変)
今回詰まったときに行った調査としては- tcpdumpで
wg0
インタフェースにパケットがきているか -
wg0
にパケットがきているならiptables
でwg0
インタフェースのin,out,natでパケットが処理されているか
- tcpdumpで
ぐらいしか確認できなかった気がする。
- これで
OpenVPN
とWireguard
でVPNできる様になったので、両方を使いながら使用感を見ていきたい。またそのうち速度比較がしたい。