OpenBSD, Linux どちもカーネルにWireGuard実装がマージされたため IPSec からWireGuard に変更したときのメモ。WireGuard は IPSec や OpenVPN に比べてシンプルなVPN。暗号化、鍵交換などの方式が固定されているためネゴシエーションが簡単になっているのだろう。

Ubuntu が固定IPをもち server 的に動作し、 OpenBSD が動的IPで client 的に動作するように設定する。前述のように暗号化、鍵交換などの方式が固定されているので VPN の両端で使用する秘密鍵、共有鍵とIPを設定すれば設定は完了である。

Ubuntu 側の設定

必要なプログラムのインストール。

1
2
  sudo apt install wireguard
  sudo apt install wireguard-dkms

秘密鍵、公開鍵の作成。

1
2
3
4
5
6
  sudo su
  umask 077
  wg genkey | tee /etc/wireguard/server.key
  cat /etc/wireguard/server.key | wg pubkey | tee /etc/wireguard/server.pub
  wg genkey | tee /etc/wireguard/client.key
  cat /etc/wireguard/client.key | wg pubkey | tee /etc/wireguard/client.pub

以降クライアント、サーバの秘密鍵、公開鍵を CLIENT_PRIVATE_KEY, CLIENT_PUBLIC_KEY, SERVER_PRIVATE_KEY, SERVER_PUBLIC_KEY と書く。

wireguard の設定

次を /etc/wireguard/wg0.conf として作成する。

1
2
3
4
5
6
7
8
  [Interface]
  PrivateKey = SERVER_PRIVATE_KEY
  Address = 192.168.96.1/24
  ListenPort = 4500

  [Peer]
  PublicKey = CLIENT_PUBLIC_KEY
  AllowedIPs = 192.168.96.2/32

IPSec で使用していた 4500 番ポートを WireGuard でも流用する。また、設定フィールド AllowedIPs は通信を許可するIPを列挙する。全て許可する場合は IPv4 なら 0.0.0.0/0, IPv6 ならば ::/0 を指定する。

Interface を作成のテスト。

1
2
3
4
5
root:~# wg-quick up wg0
[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -4 address add 192.168.96.1/24 dev wg0
[#] ip link set mtu 1380 up dev wg0

インターフェイスを確認する。

1
2
3
4
5
6
7
8
root:~# wg show
interface: wg0
  public key: SERVER_PUBLIC_KEY
  private key: (hidden)
  listening port: 4500

peer: CLIENT_PUBLIC_KEY
  allowed ips: 192.168.96.2/32

コマンド ip で確認する。

1
2
3
4
5
root:~# ip a show wg0
3: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1380 qdisc noqueue state UNKNOWN group default qlen 1000
    link/none
    inet 192.168.96.1/24 scope global wg0
       valid_lft forever preferred_lft forever

systemd への登録

インターフェイス名を指定する必要があり、 @ の後ろにインターフェイスを指定する。

1
2
3
  systemctl enable wg-quick@wg0
  systemctl start wg-quick@wg0
  systemctl status wg-quick@wg0

OpenBSD 側の設定

interface の作成

1
ifconfig wg0 create wgkey CLIENT_PRIVATE_KEY

インターフェイス状態の確認

1
2
3
4
5
denpasar# ifconfig wg
wg0: flags=8082<BROADCAST,NOARP,MULTICAST> mtu 1420
        index 10 priority 0 llprio 3
        wgpubkey CLIENT_PUBLIC_KEY
        groups: wg

サーバへ接続

1
ifconfig wg0 wgpeer SERVER_PUBLIC_KEY wgendpoint ip-of-ubuntu 4500 wgaip 192.168.96.2/32

インターフェイス状態の確認

1
2
3
4
5
6
7
8
9
denpasar# ifconfig wg0
wg0: flags=8082<BROADCAST,NOARP,MULTICAST> mtu 1420
        index 10 priority 0 llprio 3
        wgpubkey CLIENT_PUBLIC_KEY
        wgpeer SERVER_PUBLIC_KEY
                wgendpoint ip-of-ubutnu 4500
                tx: 0, rx: 0
                wgaip 192.168.96.2/32
        groups: wg
1
ifconfig wg0 192.168.96.2/24

MTU を変更する場合は次を指定する。今回はUbuntu側で自動で設定されていた 1380 を設定した。

1
ifconfig wg0 mtu 1380

また pf.conf に set skip on wg0 を追加して設定をリロードする必要があった。これをしないと packet が wg0 から外部にでていかなかった。

hostname.if への設定

起動時にWireGuardで自動接続するように /etc/hostname.wg0 を作成しておく。

1
2
3
4
wgkey CLIENT_PRIVATE_KEY
wgpeer SERVER_PUBLIC_KEY wgendpoint ip-of-ubuntu 4500 wgaip 192.168.96.1/32
inet 192.168.96.2/24
mtu 1380

WireGuard MTU について

WireGuard の header は合計で 16 Bytes で、パケットの最後に暗号関係の tag 16 Bytes が付与される。

field length
Type 1
Reserved 3
Receiver 4
Counter 8
payload X
tag 16

WireGuard の外側には Ether, IP, UDP のヘッダがあるため Ethernet フレームとして見ると次のような構成となっている。

header length
Ethernet 14
Outer IP 20
UDP 8
WireGuard 16
Innter IP 20
Payload X
tag 16
Eth FCS 4

PPPoE の場合は外側のIPパケットの MTU が 1454 となっている。

WireGuard の MTU はそこから Outer IP, UDP, WireGuard header, tag の合計 60 (= 20 + 8 + 16 + 16) Bytes を除いた 1394 Bytes となる。外側が IPv6 の場合は ヘッダ が 40 Bytes あるのでさらに 20 Bytes MTU が小さくなる。

環境

  • OpenBSD 6.9
  • Ubuntu 20.04

参考