VyOSでWireGuardサーバをたてる

VyOSのインストールや、一般的な設定については割愛します。eth0がインターネットに接続されていて、作業のために外部からSSHでログインできることを前提にします。

WireGuardはそれぞれのエンドポイント用に鍵ペアが必要なので、まずエンドポイントごとの鍵ペアを作成します。1.2.x cruxを自力でビルドしたものは名前付き鍵ペアが作成できなかったので、今回はrolling版を使いました。

local$ ssh vyos-wg
vyos-wg$ show version | grep Version
Version: VyOS 1.2-rolling-201910021249
vyos-wg$ generate wireguard named-keypairs server-wg0
vyos-wg$ generate wireguard named-keypairs client-myiphone

クライアント用の秘密鍵をサーバ側に保管することに抵抗がある場合は、別途外部で作成してください。今回は利便性を優先して必要な鍵ペアはサーバ側で生成保管することにします。

WireGuard VPNに関連するアドレス設計は例として下記のようにします。

  • 51820/udpで外部からの接続を受け付けます
  • VPNクライアントへの配布アドレスは172.25.145.0/24から割り当てます
  • 172.25.145.1はWireGuardサーバが利用します
  • すべてのトラフィックをWireGuard経由で送受信し、VyOSがNATします

vyos-wg$ configure
# set interfaces wireguard wg0 address '172.25.145.1/24'
# set interfaces wireguard wg0 port '51820'
# set interfaces wireguard wg0 private-key 'server-wg0'
# set interfaces wireguard wg0 peer myiphone allowed-ips '172.25.145.2/32'
# run show wireguard keypairs pubkey client-myiphone
# set interfaces wireguard wg0 peer myiphone pubkey 'jBbMwDmWP23APVOH74LpqQueQyOpppqYMFbNgNG23jk='
# set protocols static interface-route 172.25.145.0/24 next-hop-interface wg0
# set nat source rule 10 outbound-interface 'eth0'
# set nat source rule 10 translation address 'masquerade'
# commit
# save
# exit

さて、これで利用できるかと思いきや、wg0がupしませんでした。仕方ないのでとりあえず手動でupさせます。

vyos-wg$ show interfaces | grep wg0
wg0 172.25.145.1/24 A/D
vyos-wg$ sudo su -
root# ip link set wg0 up
root# exit
vyos-wg$ show interfaces | grep wg0
wg0 172.25.145.1/24 u/u

でも再起動するとまたdownしちゃうんですよね。適当なワークアラウンドを適用してください。(追記: 次のビルドで直るかも 直りました!早い! https://phabricator.vyos.net/T1706

あとはクライアント用の設定ファイルを用意します。

vyos-wg$ show wireguard keypairs pubkey server-wg0
i9vFW9NyVKrNRpkiwUZviLizTY1/V2XpETjDBet+Ewg=
vyos-wg$ show wireguard keypairs privkey client-myiphone
oAHV4ggf15IqzSVEUDqJNJhLrP/Dbbi2tyqJcn64bH4=

local$ cat myiphone.conf
[Interface]
Address = 172.25.145.2/24
PrivateKey = oAHV4ggf15IqzSVEUDqJNJhLrP/Dbbi2tyqJcn64bH4=
DNS = 8.8.8.8

[Peer]
PublicKey = i9vFW9NyVKrNRpkiwUZviLizTY1/V2XpETjDBet+Ewg=
AllowedIPs = 0.0.0.0/0
Endpoint = vyos-wg.fqdn.or.ipaddress:51820

Windows/macOSなどのPCならそのままWireGuardのクライアントに食わせればいいし、スマホ向けにはqrencodeコマンドでQRコードを作成してWireGuardアプリから読むのが楽です。

local$ qrencode -t ansiutf8 < myiphone.conf