FreeBSD環境にWireGuardをインストールし、外からVPN接続が行えるように環境構築してみました。
思った以上に簡単に構築、利用出来ました 😮
WireGuardとは
Wikipediaに書いてある通り、IPsecとは異なるプロトコル実装のVPNソフトウェアです。 VPNで利用するプロトコルはIPsecやTLSなど色々ありますが、WireGuardはシンプルなコード実装でありながら、ChaCha20など最新の暗号化にも対応するプロトコルです。
- ChaCha20については 新しいTLSの暗号方式ChaCha20-Poly1305 が詳しいです
- IPsecでもChaCha20には対応はしているものの、利用されていることをあまり見かけない…
パフォーマンスについてもIPsecやOpenVPNと比較したデータがあり、既存のプロトコルに比べ最新の暗号アルゴリズムに対応しながら性能が良いというのが特徴です。 そして何より設定が非常に楽です。 (急ぎで外からVPNによるアクセス経路を作ろうと思ったとき、初見で約30分ぐらいで設定出来た)
FreeBSD環境ではportsで net/wireguard
があり、こちらはgolang実装のwireguard-goでインストールされます。(Linux Kernelにはマージされていますが、FreeBSDは13.1 or 14であればkernel moduleが使えるみたいです)
またCloudflareがRunstで実装した BoringTunもあるそうです。
設定手順
基本的にはこちらを参照しました。
1. pkg install
pkg install wireguard libqrencode
AndroidのWireGuardアプリで設定をQRコード読み込みが可能であるため、qrencode
コマンドのため併せてインストール(これがとても便利)
2. 鍵生成
cd /usr/local/etc/wireguard
wg genkey > freebsd.private
wg pubkey < freebsd.private > freebsd.public
wg genkey > android.private
wg pubkey < android.private > android.public
3. wg0.confの設定
/usr/local/etc/wireguard/
配下に I/F名と同名となるファイル名 wg0.conf
で作成
[Interface]
Address = 192.168.222.1/32
PrivateKey = <content of freebsd.private>
ListenPort = 51820
[Peer]
PublicKey = <content of android.public>
AllowedIPs = 192.168.222.2/32
4. client側のconf設定
ファイル名 android.conf
などクライアント端末の設定ファイルを作成する。
[Interface]
Address = 192.168.222.2/32
PrivateKey = <content of android.private>
[Peer]
PublicKey = <content of freebsd.public>
AllowedIPs = 192.168.222.1/32
Endpoint = wg.example.com:51820
ここでポイントなのがPeerの AllowedIPs
に設定するセグメントがクライアントのVPN接続時に転送されるルーティングとなるため、L3 VPNなど複数セグメントで通信を行う場合には AllowedIPs
に適切なセグメントを追加する必要があります。(IPsecでいう所謂Proxy ID)
5. rc.confへ設定追加、必要であれば併せてNAT設定
WireGuardでは wg0
というI/FにIPアドレスが付与され、L3 VPNで接続する形になります。VPN接続先のサーバと通信するにはルーティングかNAT設定を行う必要があります。
NAT設定であれば以下の設定が必要です。
NAT設定
# ipfw natの有効化
sysrc firewall_nat_enable="YES"
# gateway有効化
sysrc gateway_enable="YES"
# 設定適用
service routing restart
別途ipfwの設定ファイルでNAT設定を行います。
詳細は 【ipfw】NATルールの除外設定【iptables】 に記載しています。
WireGuardの設定
sysrc wireguard_enable="YES"
sysrc wireguard_interfaces="wg0"
service wireguard start
6. クライアント端末に設定のインポート
- Android端末向けにQRコード画像の生成
qrencode -o qr.png < android.conf
(terminalでQRコードを表示してみるとQRコードが大きすぎて上手く読み込めなかった 😇)
- Windows端末向け
android.confの設定ファイルをそのまま専用クライアントで読み込みを行えば、設定のインポートが出来ました。
まとめ
今回FreeBSDにおけるWireGuardの設定を紹介しました。
私はOpenVPNや、StrongSwanのIPsecなどを設定したことはあるのですが、WireGuardは非常にシンプルで簡単に設定が出来ました。外からアクセスする必要が急きょ出来て今回RTAみたいな形で初見ではあったものの、すぐに設定、利用が出来ました。
ちなみにL2 VPNも組もうと思えば組めれるようです
wireguardって一応L2 VPN組めるんだ。https://t.co/p7Nk6TXDsx
— spg (@spg_games) March 26, 2021
今回設定したFreeBSD環境がKernel Module版ではないので、性能比較やアクセスログ辺りについても調べたいなと思います。