⛏️

WireGuard概要まとめ

2021/10/03に公開

はじめに

私はVPNに関して素人ですので、間違いがありましたら指摘をお願いいたします。

背景

  • オンプレで稼働してたサーバーをクラウドに移すことになったのですが、稼働開始後のメンテナンス等を考えて、会社からも自宅からも簡単かつ安全に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

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

Discussion