はじめに
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ユーザーのパスワードを入力するように求められる場合があります。
WireGuardがインストールされたので、次のステップはサーバー用の秘密鍵と公開鍵のペアを生成することです。組み込みのwg genkey
およびwg pubkey
コマンドを使用してキーを作成し、その後、秘密鍵をWireGuardの設定ファイルに追加します。
また、chmod
コマンドを使用して、さっき作成したキーのアクセス権を変更する必要があります。デフォルトでは、ファイルはサーバー上のすべてのユーザーによって読み取り可能です。
次のコマンドを使用して、WireGuardのための秘密鍵を作成し、そのアクセス権を変更します:
sudo chmod go=...
コマンドは、ルートユーザー以外のユーザーやグループによるファイルへのアクセス権をすべて削除し、秘密鍵にアクセスできるのはルートユーザーだけになるようにします。
出力されるのは、base64でエンコードされた1行の情報です。これが秘密鍵です。また、出力のコピーは/etc/wireguard/private.key
ファイルにも保存され、後でtee
部分のコマンドによって参照できるようになります。出力された秘密鍵は後でこのセクションでWireGuardの設定ファイルに追加する必要があるので、注意してメモしておいてください。
次のステップは、対応する公開鍵を作成することです。これは秘密鍵から派生します。次のコマンドを使用して公開鍵ファイルを作成します:
このコマンドは、|
(パイプ)演算子を使用して連結された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ビットのタイムスタンプを収集します:
次に、次のような数値を受け取ります。これは、1970-01-01 00:00:00 UTC以降の秒数(date
コマンドの%s
)とナノ秒(%N
)が組み合わさったものです:
Output1650301699497770167
この値を後でこのセクションで使用するためにどこかに記録してください。次に、サーバーの/var/lib/dbus/machine-id
ファイルからmachine-id
値をコピーします。この識別子はシステム固有であり、サーバーが存在する限り変更されるべきではありません。
以下のような出力を受け取ります:
/var/lib/dbus/machine-id610cef4946ed46da8f71dba9d66c67fb
次に、タイムスタンプをmachine-id
と組み合わせ、その結果の値をSHA-1アルゴリズムでハッシュ化する必要があります。コマンドは以下の形式を使用します:
printf <timestamp><machine-id> | sha1sum
次のコマンドを実行し、タイムスタンプとマシン識別値を代入してください:
以下のようなハッシュ値を受け取ります:
Output442adea1488d96388dae9ab816045b24609a6c18 -
なお、sha1sum
コマンドの出力は16進数であり、1バイトのデータを表すために2文字を使用します。例えば、例の出力の4f
と26
は、ハッシュ化されたデータの最初の2バイトです。
RFCのアルゴリズムでは、ハッシュ化された出力の最下位(末尾)の40ビット、または5バイトだけが必要です。最後の5つの16進数エンコードされたバイトを出力するためにcut
コマンドを使用してください。
-c
引数はcut
コマンドに指定された文字のセットのみを選択するように指示します。31-
引数はcut
に対して、入力行の位置31から最後までのすべての文字を出力するように指示します。
次のような出力を受け取るはずです:
Output24609a6c18
この例の出力では、バイトのセットは次のとおりです:24 60 9a 6c 18
。
これで、fd
プレフィックスを使用して生成された5バイトを、可読性のために:
コロンで各2バイトごとに区切り、IPv6ネットワークプレフィックスを構築できます。各サブネット内のユニークプレフィックスは、合計で18,446,744,073,709,551,616個のIPv6アドレスを保持できるため、単純化のためにサブネットを標準サイズの/64
に制限できます。
/64
サブネットサイズで以前に生成されたバイトを使用すると、次のような結果のプレフィックスになります:
Unique Local IPv6 Address Prefixfd24: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サーバーの構成を作成する前に、次の情報が必要です:
-
WireGuardのインストールとキーペアの生成のステップ1で、プライベートキーを利用可能にしてください。
-
IPv4でWireGuardを使用している場合は、ステップ2(a) — IPv4レンジの選択でサーバーに選択したIPアドレスが必要です。この例では、
10.8.0.1/24
です。 -
IPv6でWireGuardを使用している場合は、ステップ2(b) — IPv6レンジの選択で生成したサーバーのIPアドレスが必要です。この例では、
fd24:609a:6c18::1/64
です。
必要な秘密鍵とIPアドレスを取得したら、次のコマンドを実行して、nano
または好みのエディターを使用して新しい構成ファイルを作成します:
次の行をファイルに追加し、ハイライトされた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
ファイルを開きます。
WireGuardを使用してIPv4を利用している場合は、ファイルの末尾に次の行を追加します:
net.ipv4.ip_forward=1
WireGuardを使用してIPv6を利用している場合は、ファイルの末尾に次の行を追加します:
net.ipv6.conf.all.forwarding=1
IPv4とIPv6の両方を使用している場合は、両方の行を含めるようにしてください。編集が終了したら、ファイルを保存して閉じます。
ファイルを読み込んで新しい値を現在のターミナルセッションにロードするには、次を実行します:
Outputnet.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サーバーのパブリックネットワークインターフェースを見つけます。
パブリックインターフェースは、このコマンドの出力内で「dev」の後に続く文字列です。例えば、この結果はeth0
という名前のインターフェースを示しており、以下にハイライトされています。
Outputdefault via 203.0.113.1 dev eth0 proto static
デバイスの名前をメモしておいて、次のステップでiptablesルールに追加します。
WireGuardサーバーにファイアウォールルールを追加するには、再度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ポートを開いていない場合は、ここに追加してください。
注意: 別のファイアウォールを使用している場合や、UFWの構成をカスタマイズしている場合は、追加のファイアウォールルールを追加する必要がある場合があります。たとえば、すべてのネットワークトラフィックをVPN接続経由でトンネリングすることに決定した場合、DNSリクエストに対してポート53
のトラフィックが許可されていることを確認する必要があり、HTTPトラフィックおよびHTTPSトラフィックに対してはポート80
および443
が許可されていることを確認する必要があります。VPN経由で使用している他のプロトコルがある場合は、それらのルールも追加する必要があります。
これらのルールを追加した後、UFWを無効にして再度有効にして、変更したすべてのファイルから変更内容を読み込み直します。
ルールが適用されていることを確認するには、ufw status
コマンドを実行してください。実行すると、以下のような出力が得られるはずです。
OutputStatus: 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に接続できます。これを行うには、systemctl
にwg0
トンネルのwg-quick
サービスを有効にして定義したものを追加します:
このコマンドでは、トンネル名wg0
がサービス名の一部として指定されています。この名前は/etc/wireguard/wg0.conf
構成ファイルにマッピングされます。この名前付けのアプローチを使用すると、サーバーを使用して複数の独立したVPNトンネルを作成できます。
たとえば、トンネルデバイスを prod
という名前で作成し、その設定ファイルは /etc/wireguard/prod.conf
になります。各トンネル設定には異なるIPv4、IPv6、およびクライアントファイアウォール設定を含めることができます。これにより、複数の異なるピア接続をサポートし、それぞれ固有のIPアドレスとルーティングルールを持たせることができます。
今、サービスを開始します:
次のコマンドを使用して、WireGuardサービスがアクティブであることをダブルチェックしてください。出力には active (running)
が表示されるはずです:
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ピアで次のコマンドを実行します:
WireGuardピアのキーペアの作成
次に、サーバーで使用した手順と同じ手順を使用して、ピア上でキーペアを生成する必要があります。ピアとして機能するローカルマシンまたはリモートサーバーから、次のコマンドを使用してピアのプライベートキーを作成します:
再度、base64
でエンコードされた出力の1行が表示されます。これがプライベートキーです。出力のコピーは/etc/wireguard/private.key
にも保存されます。出力されるプライベートキーを注意深くメモしておいてください。後でこのセクションのWireGuardの設定ファイルに追加する必要があります。
次に、次のコマンドを使用して公開キーファイルを作成します:
再度、base64
でエンコードされた出力の1行が表示されます。これがWireGuardピアの公開キーです。暗号化された接続を確立するために、この公開キーをWireGuardサーバーに配布する必要があるので、どこかにコピーしておいてください。
WireGuardピアの構成ファイルの作成
キーペアを取得したので、WireGuardサーバーに接続するために必要なすべての情報を含むピアの構成ファイルを作成できます。
構成ファイルにはいくつかの情報が必要です:
-
ピアで生成した
base64
エンコードされた秘密鍵。 -
WireGuardサーバーで定義したIPv4およびIPv6アドレス範囲。
-
WireGuardサーバーからの
base64
エンコードされた公開鍵。 -
WireGuardサーバーの公開IPアドレスとポート番号。通常、これはIPv4アドレスになりますが、サーバーにIPv6アドレスがあり、クライアントマシンがインターネットへのIPv6接続を持っている場合は、代わりにIPv4の代わりにこれを使用できます。
この情報を手元にして、WireGuardピアマシンで新しい/etc/wireguard/wg0.conf
ファイルを開き、nano
またはお好みのエディタを使用します:
ファイルに以下の行を追加し、必要に応じて各データをハイライトされたセクションに置換してください:
/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
コマンドを実行します:
以下のような出力が表示されます:
Outputdefault via 203.0.113.1 dev eth0 proto static
ゲートウェイの強調されたIPアドレス203.0.113.1
を後で使用するためにメモしてください。また、デバイスeth0
を見つけます。デバイス名が異なる場合は、次のコマンドでeth0
の代わりにそれを置き換えてください。
次に、ip address show
コマンドを使用して、システムのパブリックIPを見つけます。
次のような出力が得られます:
Outputeth0 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
またはお好みのエディタで開きます。
[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デバイス名を置換します。
以下のような出力が表示されます:
OutputLink 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
ファイルを開きます:
[Peer]
行の前に、次の行を追加します:
DNS = 67.207.67.2 2001:4860:4860::8844
[Peer]
. . .
IPv4およびIPv6の設定については、好みや要件に応じてリストを編集できます。
次の手順でVPNに接続されたら、DNS leak test.comのようなサイトを使用してVPN経由でDNSクエリが送信されていることを確認できます。
また、resolvectl dns
コマンドを使用して、ピアが設定されたリゾルバを使用しているかどうかも確認できます。サーバーで実行したのと同様の出力が表示されるはずです。VPNトンネルのために構成したDNSリゾルバが表示されます。
OutputGlobal: 67.207.67.2 67.207.67.3
. . .
これらのDNSリゾルバ設定がすべて完了したら、次はピアの公開キーをサーバーに追加し、その後ピアでWireGuardトンネルを開始する準備が整います。
ステップ8 — WireGuardサーバーにピアの公開キーを追加する
ピアをサーバーに接続する前に、WireGuardサーバーにピアの公開キーを追加することが重要です。この手順を完了することで、VPN経由でトラフィックを送受信できるようになります。この手順を完了しないと、WireGuardサーバーはトンネル経由でのトラフィックの送受信を許可しません。
WireGuardピアのbase64
エンコードされた公開キーのコピーがあることを確認して、次のコマンドを実行します。
OutputPeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg=
そして、WireGuardサーバーにログインし、次のコマンドを実行します。
注意してください、コマンドのallowed-ips
部分は、IPv4とIPv6アドレスのコンマ区切りのリストを取ります。ピアが自分に割り当てることができるIPアドレスを制限したい場合は、個々のIPを指定することもできますし、VPNレンジ内の任意のIPアドレスを使用できる場合は、例のように範囲を指定することもできます。また、2つのピアが同じallowed-ips
設定を持つことはできないことに注意してください。
既存のピアのallowed-ips
を更新したい場合は、同じコマンドを再実行して、IPアドレスを変更できます。複数のIPアドレスがサポートされています。たとえば、追加したばかりのWireGuardピアに10.8.0.2
とfd24:609a:6c18::2
のIPに10.8.0.100
などのIPを追加したい場合は、次のように実行します:
ピアを追加するコマンドを実行した後は、サーバー上でトンネルの状態を確認するためにwg
コマンドを使用します:
Outputinterface: 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
ユーティリティをインストールする必要があります。次のコマンドを実行してこれをセットアップします:
トンネルを開始するには、WireGuardピアで次のコマンドを実行します:
次のような出力が表示されます:
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アドレスに注目してください。
ピアでAllowedIPs
を0.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
コマンドを使用してトンネルの状態を確認できます:
Outputinterface: 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
です。
Output1.1.1.1 dev wg0 table 51820 src 10.8.0.2 uid 1000
cache
wg0
デバイスが使用され、ピアに割り当てられたIPv4アドレス10.8.0.2
に注意してください。同様に、IPv6を使用している場合は、次のコマンドを実行します:
Output2606:4700:4700::1111 from :: dev wg0 table 51820 src fd24:609a:6c18::2 metric 1024 pref medium
再度、wg0
インターフェースと、ピアに割り当てられたIPv6アドレスfd24:609a:6c18::2
に注意してください。
ピアにブラウザがインストールされている場合は、ipleak.netとipv6-test.comを訪問して、トラフィックがVPN経由でルーティングされていることを確認できます。
VPNから切断する準備ができたら、wg-quick
コマンドを使用してください:
VPNトンネルがシャットダウンされたことを示す以下のような出力が表示されます:
Output[#] ip link delete dev wg0
[#] resolvconf -d tun.wg0 -f
ピアのAllowedIPs
を0.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サーバーからピアの設定を完全に削除する場合は、次のコマンドを実行してください。削除したいピアの正しい公開鍵に置き換えてください:
通常、ピアが存在しなくなった場合や、その暗号キーが危険にさらされた場合、または変更された場合にのみ、ピアの設定を削除する必要があります。それ以外の場合は、設定をそのままにしておく方が良いです。そうすることで、ピアが毎回鍵と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