WireGuard
WireGuard のホームページより:
- Wireguard は最先端の暗号技術を使用する非常にシンプルで高速な VPN です。IPSec よりも高速・単純・軽量・有用であることを目指しており、面倒なことを避けています。OpenVPN と比べると高いパフォーマンスを発揮します。WireGuard は組み込みインターフェイスからスーパーコンピュータまで様々な環境に対応する汎用の VPN として設計されています。最初は Linux カーネル用にリリースされており、幅広いデプロイが可能なクロスプラットフォームになる予定です。まだ開発途上ではありますが、最もセキュアで使いやすくシンプルな VPN とされています。
目次
インストール
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 アドレスの /24
は CIDR です。
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
VPN サーバーの設定
Wireguard には VPN サーバー・クライアントを管理するツール wg-quick
が付属しています。
サーバー
/etc/wireguard/wg0server.conf
[Interface] Address = 10.200.100.1/24 PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE PostDown = iptables -D FORWARD -i %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.200.100.2/32 # This denotes the clients IP.
wg-quick up wg0server
でインターフェイスが立ち上がり wg-quick down wg0server
で終了します。
クライアント
/etc/wireguard/wg0.conf
[Interface] Address = 10.200.100.2/32 # The client IP from wg0server.conf PrivateKey = [CLIENT PRIVATE KEY] DNS = 10.200.100.1 [Peer] PublicKey = [SERVER PUBLICKEY] AllowedIPs = 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 パッケージでインストールできます。