Ubuntu 22.04でWireGuardを設定する方法

はじめに

WireGuardは、IPv4およびIPv6接続をサポートする軽量な仮想プライベートネットワーク(VPN)です。VPNを使用すると、信頼できないネットワークをプライベートネットワーク上にいるかのように通過できます。これにより、ホテルやコーヒーショップなどの信頼できないネットワークに接続されているときに、スマートフォンやノートパソコンから安全かつ安全にインターネットにアクセスできるようになります。

WireGuardの暗号化は、ピア間で暗号化されたトンネルを確立するための公開鍵と秘密鍵に依存しています。各バージョンのWireGuardは、シンプルさ、セキュリティ、およびピアとの互換性を確保するために特定の暗号化暗号スイートを使用します。

一方、OpenVPNやIPSecなどの他のVPNソフトウェアは、トランスポート層セキュリティ(TLS)と証明書を使用してシステム間の認証と暗号化されたトンネルの確立を行います。TLSの異なるバージョンには、数百の異なる暗号化スイートやアルゴリズムをサポートするものがありますが、これによりさまざまなクライアントをサポートするための柔軟性が向上しますが、TLSを使用するVPNを構成することはより時間がかかり、複雑でエラーが発生しやすくなります。

このチュートリアルでは、Ubuntu 22.04 サーバーに WireGuard を設定し、その後別のマシンをIPv4とIPv6の両方を使用して接続するように構成します(一般的にデュアルスタック接続と呼ばれます)。また、WireGuard サーバーをゲートウェイ構成としてピアのインターネットトラフィックをルーティングし、VPN を暗号化されたピア間トンネルとして使用する方法も学びます。

このチュートリアルでは、WireGuard サーバーのピア(クライアントとも呼ばれます)として別の Ubuntu 22.04 システムを構成します。このシリーズの後続のチュートリアルでは、Windows、macOS、Android、およびiOS システムおよびデバイスに WireGuard をインストールして実行する方法について説明します。

注意: DigitalOcean Droplet に WireGuard を設定する場合は、多くのホスティングプロバイダーと同様に、帯域幅の超過に対して料金が発生することに注意してください。このため、サーバーが処理するトラフィック量に注意してください。this page を参照してください。

前提条件

このチュートリアルに従うには、次のものが必要です:

  • sudo 非ルートユーザーとファイアウォールが有効になっている Ubuntu 22.04 サーバー。これを設定するには、Initial Server Setup with Ubuntu 22.04 チュートリアルに従うことができます。これを本ガイドではWireGuard Serverと呼びます。
  • クライアントマシンが必要です。これはWireGuardサーバに接続するために使用します。このチュートリアルでは、このマシンをWireGuardピアと呼びます。このチュートリアルでは、WireGuardピアとしてローカルマシンを使用することを推奨しますが、希望する場合はリモートサーバや携帯電話をクライアントとして使用することもできます。リモートシステムを使用している場合は、後でこのチュートリアルのオプションセクションをすべて遵守するか、システムからロックアウトされる可能性があるため、注意してください。
  • IPv6を使用してWireGuardを使用するには、サーバがその種類のトラフィックをサポートするように構成されていることも確認する必要があります。IPv6サポートを有効にしたい場合は、DigitalOceanのDropletを使用している場合は、このドキュメントページを参照してください。DropletsでIPv6を有効にする方法。 Dropletを作成するとき、またはその後、そのページの手順に従ってIPv6サポートを追加できます。

ステップ1 — WireGuardのインストールとキーペアの生成

このチュートリアルの最初のステップは、WireGuardをサーバにインストールすることです。まずは、WireGuard Serverのパッケージインデックスを更新し、次のコマンドを使用してWireGuardをインストールします。このセッションで初めてsudoを使用する場合は、sudoユーザーのパスワードを入力するように求められる場合があります。

  1. sudo apt update
  2. sudo apt install wireguard

WireGuardがインストールされたので、次のステップはサーバー用の秘密鍵と公開鍵のペアを生成することです。組み込みのwg genkeyおよびwg pubkeyコマンドを使用してキーを作成し、その後、秘密鍵をWireGuardの設定ファイルに追加します。

また、chmodコマンドを使用して、さっき作成したキーのアクセス権を変更する必要があります。デフォルトでは、ファイルはサーバー上のすべてのユーザーによって読み取り可能です。

次のコマンドを使用して、WireGuardのための秘密鍵を作成し、そのアクセス権を変更します:

  1. wg genkey | sudo tee /etc/wireguard/private.key
  2. sudo chmod go= /etc/wireguard/private.key

sudo chmod go=...コマンドは、ルートユーザー以外のユーザーやグループによるファイルへのアクセス権をすべて削除し、秘密鍵にアクセスできるのはルートユーザーだけになるようにします。

出力されるのは、base64でエンコードされた1行の情報です。これが秘密鍵です。また、出力のコピーは/etc/wireguard/private.keyファイルにも保存され、後でtee部分のコマンドによって参照できるようになります。出力された秘密鍵は後でこのセクションでWireGuardの設定ファイルに追加する必要があるので、注意してメモしておいてください。

次のステップは、対応する公開鍵を作成することです。これは秘密鍵から派生します。次のコマンドを使用して公開鍵ファイルを作成します:

  1. sudo cat /etc/wireguard/private.key | wg pubkey | sudo tee /etc/wireguard/public.key

このコマンドは、|(パイプ)演算子を使用して連結された3つの個々のコマンドで構成されています。

  • sudo cat /etc/wireguard/private.key:このコマンドはプライベートキーファイルを読み込み、それを標準出力ストリームに出力します。
  • wg pubkey:2番目のコマンドは、最初のコマンドからの出力を標準入力として受け取り、それを処理して公開鍵を生成します。
  • sudo tee /etc/wireguard/public.key:最後のコマンドは、公開鍵生成コマンドの出力を受け取り、/etc/wireguard/public.keyという名前のファイルにリダイレクトします。

コマンドを実行すると、再度base64でエンコードされた単一行の出力が返され、これがWireGuardサーバーのパブリックキーです。サーバーに接続するすべてのピアに公開キーを配布する必要があるので、参照用にどこかにコピーしてください。

ステップ2 — IPv4とIPv6アドレスの選択

前のセクションではWireGuardをインストールし、サーバーとの間のトラフィックを暗号化するために使用されるキーペアを生成しました。このセクションでは、サーバー用の構成ファイルを作成し、サーバーが再起動すると自動的にWireGuardを起動するように設定します。また、WireGuardサーバーとピアで使用するプライベートIPv4およびIPv6アドレスを定義します。

IPv4とIPv6アドレスの両方を使用する予定の場合は、これらのセクションの両方に従ってください。それ以外の場合は、VPNのネットワーク要件に応じた適切なセクションの手順に従ってください。

ステップ2(a) — IPv4レンジの選択

IPv4ピアとともにWireGuardサーバーを使用している場合、サーバーにはクライアントおよびトンネルインターフェイスで使用するためのプライベートIPv4アドレスのレンジが必要です。次の予約済みのアドレスブロックから任意の範囲のIPアドレスを選択できます(これらのブロックがどのように割り当てられているかについて詳しくは、RFC 1918仕様を参照してください):

  • 10.0.0.0から10.255.255.255(10/8プレフィックス)
  • 172.16.0.0から172.31.255.255(172.16/12プレフィックス)
  • 192.168.0.0から192.168.255.255(192.168/16プレフィックス)

このチュートリアルでは、最初の予約済みIPの範囲からのIPアドレスブロックとして10.8.0.0/24を使用します。この範囲では最大255の異なるピア接続を許可し、通常は他のプライベートIPレンジと重複したり競合するアドレスを持つべきではありません。この例の範囲がネットワーク構成と互換性がない場合は、ネットワーク構成に適したアドレス範囲を選択してください。

WireGuardサーバーは、そのプライベートトンネルIPv4アドレスの範囲から1つのIPアドレスを使用します。ここでは10.8.0.1/24を使用しますが、10.8.0.1から10.8.0.255の範囲内の任意のアドレスを使用できます。異なるアドレスを使用する場合は、選択したIPアドレスに注意してください。ステップ3 — WireGuardサーバー構成の作成で定義される構成ファイルにこのIPv4アドレスを追加します。

ステップ2(b) — IPv6範囲の選択

WireGuardをIPv6で使用する場合は、RFC 4193のアルゴリズムに基づいて一意のローカルIPv6ユニキャストアドレスプレフィックスを生成する必要があります。WireGuardで使用するアドレスは、仮想トンネルインタフェースに関連付けられます。予約されたfd00::/8のプライベートIPv6アドレスブロック内でランダムで一意のIPv6プレフィックスを生成するために、いくつかの手順を完了する必要があります。

RFCによると、一意のIPv6プレフィックスを取得する推奨される方法は、時刻とシリアル番号やデバイスIDなどのユニークな識別値を組み合わせてハッシュ化し、切り捨てることで、予約されたプライベートfd00::/8ブロック内の一意のアドレスとして使用できるビットのセットを生成することです。

WireGuardサーバーのIPv6レンジを生成する準備をするには、次のコマンドを使用して64ビットのタイムスタンプを収集します:

  1. date +%s%N

次に、次のような数値を受け取ります。これは、1970-01-01 00:00:00 UTC以降の秒数(dateコマンドの%s)とナノ秒(%N)が組み合わさったものです:

Output
1650301699497770167

この値を後でこのセクションで使用するためにどこかに記録してください。次に、サーバーの/var/lib/dbus/machine-idファイルからmachine-id値をコピーします。この識別子はシステム固有であり、サーバーが存在する限り変更されるべきではありません。

  1. cat /var/lib/dbus/machine-id

以下のような出力を受け取ります:

/var/lib/dbus/machine-id
610cef4946ed46da8f71dba9d66c67fb

次に、タイムスタンプをmachine-idと組み合わせ、その結果の値をSHA-1アルゴリズムでハッシュ化する必要があります。コマンドは以下の形式を使用します:

printf <timestamp><machine-id> | sha1sum

次のコマンドを実行し、タイムスタンプとマシン識別値を代入してください:

  1. printf 1650301699497770167610cef4946ed46da8f71dba9d66c67fb | sha1sum

以下のようなハッシュ値を受け取ります:

Output
442adea1488d96388dae9ab816045b24609a6c18 -

なお、sha1sumコマンドの出力は16進数であり、1バイトのデータを表すために2文字を使用します。例えば、例の出力の4f26は、ハッシュ化されたデータの最初の2バイトです。

RFCのアルゴリズムでは、ハッシュ化された出力の最下位(末尾)の40ビット、または5バイトだけが必要です。最後の5つの16進数エンコードされたバイトを出力するためにcutコマンドを使用してください。

  1. printf 442adea1488d96388dae9ab816045b24609a6c18 | cut -c 31-

-c引数はcutコマンドに指定された文字のセットのみを選択するように指示します。31-引数はcutに対して、入力行の位置31から最後までのすべての文字を出力するように指示します。

次のような出力を受け取るはずです:

Output
24609a6c18

この例の出力では、バイトのセットは次のとおりです:24 60 9a 6c 18

これで、fdプレフィックスを使用して生成された5バイトを、可読性のために:コロンで各2バイトごとに区切り、IPv6ネットワークプレフィックスを構築できます。各サブネット内のユニークプレフィックスは、合計で18,446,744,073,709,551,616個のIPv6アドレスを保持できるため、単純化のためにサブネットを標準サイズの/64に制限できます。

/64サブネットサイズで以前に生成されたバイトを使用すると、次のような結果のプレフィックスになります:

Unique Local IPv6 Address Prefix
fd24:609a:6c18::/64

このfd24:609a:6c18::/64範囲を使用して、サーバーとピアのWireGuardトンネルインターフェースに個々のIPアドレスを割り当てます。サーバー用にIPを割り当てるには、最後の::文字の後に1を追加します。結果のアドレスはfd24:609a:6c18::1/64になります。ピアは範囲内の任意のIPを使用できますが、通常、ピアを追加するたびに値を1つ増やします。たとえば、fd24:609a:6c18::2/64です。IPのメモを作成し、次のチュートリアルのWireGuardサーバーの設定を進めてください。

ステップ3 — WireGuardサーバーの構成の作成

WireGuardサーバーの構成を作成する前に、次の情報が必要です:

  1. WireGuardのインストールとキーペアの生成のステップ1で、プライベートキーを利用可能にしてください。

  2. IPv4でWireGuardを使用している場合は、ステップ2(a) — IPv4レンジの選択でサーバーに選択したIPアドレスが必要です。この例では、10.8.0.1/24です。

  3. IPv6でWireGuardを使用している場合は、ステップ2(b) — IPv6レンジの選択で生成したサーバーのIPアドレスが必要です。この例では、fd24:609a:6c18::1/64です。

必要な秘密鍵とIPアドレスを取得したら、次のコマンドを実行して、nanoまたは好みのエディターを使用して新しい構成ファイルを作成します:

  1. sudo nano /etc/wireguard/wg0.conf

次の行をファイルに追加し、ハイライトされたbase64_encoded_private_key_goes_hereの値の部分に自分の秘密鍵を、Address行にIPアドレスを置換します。また、WireGuardを別のポートで利用できるようにListenPort行を変更することもできます:

/etc/wireguard/wg0.conf
[Interface] PrivateKey = base64_encoded_private_key_goes_here Address = 10.8.0.1/24, fd24:609a:6c18::1/64 ListenPort = 51820 SaveConfig = true

SaveConfig行は、WireGuardインターフェースがシャットダウンされると、変更が構成ファイルに保存されることを保証します。

/etc/wireguard/wg0.confファイルを保存して閉じます。使用している場合は、nanoを使用してCTRL+Xを押し、Yを押してENTERを押して確認します。これで、WireGuard VPNサーバーを使用方法に応じて構築できる初期サーバー構成が完成しました。

ステップ4 – WireGuardサーバーのネットワーク構成の調整

もしWireGuardを使用してピアをWireGuardサーバーに接続し、サーバーのみのサービスにアクセスしたい場合は、このセクションを完了する必要はありません。もしWireGuardピアのインターネットトラフィックをWireGuardサーバー経由でルーティングしたい場合は、チュートリアルのこのセクションに従ってIPフォワーディングを設定する必要があります。

フォワーディングを設定するには、お好みのエディター(nanoなど)を使用して/etc/sysctl.confファイルを開きます。

  1. sudo nano /etc/sysctl.conf

WireGuardを使用してIPv4を利用している場合は、ファイルの末尾に次の行を追加します:

/etc/sysctl.conf
net.ipv4.ip_forward=1

WireGuardを使用してIPv6を利用している場合は、ファイルの末尾に次の行を追加します:

/etc/sysctl.conf
net.ipv6.conf.all.forwarding=1

IPv4とIPv6の両方を使用している場合は、両方の行を含めるようにしてください。編集が終了したら、ファイルを保存して閉じます。

ファイルを読み込んで新しい値を現在のターミナルセッションにロードするには、次を実行します:

  1. sudo sysctl -p
Output
net.ipv6.conf.all.forwarding = 1 net.ipv4.ip_forward = 1

これで、WireGuardサーバーは仮想VPNイーサネットデバイスからの着信トラフィックをサーバー上の他のデバイスに転送し、そこからインターネットに公開できるようになります。この設定を使用すると、WireGuardピアからのすべてのWebトラフィックをサーバーのIPアドレス経由でルーティングし、クライアントの公開IPアドレスを効果的に隠すことができます。

ただし、トラフィックを正しくサーバー経由でルーティングする前に、いくつかのファイアウォールルールを設定する必要があります。これらのルールにより、WireGuardサーバーとピア間のトラフィックが適切に流れるようになります。

ステップ5 — WireGuardサーバーのファイアウォールの設定

このセクションでは、WireGuardサーバーの構成を編集して、サーバーとクライアント間のトラフィックが正しくルーティングされるようにファイアウォールルールを追加します。前のセクションと同様に、WireGuard VPNをVPNに制限されたリソースにアクセスするためのマシン間接続にのみ使用する場合は、このステップをスキップしてください。

WireGuard VPNトラフィックをサーバーのファイアウォールを介して許可するには、iptablesのコンセプトであるマスカレーディングを有効にする必要があります。これは、クライアント接続を正しくルーティングするためにオンザフライで動的なネットワークアドレス変換(NAT)を提供します。

まず、ip routeサブコマンドを使用してWireGuardサーバーのパブリックネットワークインターフェースを見つけます。

  1. ip route list default

パブリックインターフェースは、このコマンドの出力内で「dev」の後に続く文字列です。例えば、この結果はeth0という名前のインターフェースを示しており、以下にハイライトされています。

Output
default via 203.0.113.1 dev eth0 proto static

デバイスの名前をメモしておいて、次のステップでiptablesルールに追加します。

WireGuardサーバーにファイアウォールルールを追加するには、再度nanoまたは好きなエディターで/etc/wireguard/wg0.confファイルを開きます。

  1. sudo nano /etc/wireguard/wg0.conf

ファイルの最後の行にSaveConfig = trueの後に、以下の行を貼り付けます。

/etc/wireguard/wg0.conf
. . . PostUp = ufw route allow in on wg0 out on eth0 PostUp = iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE PostUp = ip6tables -t nat -I POSTROUTING -o eth0 -j MASQUERADE PreDown = ufw route delete allow in on wg0 out on eth0 PreDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE PreDown = ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

PostUpラインは、WireGuardサーバーが仮想VPNトンネルを開始するときに実行されます。ここでは、次の例で、3つのufwおよびiptablesルールが追加されます:

  • ufw route allow in on wg0 out on eth0 – このルールは、wg0 VPNインターフェイスに入力されるIPv4およびIPv6トラフィックをサーバーのeth0ネットワークインターフェイスに転送することを許可します。これは、前のセクションで構成したnet.ipv4.ip_forwardおよびnet.ipv6.conf.all.forwarding sysctl値と連動します。
  • iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE – このルールは、マスカレーディングを設定し、wg0 VPNインターフェイスに入力されるIPv4トラフィックを再書き換えて、それがWireGuardサーバーのパブリックIPv4アドレスから直接発信されたもののように見えるようにします。
  • ip6tables -t nat -I POSTROUTING -o eth0 -j MASQUERADE – このルールは、マスカレーディングを設定し、wg0 VPNインターフェイスに入力されるIPv6トラフィックを再書き換えて、それがWireGuardサーバーのパブリックIPv6アドレスから直接発信されたもののように見えるようにします。

PreDownルールは、WireGuardサーバーが仮想VPNトンネルを停止するときに実行されます。これらのルールはPostUpルールの逆であり、VPNが停止されたときにVPNインターフェイスの転送およびマスカレーディングルールを元に戻します。

どちらの場合も、IPv4およびIPv6のルールが適切かどうかを確認して構成を編集します。たとえば、IPv4のみを使用している場合は、ip6tablesコマンドの行を除外できます。

逆に、IPv6のみを使用している場合は、設定を編集してip6tablesコマンドのみを含めるようにします。ufwの行は、IPv4とIPv6ネットワークの組み合わせに対して存在する必要があります。作業が完了したら、ファイルを保存して閉じます。

WireGuardサーバーのファイアウォールを構成する最後の部分は、WireGuard UDPポート自体へのトラフィックを許可することです。サーバーの/etc/wireguard/wg0.confファイルでポートを変更していない場合、開くポートは51820です。構成を編集する際に異なるポートを選択した場合は、次のUFWコマンドにそれを置き換えてください。

前提チュートリアルをフォローする際にSSHポートを開いていない場合は、ここに追加してください。

  1. sudo ufw allow 51820/udp
  2. sudo ufw allow OpenSSH

注意: 別のファイアウォールを使用している場合や、UFWの構成をカスタマイズしている場合は、追加のファイアウォールルールを追加する必要がある場合があります。たとえば、すべてのネットワークトラフィックをVPN接続経由でトンネリングすることに決定した場合、DNSリクエストに対してポート53のトラフィックが許可されていることを確認する必要があり、HTTPトラフィックおよびHTTPSトラフィックに対してはポート80および443が許可されていることを確認する必要があります。VPN経由で使用している他のプロトコルがある場合は、それらのルールも追加する必要があります。

これらのルールを追加した後、UFWを無効にして再度有効にして、変更したすべてのファイルから変更内容を読み込み直します。

  1. sudo ufw disable
  2. sudo ufw enable

ルールが適用されていることを確認するには、ufw statusコマンドを実行してください。実行すると、以下のような出力が得られるはずです。

  1. sudo ufw status
Output
Status: active To Action From -- ------ ---- 51280/udp ALLOW Anywhere 22/tcp ALLOW Anywhere 51280/udp (v6) ALLOW Anywhere (v6) 22/tcp (v6) ALLOW Anywhere (v6)

WireGuardサーバーは、VPNのトラフィックを正しく処理するように構成されました。これには、ピア向けの転送とマスカレーディングも含まれます。ファイアウォールルールが設定されているため、WireGuardサービス自体を開始してピア接続を待ち受けることができます。

ステップ6 — WireGuardサーバーの開始

WireGuardは、組み込みのwg-quickスクリプトを使用してsystemdサービスとして実行するように構成できます。VPNを使用するたびにトンネルを手動で作成することもできますが、これは反復的でエラーが発生しやすい手順です。代わりに、systemctlを使用してwg-quickスクリプトの支援を受けてトンネルを管理できます。

systemdサービスを使用すると、WireGuardを起動時に起動できるように設定できます。これにより、サーバーが稼働している限りいつでもVPNに接続できます。これを行うには、systemctlwg0トンネルのwg-quickサービスを有効にして定義したものを追加します:

  1. sudo systemctl enable [email protected]

このコマンドでは、トンネル名wg0がサービス名の一部として指定されています。この名前は/etc/wireguard/wg0.conf構成ファイルにマッピングされます。この名前付けのアプローチを使用すると、サーバーを使用して複数の独立したVPNトンネルを作成できます。

たとえば、トンネルデバイスを prod という名前で作成し、その設定ファイルは /etc/wireguard/prod.conf になります。各トンネル設定には異なるIPv4、IPv6、およびクライアントファイアウォール設定を含めることができます。これにより、複数の異なるピア接続をサポートし、それぞれ固有のIPアドレスとルーティングルールを持たせることができます。

今、サービスを開始します:

  1. sudo systemctl start [email protected]

次のコマンドを使用して、WireGuardサービスがアクティブであることをダブルチェックしてください。出力には active (running) が表示されるはずです:

  1. sudo systemctl status [email protected]
Output
[email protected] - WireGuard via wg-quick(8) for wg0 Loaded: loaded (/lib/systemd/system/[email protected]; enabled; vendor preset: enabled) Active: active (exited) since Mon 2022-04-18 17:22:13 UTC; 2s ago Docs: man:wg-quick(8) man:wg(8) https://www.wireguard.com/ https://www.wireguard.com/quickstart/ https://git.zx2c4.com/wireguard-tools/about/src/man/wg-quick.8 https://git.zx2c4.com/wireguard-tools/about/src/man/wg.8 Process: 98834 ExecStart=/usr/bin/wg-quick up wg0 (code=exited, status=0/SUCCESS) Main PID: 98834 (code=exited, status=0/SUCCESS) CPU: 193ms Apr 18 17:22:13 thats-my-jam wg-quick[98834]: [#] wg setconf wg0 /dev/fd/63 Apr 18 17:22:13 thats-my-jam wg-quick[98834]: [#] ip -4 address add 10.8.0.1/24 dev wg0 Apr 18 17:22:13 thats-my-jam wg-quick[98834]: [#] ip -6 address add fd24:609a:6c18::1/64 dev wg0 Apr 18 17:22:13 thats-my-jam wg-quick[98834]: [#] ip link set mtu 1420 up dev wg0 Apr 18 17:22:13 thats-my-jam wg-quick[98834]: [#] ufw route allow in on wg0 out on ens3 Apr 18 17:22:13 thats-my-jam wg-quick[98890]: Rule added Apr 18 17:22:13 thats-my-jam wg-quick[98890]: Rule added (v6) Apr 18 17:22:13 thats-my-jam wg-quick[98834]: [#] iptables -t nat -I POSTROUTING -o ens3 -j MASQUERADE Apr 18 17:22:13 thats-my-jam wg-quick[98834]: [#] ip6tables -t nat -I POSTROUTING -o ens3 -j MASQUERADE Apr 18 17:22:13 thats-my-jam systemd[1]: Finished WireGuard via wg-quick(8) for wg0.

出力には、構成ファイルに追加したIPv4およびIPv6アドレスを仮想デバイス wg0 を作成し、それに割り当てるために使用される ip コマンドが表示されます。これらのルールを使用してトンネルをトラブルシューティングしたり、必要に応じてVPNインターフェースを手動で構成する場合には、wg コマンド自体を使用できます。

サーバーが構成され、実行されたら、次のステップはクライアントマシンを WireGuard ピアとして構成し、WireGuard サーバーに接続することです。

ステップ7 — WireGuardピアの構成

WireGuardピアの構成は、WireGuardサーバーの設定と似ています。クライアントソフトウェアをインストールしたら、公開鍵と秘密鍵のペアを生成し、ピア用のIPアドレスを決定し、ピア用の構成ファイルを定義し、その後、wg-quick スクリプトを使用してトンネルを開始します。

VPNにピアを追加するには、以下の手順に従ってキーペアと設定を生成します。VPNに複数のピアを追加する場合は、彼らのプライベートIPアドレスを追跡し、衝突を防ぐようにしてください。

WireGuardピアを構成するには、次のaptコマンドを使用してWireGuardパッケージがインストールされていることを確認してください。WireGuardピアで次のコマンドを実行します:

  1. sudo apt update
  2. sudo apt install wireguard

WireGuardピアのキーペアの作成

次に、サーバーで使用した手順と同じ手順を使用して、ピア上でキーペアを生成する必要があります。ピアとして機能するローカルマシンまたはリモートサーバーから、次のコマンドを使用してピアのプライベートキーを作成します:

  1. wg genkey | sudo tee /etc/wireguard/private.key
  2. sudo chmod go= /etc/wireguard/private.key

再度、base64でエンコードされた出力の1行が表示されます。これがプライベートキーです。出力のコピーは/etc/wireguard/private.keyにも保存されます。出力されるプライベートキーを注意深くメモしておいてください。後でこのセクションのWireGuardの設定ファイルに追加する必要があります。

次に、次のコマンドを使用して公開キーファイルを作成します:

  1. sudo cat /etc/wireguard/private.key | wg pubkey | sudo tee /etc/wireguard/public.key

再度、base64でエンコードされた出力の1行が表示されます。これがWireGuardピアの公開キーです。暗号化された接続を確立するために、この公開キーをWireGuardサーバーに配布する必要があるので、どこかにコピーしておいてください。

WireGuardピアの構成ファイルの作成

キーペアを取得したので、WireGuardサーバーに接続するために必要なすべての情報を含むピアの構成ファイルを作成できます。

構成ファイルにはいくつかの情報が必要です:

  • ピアで生成したbase64エンコードされた秘密鍵。

  • WireGuardサーバーで定義したIPv4およびIPv6アドレス範囲。

  • WireGuardサーバーからのbase64エンコードされた公開鍵。

  • WireGuardサーバーの公開IPアドレスとポート番号。通常、これはIPv4アドレスになりますが、サーバーにIPv6アドレスがあり、クライアントマシンがインターネットへのIPv6接続を持っている場合は、代わりにIPv4の代わりにこれを使用できます。

この情報を手元にして、WireGuardピアマシンで新しい/etc/wireguard/wg0.confファイルを開き、nanoまたはお好みのエディタを使用します:

  1. sudo nano /etc/wireguard/wg0.conf

ファイルに以下の行を追加し、必要に応じて各データをハイライトされたセクションに置換してください:

/etc/wireguard/wg0.conf
[Interface] PrivateKey = base64_encoded_peer_private_key_goes_here Address = 10.8.0.2/24 Address = fd24:609a:6c18::2/64 [Peer] PublicKey = U9uE2kb/nrrzsEU58GD3pKFU3TLYDMCbetIsnV8eeFE= AllowedIPs = 10.8.0.0/24, fd24:609a:6c18::/64 Endpoint = 203.0.113.1:51820

最初のAddress行が以前に選択した10.8.0.0/24サブネットからのIPv4アドレスを使用していることに注目してください。このIPアドレスは、サーバーのIPと異なる限り、サブネット内であれば何でも構いません。ピアを追加するたびにアドレスを1つずつ増やすことが、IPを割り当てる最も簡単な方法です。

同様に、2番目のAddress行が以前に生成したサブネットからのIPv6アドレスを使用し、サーバーのアドレスを1つ増やしていることに注目してください。別のアドレスを使用する場合は、範囲内の任意のIPが有効です。

ファイルのもう1つの注目すべき部分は、最後のAllowedIPs行です。これらの2つのIPv4およびIPv6の範囲は、宛先システムがどちらかの範囲内のIPアドレスを持っている場合にのみ、ピアにVPN経由でトラフィックを送信するよう指示します。AllowedIPsディレクティブを使用して、ピア上のVPNを他のピアやVPN上のサービスにのみ接続するように制限するか、VPN経由ですべてのトラフィックをトンネル化し、WireGuardサーバーをゲートウェイとして使用するように設定できます。

IPv4のみを使用する場合は、末尾のfd24:609a:6c18::/64範囲(,カンマを含む)を省略します。逆に、IPv6のみを使用する場合は、10.8.0.0/24のIPv4範囲を含めずにfd24:609a:6c18::/64接頭辞のみを含めます。

両方の場合、すべてのピアのトラフィックをVPN経由で送信し、WireGuardサーバーをすべてのトラフィックのゲートウェイとして使用したい場合は、0.0.0.0/0を使用できます。これは完全なIPv4アドレススペースを表し、IPv6アドレススペース全体には::/0を使用します。

(オプション)トンネルを介したすべてのトラフィックをルーティングするピアの構成

ピアのすべてのトラフィックを0.0.0.0/0または::/0ルートを使用してトンネル経由でルーティングすることを選択した場合、およびピアがリモートシステムの場合、このセクションの手順を完了する必要があります。ピアがローカルシステムの場合は、このセクションをスキップするのが最善です。

SSHやその他のプロトコルを使用してパブリックIPアドレスを介してアクセスするリモートピアの場合、ピアのwg0.confファイルにいくつかの追加ルールを追加する必要があります。これらのルールにより、トンネルが接続されているときにシステムに外部から接続できるようになります。それ以外の場合、トンネルが確立されると、通常はパブリックネットワークインターフェイスで処理されるすべてのトラフィックが、wg0トンネルインターフェイスをバイパスするように正しくルーティングされないため、リモートシステムにアクセスできなくなります。

まず、システムがデフォルトゲートウェイとして使用するIPアドレスを決定する必要があります。次のip routeコマンドを実行します:

  1. ip route list table main default

以下のような出力が表示されます:

Output
default via 203.0.113.1 dev eth0 proto static

ゲートウェイの強調されたIPアドレス203.0.113.1を後で使用するためにメモしてください。また、デバイスeth0を見つけます。デバイス名が異なる場合は、次のコマンドでeth0の代わりにそれを置き換えてください。

次に、ip address showコマンドを使用して、システムのパブリックIPを見つけます。

  1. ip -brief address show eth0

次のような出力が得られます:

Output
eth0 UP 203.0.113.5/20 10.20.30.40/16 2604:a880:400:d1::3d3:6001/64 fe80::68d5:beff:feff:974c/64

この例の出力では、ハイライトされた203.0.113.5 IP(末尾の/20なし)が、eth0デバイスに割り当てられているパブリックアドレスであり、WireGuard構成に追加する必要があります。

次に、WireGuardピアの/etc/wireguard/wg0.confファイルをnanoまたはお好みのエディタで開きます。

  1. sudo nano /etc/wireguard/wg0.conf

[Peer]行の前に、次の4行を追加します。

PostUp = ip rule add table 200 from 203.0.113.5
PostUp = ip route add table 200 default via 203.0.113.1
PreDown = ip rule delete table 200 from 203.0.113.5
PreDown = ip route delete table 200 default via 203.0.113.1

[Peer]
. . .

これらの行は、カスタムルーティングルールを作成し、システムへのパブリックトラフィックがデフォルトゲートウェイを使用するようにカスタムルートを追加します。

  • PostUp = ip rule add table 200 from 203.0.113.5 – このコマンドは、IPがシステムのパブリックIPである203.0.113.5アドレスに一致する場合に、テーブル番号が200のルーティングエントリをチェックするルールを作成します。
  • PostUp = ip route add table 200 default via 203.0.113.1 – このコマンドは、テーブル200で処理されるトラフィックがWireGuardインターフェースの代わりに203.0.113.1ゲートウェイを使用することを保証します。

PreDown行は、トンネルがシャットダウンされたときにカスタムルールとルートを削除します。

注意:200のテーブル番号は、これらのルールを構築する際に任意です。2から252までの値を使用するか、/etc/iproute2/rt_tablesファイルにラベルを追加して数値の代わりに名前を参照することができます。

Linuxでルーティングテーブルがどのように機能するかの詳細については、LinuxでIPレイヤーネットワーク管理ガイドルーティングテーブルセクションを参照してください。

VPN経由ですべてのピアのトラフィックをルーティングしている場合は、ステップ4 — WireGuardサーバーのネットワーク構成の調整ステップ5 — WireGuardサーバーのファイアウォールの設定で、WireGuardサーバーのsysctlおよびiptablesルールが正しく構成されていることを確認してください。

(オプション) WireGuardピアのDNSリゾルバの設定

WireGuardサーバーをVPNゲートウェイとして使用している場合は、すべてのピアのトラフィックに対してDNSリゾルバーを指定する[Interface]セクションに行を追加する必要があります。この設定を追加しないと、DNSリクエストはVPNによって保護されない可能性があるか、またはインターネットサービスプロバイダーまたは他の第三者に露出する可能性があります。

WireGuardをVPNネットワーク上のリソースにアクセスするためだけに使用するか、ピア間の構成にのみ使用している場合は、このセクションをスキップできます。

ピアの構成にDNSリゾルバーを追加するには、まずWireGuardサーバーが使用しているDNSサーバーを特定します。次のコマンドをWireGuardサーバーで実行します。デバイス名がこの例と異なる場合はeth0の代わりにEthernetデバイス名を置換します。

  1. resolvectl dns eth0

以下のような出力が表示されます:

Output
Link 2 (eth0): 67.207.67.2 67.207.67.3 2001:4860:4860::8844 2001:4860:4860::8888

出力されるIPアドレスは、サーバーが使用しているDNSリゾルバーです。必要に応じて、すべてを使用するか、IPv4またはIPv6のみを使用するかを選択できます。使用するリゾルバーをメモしておきます。

次に、選択したリゾルバーをWireGuardピアの構成ファイルに追加する必要があります。再びWireGuardピアに戻り、nanoまたはお好みのエディターを使用して/etc/wireguard/wg0.confファイルを開きます:

  1. sudo nano /etc/wireguard/wg0.conf

[Peer]行の前に、次の行を追加します:

DNS = 67.207.67.2 2001:4860:4860::8844

[Peer]
. . .

IPv4およびIPv6の設定については、好みや要件に応じてリストを編集できます。

次の手順でVPNに接続されたら、DNS leak test.comのようなサイトを使用してVPN経由でDNSクエリが送信されていることを確認できます。

また、resolvectl dnsコマンドを使用して、ピアが設定されたリゾルバを使用しているかどうかも確認できます。サーバーで実行したのと同様の出力が表示されるはずです。VPNトンネルのために構成したDNSリゾルバが表示されます。

Output
Global: 67.207.67.2 67.207.67.3 . . .

これらのDNSリゾルバ設定がすべて完了したら、次はピアの公開キーをサーバーに追加し、その後ピアでWireGuardトンネルを開始する準備が整います。

ステップ8 — WireGuardサーバーにピアの公開キーを追加する

ピアをサーバーに接続する前に、WireGuardサーバーにピアの公開キーを追加することが重要です。この手順を完了することで、VPN経由でトラフィックを送受信できるようになります。この手順を完了しないと、WireGuardサーバーはトンネル経由でのトラフィックの送受信を許可しません。

WireGuardピアのbase64エンコードされた公開キーのコピーがあることを確認して、次のコマンドを実行します。

  1. sudo cat /etc/wireguard/public.key
Output
PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg=

そして、WireGuardサーバーにログインし、次のコマンドを実行します。

  1. sudo wg set wg0 peer PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg= allowed-ips 10.8.0.2,fd24:609a:6c18::2

注意してください、コマンドのallowed-ips部分は、IPv4とIPv6アドレスのコンマ区切りのリストを取ります。ピアが自分に割り当てることができるIPアドレスを制限したい場合は、個々のIPを指定することもできますし、VPNレンジ内の任意のIPアドレスを使用できる場合は、例のように範囲を指定することもできます。また、2つのピアが同じallowed-ips設定を持つことはできないことに注意してください。

既存のピアのallowed-ipsを更新したい場合は、同じコマンドを再実行して、IPアドレスを変更できます。複数のIPアドレスがサポートされています。たとえば、追加したばかりのWireGuardピアに10.8.0.2fd24:609a:6c18::2のIPに10.8.0.100などのIPを追加したい場合は、次のように実行します:

  1. sudo wg set wg0 peer PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg= allowed-ips 10.8.0.2,10.8.0.100,fd24:609a:6c18::2

ピアを追加するコマンドを実行した後は、サーバー上でトンネルの状態を確認するためにwgコマンドを使用します:

  1. sudo wg
Output
interface: wg0 public key: U9uE2kb/nrrzsEU58GD3pKFU3TLYDMCbetIsnV8eeFE= private key: (hidden) listening port: 51820 peer: PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg= allowed ips: 10.8.0.2/32, fd24:609a:6c18::/128

peer行にWireGuardピアの公開鍵と、それが使用できるIPアドレスまたはアドレスの範囲が表示されることに注目してください。

サーバーでピアの接続パラメータを定義したので、次のステップは、ピアでトンネルを開始することです。

ステップ9 — WireGuardピアをトンネルに接続する

サーバーとピアの両方がIPv4、IPv6、パケット転送、およびDNS解決をサポートするように構成されたので、VPNトンネルにピアを接続する時が来ました。

VPNを特定の使用ケースでのみオンにしたい場合は、wg-quickコマンドを使用して接続を手動で確立します。サーバーでトンネルを自動的に開始するようにしたい場合は、ステップ6 — WireGuardサーバーの起動セクションの手順に従い、wq-quickコマンドを使用しないでください。

すべてのトラフィックをVPN経由でルーティングし、DNS転送を設定している場合は、WireGuardピアにresolvconfユーティリティをインストールする必要があります。次のコマンドを実行してこれをセットアップします:

  1. sudo apt install resolvconf

トンネルを開始するには、WireGuardピアで次のコマンドを実行します:

  1. sudo wg-quick up wg0

次のような出力が表示されます:

Output
[#] ip link add wg0 type wireguard [#] wg setconf wg0 /dev/fd/63 [#] ip -4 address add 10.8.0.2/24 dev wg0 [#] ip -6 address add fd24:609a:6c18::2/64 dev wg0 [#] ip link set mtu 1420 up dev wg0 [#] resolvconf -a tun.wg0 -m 0 -x

ピアに割り当てたIPv4およびIPv6アドレスに注目してください。

ピアでAllowedIPs0.0.0.0/0および::/0に設定した場合(またはVPNのために選択した範囲以外の範囲を使用する場合)、出力は次のようになります:

Output
[#] ip link add wg0 type wireguard [#] wg setconf wg0 /dev/fd/63 [#] ip -4 address add 10.8.0.2/24 dev wg0 [#] ip -6 address add fd24:609a:6c18::2/64 dev wg0 [#] ip link set mtu 1420 up dev wg0 [#] resolvconf -a tun.wg0 -m 0 -x [#] wg set wg0 fwmark 51820 [#] ip -6 route add ::/0 dev wg0 table 51820 [#] ip -6 rule add not fwmark 51820 table 51820 [#] ip -6 rule add table main suppress_prefixlength 0 [#] ip6tables-restore -n [#] ip -4 route add 0.0.0.0/0 dev wg0 table 51820 [#] ip -4 rule add not fwmark 51820 table 51820 [#] ip -4 rule add table main suppress_prefixlength 0 [#] sysctl -q net.ipv4.conf.all.src_valid_mark=1 [#] iptables-restore -n

この例では、コマンドが追加したルートに注目してください。これらは、ピア構成のAllowedIPsに対応しています。

ピアでwgコマンドを使用してトンネルの状態を確認できます:

  1. sudo wg
Output
interface: wg0 public key: PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg= private key: (hidden) listening port: 49338 fwmark: 0xca6c peer: U9uE2kb/nrrzsEU58GD3pKFU3TLYDMCbetIsnV8eeFE= endpoint: 203.0.113.1:51820 allowed ips: 10.8.0.0/24, fd24:609a:6c18::/64 latest handshake: 1 second ago transfer: 6.50 KiB received, 15.41 KiB sent

また、サーバーでも状態を再度確認でき、類似の出力が得られます。

VPNを使用しているかどうかを確認するには、ip routeおよびip -6 routeコマンドを使用します。インターネットトラフィックのすべてのゲートウェイとしてVPNを使用している場合は、CloudFlareの1.1.1.1および2606:4700:4700::1111 DNSリゾルバー宛のトラフィックに使用されるインターフェースを確認してください。

VPNを使用してリソースにアクセスするためにWireGuardを使用している場合は、有効なIPv4またはIPv6アドレス(ゲートウェイ自体のような)をこれらのコマンドに代入してください。たとえば、10.8.0.1またはfd24:609a:6c18::1です。

  1. ip route get 1.1.1.1
Output
1.1.1.1 dev wg0 table 51820 src 10.8.0.2 uid 1000 cache

wg0デバイスが使用され、ピアに割り当てられたIPv4アドレス10.8.0.2に注意してください。同様に、IPv6を使用している場合は、次のコマンドを実行します:

  1. ip -6 route get 2606:4700:4700::1111
Output
2606:4700:4700::1111 from :: dev wg0 table 51820 src fd24:609a:6c18::2 metric 1024 pref medium

再度、wg0インターフェースと、ピアに割り当てられたIPv6アドレスfd24:609a:6c18::2に注意してください。

ピアにブラウザがインストールされている場合は、ipleak.netipv6-test.comを訪問して、トラフィックがVPN経由でルーティングされていることを確認できます。

VPNから切断する準備ができたら、wg-quickコマンドを使用してください:

  1. sudo wg-quick down wg0

VPNトンネルがシャットダウンされたことを示す以下のような出力が表示されます:

Output
[#] ip link delete dev wg0 [#] resolvconf -d tun.wg0 -f

ピアのAllowedIPs0.0.0.0/0および::/0に設定した場合(またはVPNのために選択した範囲以外の範囲を使用する場合)、出力は以下のようになります:

Output
[#] ip rule delete table 200 from 203.0.113.5 [#] ip route delete table 200 default via 203.0.113.1 [#] ip -4 rule delete table 51820 [#] ip -4 rule delete table main suppress_prefixlength 0 [#] ip -6 rule delete table 51820 [#] ip -6 rule delete table main suppress_prefixlength 0 [#] ip link delete dev wg0 [#] resolvconf -d tun.wg0 -f [#] iptables-restore -n [#] ip6tables-restore -n

VPNに再接続するには、再びピアでwg-quick up wg0コマンドを実行してください。WireGuardサーバーからピアの設定を完全に削除する場合は、次のコマンドを実行してください。削除したいピアの正しい公開鍵に置き換えてください:

  1. sudo wg set wg0 peer PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg= remove

通常、ピアが存在しなくなった場合や、その暗号キーが危険にさらされた場合、または変更された場合にのみ、ピアの設定を削除する必要があります。それ以外の場合は、設定をそのままにしておく方が良いです。そうすることで、ピアが毎回鍵とallowed-ipsを追加する必要なくVPNに再接続できます。

結論

このチュートリアルでは、WireGuardパッケージとツールをサーバーとクライアントのUbuntu 22.04システムの両方にインストールしました。WireGuardのファイアウォールルールを設定し、サーバーでsysctlコマンドを使用してパケット転送を許可するカーネル設定を構成しました。プライベートおよびパブリックのWireGuard暗号化キーを生成する方法、およびサーバーとピア(または複数のピア)を互いに接続する方法について学びました。

ネットワークがIPv6を使用している場合、ピア接続に使用する一意のローカルアドレス範囲を生成する方法についても学びました。最後に、ピアが使用するトラフィックを制限する方法、およびWireGuardサーバーをVPNゲートウェイとして使用して、すべてのピアのインターネットトラフィックを処理する方法について学びました。

公式のWireGuardドキュメントを訪れて、WireGuardの詳細な設定やコンテナでの使用方法などを学びたい場合は、こちらをご覧ください。

Source:
https://www.digitalocean.com/community/tutorials/how-to-set-up-wireguard-on-ubuntu-22-04