WireGuard

提供: ArchWiki
2018年8月30日 (木) 00:20時点におけるKusakata (トーク | 投稿記録)による版 (同期)
ナビゲーションに移動 検索に移動

WireGuard のホームページより:

Wireguard は最先端の暗号技術を使用する非常にシンプルで高速な VPN です。IPSec よりも高速・単純・軽量・有用であることを目指しており、面倒なことを避けています。OpenVPN と比べると高いパフォーマンスを発揮します。WireGuard は組み込みインターフェイスからスーパーコンピュータまで様々な環境に対応する汎用の VPN として設計されています。最初は Linux カーネル用にリリースされており、幅広いデプロイが可能なクロスプラットフォームになる予定です。まだ開発途上ではありますが、最もセキュアで使いやすくシンプルな VPN とされています。
警告: WireGuard はセキュリティ監査を完全に通過してはおらずプロトコルはまだ変わる可能性があります [1]

インストール

wireguard-tools パッケージをインストールしてください。

使用方法

公開鍵と秘密鍵を作成するには:

$ wg genkey | tee privatekey | wg pubkey > publickey

ここでは以下の構成でピア間のトンネルを設定する方法を説明します:

Peer A Peer B
外部 IP アドレス 10.10.10.1/24 10.10.10.2/24
内部 IP アドレス 10.0.0.1/24 10.0.0.2/24
wireguard 使用ポート UDP/48574 UDP/39814

外部アドレスはあらかじめ用意してください。例えば、ピア A からピア B に ping 10.10.10.2 で ping が通るようにする必要があります。内部アドレスは ip コマンドで作成する新しいアドレスで、WireGuard ネットワーク内で内部的に共有します。IP アドレスの /24CIDR です。

Peer A の設定

このピアでは UDP ポート 48574 を開いて内部・外部 IP アドレスと公開鍵を紐づけてピア B からの接続を許可します:

# ip link add dev wg0 type wireguard
# ip addr add 10.0.0.1/24 dev wg0
# wg set wg0 listen-port 48574 private-key ./privatekey
# wg set wg0 peer [Peer B public key] persistent-keepalive 25 allowed-ips 10.0.0.2/32 endpoint 10.10.10.2:39814
# ip link set wg0 up

[Peer B public key]EsnHH9m6RthHSs+sd9uM6eCHe/mMVFaRh93GYadDDnM= という形式で指定してください。allowed-ips はトラフィックの送信を許可するアドレスのリストを指定してください。allowed-ips 0.0.0.0/0 であらゆるアドレスにトラフィックを送信できるようになります。

Peer B の設定

ピア A とほとんど同じですが、wireguard デーモンで使用するのは UDP ポート 39814 でピア A からの接続だけを許可します:

# ip link add dev wg0 type wireguard
# ip addr add 10.0.0.2/24 dev wg0
# wg set wg0 listen-port 39814 private-key ./privatekey
# wg set wg0 peer [Peer A public key] persistent-keepalive 25 allowed-ips 10.0.0.1/32 endpoint 10.10.10.1:48574
# ip link set wg0 up

基本チェック

パラメータを付けずに wg コマンドを呼び出すことで現在の設定を確認できます。

例えば、ピア A で実行すると以下のように表示されます:

peer-a$ wg
interface: wg0
  public key: UguPyBThx/+xMXeTbRYkKlP0Wh/QZT3vTLPOVaaXTD8=
  private key: (hidden)
  listening port: 48574

peer: 9jalV3EEBnVXahro0pRMQ+cHlmjE33Slo9tddzCVtCw=
  endpoint: 10.10.10.2:39814
  allowed ips: 10.0.0.2/32

トンネルの末端にアクセスすることができるはずです:

 peer-a$ ping 10.0.0.2

設定の永続化

showconf を使うことで設定を保存できます:

# wg showconf wg0 > /etc/wireguard/wg0.conf
# wg setconf wg0 /etc/wireguard/wg0.conf

ピア設定例

/etc/wireguard/wg0.conf
[Interface]
PrivateKey = [CLIENT PRIVATE KEY]

[Peer]
PublicKey = [SERVER PUBLICKEY]
AllowedIPs = 10.0.0.0/24, 10.123.45.0/24, 1234:4567:89ab::/48
Endpoint = [SERVER ENDPOINT]:51820
PersistentKeepalive = 25

VPN サーバーの設定

Wireguard には VPN サーバー・クライアントを管理するツール wg-quick が付属しています。

サーバー

/etc/wireguard/wg0server.conf
[Interface]
Address = 10.0.0.1/24  # This is the virtual IP address, with the subnet mask we will use for the VPN
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
ListenPort = 51820
PrivateKey = [SERVER PRIVATE KEY]

[Peer]
PublicKey = [CLIENT PUBLIC KEY]
AllowedIPs = 10.0.0.2/32  # This denotes the clients IP with a /32: the client only has ONE IP.

wg-quick up wg0server でインターフェイスが立ち上がり wg-quick down wg0server で終了します。

クライアント

/etc/wireguard/wg0.conf
[Interface]
Address = 10.0.0.2/24  # The client IP from wg0server.conf with the same subnet mask
PrivateKey = [CLIENT PRIVATE KEY]
DNS = 10.0.0.1

[Peer]
PublicKey = [SERVER PUBLICKEY]
AllowedIPs = 0.0.0.0/0, ::0/0
Endpoint = [SERVER ENDPOINT]:51820
PersistentKeepalive = 25

wg-quick up wg0 でインターフェイスが立ち上がり wg-quick down wg0 で終了します。

自動的に立ち上がるようにしたい場合は systemctl enable wg-quick@wg0 を実行してください。

NetworkManager を使用している場合、NetworkManager-wait-online.service を、systemd-networkd を使用している場合、systemd-networkd-wait-online.service を有効化することでネットワーク接続が有効になってからサービスが実行されるようになります。

ヒントとテクニック

秘密鍵を暗号化して保存

設定ファイルの [Interface] セクションの PrivateKey 行を以下のように置き換えることで秘密鍵を暗号化できます:

PostUp = wg set %i private-key <(su user -c "export PASSWORD_STORE_DIR=/path/to/your/store/; pass WireGuard/private-keys/%i")

user はユーザー名に置き換えてください。詳しくは wg-quick(8) を参照。

トラブルシューティング

DKMS モジュールが使用できない

wireguard-dkms をインストールしても以下のコマンドでモジュールが確認できない場合:

$ modprobe wireguard && lsmod | grep wireguard

あるいは以下のように新しいリンクを作成しようとするとエラーが表示される場合:

# ip link add dev wg0 type wireguard
RTNETLINK answers: Operation not supported

linux のヘッダーが存在しないのが原因かもしれません。

カーネルヘッダーは linux-headers または linux-lts-headers パッケージでインストールできます。