序章

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

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

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

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

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

注: DigitalOcean DropletにWireGuardをセットアップする場合は、多くのホスティングプロバイダーと同様に、帯域幅の超過に対して課金されることに注意してください。 このため、サーバーが処理しているトラフィックの量に注意してください。 詳細については、このページを参照してください。

前提条件

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

  • sudo非rootユーザーとファイアウォールが有効になっている1台のUbuntu20.04サーバー。 これを設定するには、 Ubuntu20.04を使用したサーバーの初期設定チュートリアルに従うことができます。 このガイドでは、これを WireGuardServerと呼びます。
  • WireGuardサーバーへの接続に使用するクライアントマシンが必要です。 このチュートリアルでは、このマシンを WireGuardPeerと呼びます。 このチュートリアルでは、ローカルマシンをWireGuard Peerとして使用することをお勧めしますが、必要に応じて、リモートサーバーまたは携帯電話をクライアントとして使用できます。 リモートシステムを使用している場合は、このチュートリアルの後半にあるすべてのオプションのセクションに必ず従ってください。そうしないと、システムからロックアウトされる可能性があります。
  • WireGuardをIPv6で使用するには、サーバーがそのタイプのトラフィックをサポートするように構成されていることも確認する必要があります。 WireGuardでIPv6サポートを有効にし、DigitalOceanドロップレットを使用している場合は、このドキュメントページドロップレットでIPv6を有効にする方法を参照してください。 ドロップレットを作成するとき、または後でそのページの手順を使用して、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=...コマンドは、rootユーザー以外のユーザーおよびグループのファイルに対するすべてのアクセス許可を削除して、rootユーザーのみが秘密鍵にアクセスできるようにします。

base64でエンコードされた出力の1行を受信する必要があります。これは秘密鍵です。 出力のコピーは、コマンドのtee部分で後で参照できるように、/etc/wireguard/private.keyファイルにも保存されます。 このセクションの後半で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という名前のファイルにリダイレクトします。

コマンドを実行すると、WireGuardサーバーの公開鍵であるbase64でエンコードされた出力が1行表示されます。 サーバーに接続するすべてのピアに公開鍵を配布する必要があるため、参照用にどこかにコピーしてください。

ステップ2—IPv4およびIPv6アドレスの選択

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

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

ステップ2(a)—IPv4範囲の選択

WireGuardサーバーをIPv4ピアで使用している場合、サーバーには、クライアントとそのトンネルインターフェイスに使用する一連のプライベート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 Serverは、その範囲の単一のIPアドレスをプライベートトンネルIPv4アドレスに使用します。 ここでは10.8.0.1/24を使用しますが、10.8.0.1から10.8.0.255の範囲の任意のアドレスを使用できます。 10.8.0.1/24とは異なるものを使用する場合は、選択したIPアドレスをメモしてください。 このIPv4アドレスを、ステップ3 —WireGuardサーバー構成の作成で定義した構成ファイルに追加します。

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

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

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

WireGuardサーバーのIPv6範囲の生成を開始するには、次のコマンドでdateユーティリティを使用して64ビットのタイムスタンプを収集します。

  1. date +%s%N

1970-01からの秒数(dateコマンドの%s)とナノ秒(%N)のような数値が表示されます- 01 00:00:00 UTCを組み合わせて:

Output
1628101352127592197

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

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

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

/var/lib/dbus/machine-id
20086c25853947c7aeee2ca1ea849d7d

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

printf <timestamp><machine-id> | sha1sum

タイムスタンプとマシンIDの値を代入してコマンドを実行します。

  1. printf 162810135212759219720086c25853947c7aeee2ca1ea849d7d | sha1sum

次のようなハッシュ値を受け取ります。

Output
4f267c51857d6dc93a0bca107bca2f0d86fac3bc -

sha1sumコマンドの出力は16進数であるため、出力は2文字を使用して1バイトのデータを表すことに注意してください。 たとえば、出力例の4f26は、ハッシュされたデータの最初の2バイトです。

RFCのアルゴリズムは、ハッシュされた出力の最下位(末尾)の40ビットまたは5バイトのみを必要とします。 cutコマンドを使用して、ハッシュから最後の5つの16進エンコードバイトを出力します。

  1. printf 4f267c51857d6dc93a0bca107bca2f0d86fac3bc | cut -c 31-

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

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

Output
0d86fac3bc

この出力例では、バイトのセットは0d 86 fa c3 bcです。

これで、生成した5バイトにfdプレフィックスを追加し、すべての 2バイトを:コロンで区切って、独自のIPv6ネットワークプレフィックスを作成できます。 一意のプレフィックス内の各サブネットは合計18,446,744,073,709,551,616の可能なIPv6アドレスを保持できるため、簡単にするためにサブネットを/64の標準サイズに制限できます。

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

Unique Local IPv6 Address Prefix
fd0d:86fa:c3bc::/64

このfd0d:86fa:c3bc::/64の範囲は、サーバーとピアのWireGuardトンネルインターフェイスに個々のIPアドレスを割り当てるために使用する範囲です。 サーバーにIPを割り当てるには、最後の::文字の後に1を追加します。 結果のアドレスはfd0d:86fa:c3bc::1/64になります。 ピアは範囲内の任意のIPを使用できますが、通常、ピアを追加するたびに値が1ずつ増加します。 fd0d:86fa:c3bc::2/64。 IPをメモし、このチュートリアルの次のセクションでWireGuardサーバーの構成に進みます。

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

WireGuard Serverの構成を作成する前に、次の情報が必要になります。

  1. ステップ1—WireGuardのインストールとキーペアの生成から秘密鍵を使用できることを確認してください。

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

  3. IPv6でWireGuardを使用している場合は、ステップ2(b)—IPv6範囲の選択で生成したサーバーのIPアドレスが必要になります。 この例では、IPはfd0d:86fa:c3bc::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, fd0d:86fa:c3bc::1/64 ListenPort = 51820 SaveConfig = true

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

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

ステップ4—WireGuardサーバーのネットワーク構成を調整する

サーバーのみのサービスにアクセスするためにWireGuardを使用してピアをWireGuardサーバーに接続している場合は、このセクションを完了する必要はありません。 WireGuard Peerのインターネットトラフィックを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 Serverは、仮想VPNイーサネットデバイスからサーバー上の他のデバイスに、そしてそこからパブリックインターネットに着信トラフィックを転送できるようになります。 この構成を使用すると、WireGuard PeerからサーバーのIPアドレスを介してすべてのWebトラフィックをルーティングでき、クライアントのパブリックIPアドレスが効果的に非表示になります。

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

ステップ5—WireGuardサーバーのファイアウォールを構成する

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

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

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

  1. ip route list default

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

Output
default via 203.0.113.1 dev eth0 proto static

次の手順でiptablesルールにデバイスを追加するため、デバイスの名前をメモしてください。

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

  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-このルールは、wg0VPNインターフェースで着信するIPv4およびIPv6トラフィックをサーバー上のeth0ネットワークインターフェースに転送することを許可します。 これは、前のセクションで構成したnet.ipv4.ip_forwardおよびnet.ipv6.conf.all.forwardingsysctl値と連携して機能します。
  • 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インターフェイスの転送ルールとマスカレードルールを元に戻すように機能します。

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

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

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

前提条件のチュートリアルに従うときにSSHポートを開くのを忘れた場合は、ここにも追加してください。

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

:別のファイアウォールを使用している場合、またはUFW構成をカスタマイズしている場合は、ファイアウォールルールを追加する必要がある場合があります。 たとえば、VPN接続を介してすべてのネットワークトラフィックをトンネリングする場合は、ポート53トラフィックがDNS要求に許可されていること、および80443それぞれHTTPおよびHTTPSトラフィック用。 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サービスとして実行するように構成できます。 wgコマンドを手動で使用して、VPNを使用するたびにトンネルを作成することもできますが、そうすることは手動のプロセスであり、繰り返してエラーが発生しやすくなります。 代わりに、systemctlを使用して、wg-quickスクリプトを使用してトンネルを管理できます。

systemdサービスを使用すると、サーバーが実行されている限りいつでもVPNに接続できるように、起動時に起動するようにWireGuardを構成できます。 これを行うには、systemctlに追加して、定義したwg0トンネルの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 Wed 2021-08-25 15:24:14 UTC; 5s 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: 3245 ExecStart=/usr/bin/wg-quick up wg0 (code=exited, status=0/SUCCESS) Main PID: 3245 (code=exited, status=0/SUCCESS) Aug 25 15:24:14 wg0 wg-quick[3245]: [#] wg setconf wg0 /dev/fd/63 Aug 25 15:24:14 wg0 wg-quick[3245]: [#] ip -4 address add 10.8.0.1/24 dev wg0 Aug 25 15:24:14 wg0 wg-quick[3245]: [#] ip -6 address add fd0d:86fa:c3bc::1/64 dev wg0 Aug 25 15:24:14 wg0 wg-quick[3245]: [#] ip link set mtu 1420 up dev wg0 Aug 25 15:24:14 wg0 wg-quick[3245]: [#] ufw route allow in on wg0 out on eth0 Aug 25 15:24:14 wg0 wg-quick[3279]: Rule added Aug 25 15:24:14 wg0 wg-quick[3279]: Rule added (v6) Aug 25 15:24:14 wg0 wg-quick[3245]: [#] iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE Aug 25 15:24:14 wg0 wg-quick[3245]: [#] ip6tables -t nat -I POSTROUTING -o eth0 -j MASQUERADE Aug 25 15:24:14 wg0 systemd[1]: Finished WireGuard via wg-quick(8) for wg0.

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

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

ステップ7—WireGuardピアの設定

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

次の手順を使用してキーペアと構成を生成することにより、VPNに必要な数のピアを追加できます。 VPNに複数のピアを追加する場合は、衝突を防ぐために、必ずプライベートIPアドレスを追跡してください。

WireGuard Peerを構成するには、次の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

再び、WireGuardPeerの公開鍵であるbase64エンコードされた出力の1行を受け取ります。 暗号化された接続を確立するには、公開鍵をWireGuardサーバーに配布する必要があるため、参照用にどこかにコピーしてください。

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

キーペアができたので、WireGuardServerへの接続を確立するために必要なすべての情報を含むピアの構成ファイルを作成できます。

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

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

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

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

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

このすべての情報が手元にある状態で、nanoまたはお好みのエディターを使用して、WireGuardPeerマシンで新しい/etc/wireguard/wg0.confファイルを開きます。

  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 = fd0d:86fa:c3bc::2/64 [Peer] PublicKey = U9uE2kb/nrrzsEU58GD3pKFU3TLYDMCbetIsnV8eeFE= AllowedIPs = 10.8.0.0/24, fd0d:86fa:c3bc::/64 Endpoint = 203.0.113.1:51820

最初のAddress行が、前に選択した10.8.0.0/24サブネットのIPv4アドレスをどのように使用しているかに注目してください。 このIPアドレスは、サーバーのIPと異なる限り、サブネット内の任意のアドレスにすることができます。 ピアを追加するたびにアドレスを1ずつ増やすのが、一般的にIPを割り当てる最も簡単な方法です。

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

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

IPv4のみを使用している場合は、末尾のfd0d:86fa:c3bc::/64範囲(,コンマを含む)を省略します。 逆に、IPv6のみを使用している場合は、fd0d:86fa:c3bc::/64プレフィックスのみを含め、10.8.0.0/24IPv4範囲を除外します。

どちらの場合も、VPNを介してすべてのピアのトラフィックを送信し、WireGuard Serverをすべてのトラフィックのゲートウェイとして使用する場合は、IPv4アドレス空間全体を表す0.0.0.0/0と[ IPv6アドレス空間全体のX217X]。

(オプション)すべてのトラフィックをトンネル経由でルーティングするようにピアを設定する

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構成。

次に、WireGuardPeerの/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がシステムのパブリック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サーバーのネットワーク構成の調整でWireGuardサーバーに正しいsysctlおよびiptablesルールが構成されていることを確認してください。 およびステップ5—WireGuardサーバーのファイアウォールの構成

(オプション)WireGuardPeerのDNSリゾルバーの構成

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

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

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

  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のみを使用するかを選択できます。 使用するリゾルバーをメモします。

次に、選択したリゾルバーをWireGuardPeerの構成ファイルに追加する必要があります。 WireGuard Peer に戻り、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サーバーはピアがトンネルを介してトラフィックを送受信することを許可しません。

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

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

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

  1. sudo wg set wg0 peer PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg= allowed-ips 10.8.0.2,fd0d:86fa:c3bc::2

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

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

  1. sudo wg set wg0 peer PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg= allowed-ips 10.8.0.2,10.8.0.100,fd0d:86fa:c3bc::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, fd0d:86fa:c3bc::/128

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

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

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

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

特定のユースケースでのみVPNをオンにしたい場合があるため、wg-quickコマンドを使用して手動で接続を確立します。 サーバーで行ったようにトンネルの開始を自動化する場合は、wq-quickコマンドを使用する代わりに、ステップ6 —WireGuardサーバーの開始セクションの手順に従います。

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

  1. sudo apt install resolvconf

トンネルを開始するには、WireGuardPeerで次を実行します。

  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 fd0d:86fa:c3bc::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 fd0d:86fa:c3bc::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, fd0d:86fa:c3bc::/64 latest handshake: 1 second ago transfer: 6.50 KiB received, 15.41 KiB sent

サーバーのステータスを再度確認することもでき、同様の出力が表示されます。

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

WireGuardを使用してVPN上のリソースにアクセスするだけの場合は、ゲートウェイ自体のような有効なIPv4またはIPv6アドレスをこれらのコマンドに置き換えてください。 たとえば、10.8.0.1またはfd0d:86fa:c3bc::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 fd0d:86fa:c3bc::2 metric 1024 pref medium

ここでも、wg0インターフェイスと、ピアに割り当てたIPv6アドレスfd0d:86fa:c3bc::2に注意してください。

ピアにブラウザがインストールされている場合は、ipleak.netおよびipv6-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に再接続できるようにすることをお勧めします。

結論

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

ネットワークでIPv6を使用している場合は、ピア接続で使用する一意のローカルアドレス範囲を生成する方法も学習しました。 最後に、ピアが使用できるネットワークプレフィックスを制限することにより、VPNを通過するトラフィックを制限する方法と、WireGuardServerをVPNゲートウェイとして使用してピアのすべてのインターネットトラフィックを処理する方法を学習しました。

より高度なトンネルを構成する方法や、コンテナでWireGuardを使用する方法など、WireGuardの詳細については、公式のWireGuardドキュメントにアクセスしてください。