背景
- オンプレで稼働してたサーバーをクラウドに移すことになったのですが、稼働開始後のメンテナンス等を考えて、会社からも自宅からも簡単かつ安全に VPN で繋ぐ方法を調べました。
- AWS などクラウド上のサーバーにオフィス・自宅に限らずセキュアに接続できるようにしたい。
- しかもそれをお手軽に構築したい。
- 絵にすると以下のようなイメージ。オフィスや自宅から接続したいが、一方で家族や非 IT 部門の人はサーバーに接続できないようにしたい。
WireGuard の特徴
- WireGuard はシンプルかつ最先端の暗号化を提供する VPN。
- 従来の VPN 製品に比べてセットアップも設定もシンプルで簡単。
- Linux, Windows ではカーネル領域で動作するためより高速。
- Linux カーネルでは 5.6 以降で WireGuard がカーネルに組み込まれている。
- ステルス性があるため、攻撃のターゲットになりにくい。
- VPN のピア間は UDP による通信であり、最初のパケットに正しい認証情報が含まれなければ応答しないため、TCP の3ウェイハンドシェイクのようなやり取りがなく、外部からポートが開いていることがわからない。
- 他の VPN ソフトウエアに比べてコードベースが小さいため、脆弱性が入り込む余地が少なく監査が容易。
- 暗号通信に ChaCha20,Poly-1305 などモダンで高速な暗号方式、認証・検証方式を採用している。
- これらの暗号方式はハードウェアによる支援が得られなくても高速に動作する。
- したがって、ハードウェアによる支援を受けられない ARM マシンでも高速に動作する
- iOS や Android 向けのアプリがあり、スマートフォンが直接 VPN ネットワークに参加可能。
- WireGuard に対応したルータは主要どころではまだないっぽい。なので PC 等にソフトウエアをインストールして個別に接続する感じ。
- WireGuard は公開鍵による認証であり、ユーザーにとっては SSH の認証モデルによく似ている。事前に公開鍵を相手側にもたせておいて通信を行う。
- VPN ホスト同士の一時鍵交換は2分に一回行われるが、鍵交換中のデータ通信も並列して行われる。鍵交換中に送られたデータは古い鍵による暗号化がなされているが、鍵が古くなってからも1分間は有効なため、データ転送に影響はない。

通信速度
以下は公式から引用した比較。ちょっと古いデータのようだが、OpenVPN に比べるとかなり速い。

ちなみに私の自宅(島根)から、さくら VPS 石狩、AWS 東京・大阪まで ping を打った時の RTT はだいたい
- さくら VPS 石狩: 50ms
- AWS 東京リージョン: 30ms
- AWS 大阪リージョン: 20ms
てな感じだった。
セットアップ
VPN である WireGuard には本来はサーバー・クライアントという概念はないですが、ここでは便宜的に AWS 側をサーバー、そこに接続する自宅やオフィスの PC 等で動作する WireGuard をクライアントとします。
サーバー側セットアップ
さくら VPS と、自宅 PC(Linux・Mac),そして iPhone で VPN 接続詞た時の手順を以下にまとめてあります。 さくらの VPS に WireGuard 入れて個人用途の VPN 環境作った
さくらの VPS はマネージドなファイアウォールがないようなので iptables で外部からのアクセス制御を行いましたが、AWS の場合はセキュリティグループやネットワーク ACL でアクセス制御すればいいと思います。
クライアント側セットアップ
- WireGuard 公式から、各 OS 向けのアプリが配布されています。
- カーネルが WireGuard をサポートしていない環境向けに Golang 実装の WireGuard/wireguard-goがあるようです。
Docker での使用
- 私は普段あまり Docker を使わないのですが、公式で Docker についても触れられています。
- WireGuard は Linux 上において、通常のネットワークインターフェイス(Eth0,Eth1 等)と同様の扱いのインターフェイス(wg0, wg1 等)を作成します。
- この時、Docker コンテナが使用するインターフェイスを WireGuard の作成したインターフィエイス(wg0, wg1 等)にすることで、Docker コンテナが外部と通信する手段を VPN 経由に限定し、暗号化された通信のみ行うように制限を掛けることができるようです。
IoT エッジでの WireGuard
ハードウェア支援無しで高速に処理できる WireGuard の特徴を活かし、IoT 分野でも今後普及していくかもしれません。
RaspberryPi
- RaspberryPi は現状、最新の Linux カーネルが 5.4 のようです。WireGuard は 5.6 からカーネルに組み込まれていますので、そのままでは使えないかな…と思ったら…
- RaspberryPi には PiVPN というアプリがあり、これが WireGuard に対応しているそうです。
- 参照: Setting up a WireGuard VPN on the Raspberry Pi
Arduino/ESP32
- ESP32 向けの WireGuard ライブラリが存在するようです。
IoT 分野での WireGuard の利点
- 前述したように、WireGuard は UDP ポートを開けておけばよく、なおかつ最初のパケットの認証情報が正しくなければ応答しないため、ステルス性が高く攻撃の対象になりにくいです。
- IoT 製品からアップロードされたセンサー値を TCP で受け取るサーバーは、TCP ポートをインターネットに開くよりも、WireGuard のための UDP ポートを開けておくだけにしておいて、TCP 通信は WireGuard 内で行うようにしたほうが安全な構成にできそうです。
- 通常、IoT エッジはルーターの内側や動的 IP アドレスの携帯網に存在するため、サーバー側からエッジに対して TCP セッションを張ることが難しいのですが、WireGuard では各デバイスに静的に IP アドレスを割り当てて双方向に通信できるため、サーバーからエッジに対してセッションオープンを要求するような要件にも応えられそうです。
- ネットワークカメラのルーターなどは以前からインターネット側からの攻撃や侵入の危険性がありましたが、WireGuard による VPN を使うことでカメラ側も UDP ポートを開けてるだけにすることができ、TCP ポートをインターネットに向けてオープンするよりは安全性が高まるのではないでしょうか。カメラを見る側も Windows やスマートフォン向けなどの WireGuard アプリを使えば比較的簡単に VPN を構築できるので現実的な選択肢になりうると思います。
制限事項
一応、公式に書いてあるとおり制限事項もあります。
- WireGuard 同士の通信は UDP のみで TCP はサポートしません。
- これはあくまで WireGuard 同士の VPN の通信が UDP のみということであって、その VPN を使って通信するプロトコルは TCP も当然サポートします。
- 公式によると、TCP を使った場合のネットワークパフォーマンスが酷いので使わないとのこと。
- 現時点でハードウェアによる暗号化はサポートされませんし、そういったハードウェア製品もありません。しかしながら WireGuard が使っている ChaCha20Poly1305 はハードウェアによるサポートがなくとも十分に高速に処理できるようです。
- WireGuard のローミングは追加の認証無しで行われるため、送信元 IP アドレスを書き換えることで通信の中間に入った盗聴者によってデータを盗聴される場合があります。ただ、盗聴されたデータは暗号化されており、攻撃者が復号化されたデータを見ることはできません。
- WireGuard は、デフォルトではポスト量子暗号ではありません。将来、量子コンピュータによって暗号化されたデータの復号ができる可能性があります。ただ、WireGuard には事前共有鍵が設定でき、これを設定することで量子コンピュータによる復号を防ぐことができます。
- WireGuard は相手側から送られてきたパケットの正当性にシステム時間を使用します。したがって、OS のシステム時刻を設定する場合に、攻撃者により制御可能な時刻同期サーバーなどは使うべきではありません。
以下はよく意味がわからなかった…
- WireGuard does not focus on obfuscation. Obfuscation, rather, should happen at a layer above WireGuard, with WireGuard focused on providing solid crypto with a simple implementation. It is quite possible to plug in various forms of obfuscation, however.
- Routing Loops * There are currently a few issues with detecting routing loops, locally and over a network, and there are various tricks like changing the outer src to the inner src.
感想など
- 実際の使用してみた感じでは非常に安定していますし通信速度にもほとんど影響ないようです。
- WiFi が再接続したり、スマートフォンが WiFi <-> 4G が切り替わったりしても遅延なく通信できます。
- セットアップや設定がお手軽で簡単でした。自宅から AWS につないだり自社につないだりするネットワークが簡単に構築できそうです。
なお、プロトコルの詳細に関してはこちらの動画が詳しくてわかり易かったです。 https://youtu.be/grDEBt7oQho