WireGuard設定 OpenBSDとUbuntuの接続
コンテンツ
OpenBSD, Linux どちもカーネルにWireGuard実装がマージされたため IPSec からWireGuard に変更したときのメモ。WireGuard は IPSec や OpenVPN に比べてシンプルなVPN。暗号化、鍵交換などの方式が固定されているためネゴシエーションが簡単になっているのだろう。
Ubuntu が固定IPをもち server 的に動作し、 OpenBSD が動的IPで client 的に動作するように設定する。前述のように暗号化、鍵交換などの方式が固定されているので VPN の両端で使用する秘密鍵、共有鍵とIPを設定すれば設定は完了である。
Ubuntu 側の設定
必要なプログラムのインストール。
|
|
秘密鍵、公開鍵の作成。
|
|
以降クライアント、サーバの秘密鍵、公開鍵を CLIENT_PRIVATE_KEY
, CLIENT_PUBLIC_KEY
, SERVER_PRIVATE_KEY
, SERVER_PUBLIC_KEY
と書く。
wireguard の設定
次を /etc/wireguard/wg0.conf
として作成する。
|
|
IPSec で使用していた 4500 番ポートを WireGuard でも流用する。また、設定フィールド AllowedIPs
は通信を許可するIPを列挙する。全て許可する場合は IPv4 なら 0.0.0.0/0
, IPv6 ならば ::/0
を指定する。
Interface を作成のテスト。
|
|
インターフェイスを確認する。
|
|
コマンド ip
で確認する。
|
|
systemd への登録
インターフェイス名を指定する必要があり、 @
の後ろにインターフェイスを指定する。
|
|
OpenBSD 側の設定
interface の作成
|
|
インターフェイス状態の確認
|
|
サーバへ接続
|
|
インターフェイス状態の確認
|
|
|
|
MTU を変更する場合は次を指定する。今回はUbuntu側で自動で設定されていた 1380 を設定した。
|
|
また pf.conf に set skip on wg0
を追加して設定をリロードする必要があった。これをしないと packet が wg0
から外部にでていかなかった。
hostname.if への設定
起動時にWireGuardで自動接続するように /etc/hostname.wg0
を作成しておく。
|
|
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
参考
-
OpenBSD
ifconfig(8)
, wireguard で使用するオプションについて説明がある -
ifconfig(8)
で不足する場合は device manualwg(4)
を見てみる -
OpenBSD での設定例
-
公式の quick start, linux 同士での接続
-
Archlinux wiki, linux での設定例が掲載されている
-
Ubuntu 20.04 での設定
-
公式の technial whitepaper
-
WireGuard の MTU について
作成者 Toru Mano
最終更新時刻 2023-01-01 (c70d5a1)