📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

 
(同じ利用者による、間の19版が非表示)
14行目: 14行目:
それに比べて、OpenVPNやIPSec等の他のVPNソフトウェアは、TLS(Transport Layer Security)と証明書を使用して、システム間の認証と暗号化トンネルの確立を行う。<br>
それに比べて、OpenVPNやIPSec等の他のVPNソフトウェアは、TLS(Transport Layer Security)と証明書を使用して、システム間の認証と暗号化トンネルの確立を行う。<br>
TLSのバージョンが異なると、何百種類もの暗号スイートやアルゴリズムがサポートされるため、様々なクライアントに柔軟に対応できる反面、TLSを使用したVPNの設定に時間がかかり、複雑で、エラーが起こりやすくなる。<br>
TLSのバージョンが異なると、何百種類もの暗号スイートやアルゴリズムがサポートされるため、様々なクライアントに柔軟に対応できる反面、TLSを使用したVPNの設定に時間がかかり、複雑で、エラーが起こりやすくなる。<br>
<br><br>
== Shadowsocksとは ==
Shadowsocksは、SOCKS5プロキシを使用してインターネットトラフィックを迂回・偽装して、検閲ブロックを突破するツールである。<br>
当初は中国のプログラマーによって開発されたため、中国のグレート・ファイアウォールを突破するのに特に役立つが、他の政権のブロックを回避するためにも使用できるという報告を受けている。<br>
<br>
しかし、Netflixのリージョンを変更したり、Torrentを利用したりするのであれば、VPNを利用した方がはるかに良い。<br>
<br>
Shadowsocksの問題点は、設定に少しコツがいることである。<br>
Shadowsocksをインストールする方法はいくつかあるが、その多くはギークが作成したスクリプトを使用する必要がある。<br>
<br><br>
<br><br>


103行目: 113行目:
<br>
<br>
===== IPv6を使用する =====
===== IPv6を使用する =====
IPv6でWireGuardを使用する場合は、RFC 4193のアルゴリズムに基づいて、一意のローカルIPv6ユニキャストアドレスプレフィックスを生成する必要がある。<br>
WireGuardサーバで使用するアドレスは、仮想トンネルインターフェースに関連付けられる。<br>
<br>
プライベートIPv6アドレスの予約済みfd00::/8ブロック内でランダムな一意のIPv6プレフィックスを生成するには、いくつかの手順を完了する必要がある。<br>
<br>
RFCによると、一意のIPv6プレフィックスを取得する推奨方法は、シリアル番号やデバイスIDのようなシステムからの一意の識別値と時刻を組み合わせることである。<br>
これらの値は、ハッシュ化されて切り捨てられた結果、IPの予約済みプライベートfd00::/8ブロック内で一意なアドレスとして使用できるビットセットになる。<br>
<br>
まず、WireGuardサーバのIPv6範囲の生成を開始するには、日付ユーティリティを使用して64ビットのタイムスタンプを収集する。<br>
以下の例では、1970-01-01 00:00:00 UTCからの秒数(<code>date</code>コマンドの<code>%s</code>)とナノ秒数(<code>%N</code>)を合わせたものである。<br>
date +%s%N
出力例 :
1650301699497770167
<br>
次に、WireGuardサーバのマシンID値を、/var/lib/dbus/machine-idファイルからコピーする。<br>
この識別子は、システム固有のもので、WireGuardサーバが存在する限り変更されることはない。<br>
# /var/lib/dbus/machine-idファイルの例
610cef4946ed46da8f71dba9d66c67fb
<br>
タイムスタンプとマシンIDを組み合わせて、SHA-1アルゴリズムを使用してハッシュ化する必要がある。<br>
printf <タイムスタンプ><マシンID> | sha1sum
# 実行例 :
printf 1650301699497770167610cef4946ed46da8f71dba9d66c67fb | sha1sum
# 出力例 :
442adea1488d96388dae9ab816045b24609a6c18  -
<br>
<code>sha1sum</code>コマンドの出力は16進数であるため、1バイトのデータを表すのに2文字を使用することに注意する。<br>
例えば、出力例の4fと26は、ハッシュ化されたデータの最初の2バイトである。<br>
<br>
RFCのアルゴリズムは、ハッシュ化された出力の最下位(末尾)の40ビット、つまり5バイトしか必要としないため、<code>cut</code>コマンドを使用して、ハッシュから最後の5バイトを16進エンコードして出力する。<br>
<code>-c</code>オプションは、<code>cut</code>コマンドに指定された文字の集合だけを選択するように指示する。<br>
例えば、31-オプションは、<code>cut</code>コマンドに31位から入力行の終わりまでの全ての文字を表示する。<br>
printf 442adea1488d96388dae9ab816045b24609a6c18 | cut -c 31-
# 出力例 :
24609a6c18
<br>
上記の出力例では、バイトのセットは、24 60 9a 6c 18となる。<br>
これにより、生成した5バイトをfdプレフィックスに追加して、2バイトごとに:(コロン)で区切って読みやすくすることで、一意のIPv6ネットワークプレフィックスを構築することができる。<br>
一意なプレフィックスに含まれる各サブネットは、合計で18,446,744,073,709,551,616個のIPv6アドレスを保持できるため、簡単にするためにサブネットを標準サイズの/64に制限することができる。<br>
<br>
先に/64サブネットサイズで生成したバイトを使用すると、結果のプレフィックスは次のようになる。<br>
# 一意のローカルIPv6プレフィックス例
fd24:609a:6c18::/64
<br>
上記の例のfd24:609a:6c18::/64の範囲は、WireGuardサーバとピアのWireGuardトンネルインターフェイスに個々のIPアドレスを割り当てるために使用する。<br>
WireGuardサーバにIPアドレスを割り当てるには、最後の<code>::</code>の後に1を追加する。<br>
上記のものを例に取ると、アドレスはfd24:609a:6c18::1/64になる。<br>
<br>
ピアはこの範囲内のどのIPアドレスでも使用できるが、通常はピアを追加するたびに値を1ずつ増やす。(例 : fd24:609a:6c18::2/64)<br>
このIPアドレスは、次のセクションのWireGuardサーバの設定で使用するために覚えておく必要がある。<br>
<br>
==== 構築 ステップ3 : WireGuardサーバ構成の作成 ====
秘密鍵とIPアドレスを使用して、WireGuardサーバの設定ファイルを作成する。<br>
<br>
* PrivateKey
*: 秘密鍵ファイルのフルパスを指定する。
* Address
*: IPアドレスを指定する。
* SaveConfig
*: WireGuardインターフェイスがシャットダウンされた時に、変更内容が設定ファイルに保存されるようにする設定である。
* ListenPort
*: WireGuardを別のポートで使用したい場合は、値を変更する。
<br>
sudo vi /etc/wireguard/wg0.conf
<br>
<syntaxhighlight lang="ini">
# /etc/wireguard/wg0.confファイル
[Interface]
PrivateKey = <秘密鍵ファイルのフルパス>
Address = <IPv4のアドレス  例 : 10.8.0.1/24>, <IPv6のアドレス  例 : fd24:609a:6c18::1/64>
ListenPort = 51820
SaveConfig = true
</syntaxhighlight>
<br>
==== 構築 ステップ4 : WireGuardサーバのネットワーク設定の調整 ====
WireGuardピアのインターネットトラフィックをWireGuardサーバー経由でルーティングする場合は、このセクションに従ってIP転送を設定する必要がある。<br>
<u>WireGuardを使用してピアをWireGuardサーバーに接続して、サーバー上のサービスにのみアクセスする場合は、このセクションの設定は不要である。</u><br>
<br>
転送の設定をするには、/etc/sysctl.confファイルを編集する。<br>
sudo vi /etc/sysctl.conf
<br>
WireGuardでIPv4を使用している場合は、ファイルの一番下に以下の行を追加する。<br>
net.ipv4.ip_forward=1
<br>
WireGuardでIPv6を使用する場合は、ファイルの末尾に次の行を追加する。<br>
net.ipv6.conf.all.forwarding=1
<br>
<u>IPv4とIPv6の両方を使用する場合は、両方の行を追記する。</u><br>
<br>
設定を反映させる。<br>
sudo sysctl -p
<br>
これにより、WireGuardサーバは、仮想VPNイーサネットデバイスからの受信トラフィックをサーバー上の他のデバイスに転送して、そこからパブリックインターネットに転送できるようになる。<br>
この設定を使用すると、WireGuardピアからの全てのウェブトラフィックをサーバのIPアドレス経由で転送できるようになり、クライアントのパブリックIPアドレスは効果的に隠蔽される。<br>
<br>
ただし、トラフィックをサーバ経由で正しくルーティングする前に、いくつかのファイアウォールルールを設定する必要がある。<br>
このルールにより、WireGuardサーバとピアとの間のトラフィックが正しく流れるようになる。<br>
<br><br>
==== 構築 ステップ5 : WireGuardサーバのファイアウォールの設定 ====
このセクションでは、WireGuardサーバとクライアント間のトラフィックが正しくルーティングされるようにするため、ファイアウォールルールを追加する。<br>
もし、WireGuard VPNをマシン間接続にのみ使用して、VPNに制限されているリソースにアクセスする場合は、この設定は不要である。<br>
<br>
WireGuard VPNトラフィックをサーバのファイアウォール経由で許可する場合は、マスカレードを有効にする必要がある。<br>
マスカレードとは、クライアント接続を正しくルーティングするためにオンザフライで動的なネットワークアドレス変換(NAT)を行うiptablesの概念である。<br>
<br>
まず、WireGuardサーバのパブリックネットワークインターフェースを探す。<br>
<br>
パブリックインターフェースは、このコマンド出力の"dev"の後に続く文字列である。<br>
以下の例では、eth0というインターフェイスが表示される。<br>
ip route list default
# 出力例
default via 203.0.113.1 dev eth0 proto static
<br>
ファイアウォールルールをWireGuardサーバに追加するため、/etc/wireguard/wg0.confファイルの最下行に、以下に示す設定を追記する。<br>
sudo vi /etc/wireguard/wg0.conf
<br>
<syntaxhighlight lang="ini">
# /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
</syntaxhighlight>
<br>
<code>PostUp</code>キー値は、WireGuardサーバが仮想VPNトンネルを開始するときに実行される。<br>
上記の例では、3つのufwルールとiptablesルールが追加される。<br>
<br>
* <code>ufw route allow in on wg0 out on eth0</code>
*: このルールは、wg0 VPNインターフェースから入ってくるIPv4とIPv6のトラフィックをサーバのeth0ネットワークインターフェースに転送することを許可する。
*: 前のセクションで設定した<code>net.ipv4.ip_forward</code>と<code>net.ipv6.conf.all.forwarding sysctl</code>の値と連動する。
*: <br>
* <code>iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE</code>
*: このルールは、マスカレードを設定して、wg0 VPNインターフェースに入力されるIPv4トラフィックを書き換えて、WireGuardサーバのパブリックIPv4アドレスから直接発信されているように見せかける。
*: <br>
* <code>ip6tables -t nat -I POSTROUTING -o eth0 -j MASQUERADE</code>
*: このルールは、マスカレードを設定して、wg0 VPNインタフェースから侵入してくるIPv6トラフィックを書き換えて、WireGuardサーバのパブリックIPv6アドレスから直接発信されているように見せかける。
<br>
<code>PreDown</code>キー値は、WireGuardサーバが仮想VPNトンネルを停止するときに実行される。<br>
これらのルールは、<code>PostUp</code>キー値の逆で、VPNが停止された時にVPNインターフェイスの転送ルールとマスカレードルールを元に戻す働きをする。<br>
<br>
どちらの場合も、VPNに適したIPv4ルールとIPv6ルールを含むか含まないか、設定を編集する。<br>
例えば、IPv4のみを使用しているのであれば、<code>ip6tables</code>コマンドで行を除外することができる。<br>
逆に IPv6のみを使うのであれば、<code>ip6tables</code>コマンドだけを含むように設定を編集する。<br>
<br>
<code>PreDown</code>キー値の<u>ufw 〜</u>と記述している設定は、IPv4とIPv6のネットワークの組み合わせに関係なく存在する必要がある。<br>
<br>
WireGuardサーバのファイアウォール設定の最後は、WireGuard UDPポート自体とのトラフィックを許可することである。<br>
また、WireGuardサーバの/etc/wireguard/wg0.confファイルでポートを変更しなかった場合、デフォルトで使用されるポートは<code>51820</code>である。<br>
もし、別のポートを使用する場合は、必ず<code>ufw</code>コマンドを実行して、該当ポートを置き換えること。<br>
<br>
また、SSHのポートを開放すること。<br>
sudo ufw allow 51820/udp
sudo ufw allow OpenSSH
<br>
<u>※注意</u><br>
<u>別のファイアウォールを使用している場合、または、UFWの設定をカスタマイズしている場合は、追加のファイアウォールルールを追加する必要がある場合がある。</u><br>
<u>例えば、ネットワークトラフィックの全てをVPN接続でトンネリングする場合、DNSリクエストにはポート53、HTTPとHTTPSトラフィックにはそれぞれ80と443のようなポートを許可する必要がある。</u><br>
<u>また、VPN経由で使用する他のプロトコルがある場合は、それらのルールも追加する必要がある。</u><br>
<br>
ルールの設定を反映させるため、UFWを無効にして再度有効にする。<br>
sudo ufw disable
sudo ufw enable
<br>
ルールが反映されているかどうかを確認する。<br>
sudo ufw status
# 出力例
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)
<br>
これにより、ピアの転送やマスカレード等、VPNのトラフィックを正しく処理するようにWireGuardサーバが設定される。<br>
ファイアウォールルールを設定した後、WireGuardサービス自体を起動してピア接続をリッスンすることができる。<br>
<br>
==== 構築 ステップ6 : WireGuardサーバーの起動 ====
WireGuardは、組み込みのwg-quickスクリプトを使用して、systemdサービスとして実行するように設定できる。<br>
<br>
VPNを使用するたびに<code>wg</code>コマンドを使用して手動でトンネルを作成することもできるが、手作業で行うため繰り返しが多くなり、エラーが発生しやすくなる。<br>
代わりに、wg-quickスクリプトの助けを借りてトンネルを管理するためにSystemdサービスユニットを使用することができる。<br>
<br>
Systemdサービスユニットを使用することにより、ブート時にWireGuardが起動するように設定することで、サーバが稼働している限り、いつでもVPNに接続することができる。<br>
これを行うには、定義したwg0トンネルのwg-quickサービスをsystemctlに追加して有効にする。<br>
sudo systemctl enable wg-quick@wg0.service
<br>
<u>※注意</u><br>
<u>サービス名の一部としてトンネルwg0デバイス名を指定していることに注意する。</u><br>
<u>この名前は、/etc/wireguard/wg0.confファイルにマッピングされる。</u><br>
<u>このように名前の付けることにより、任意の個別のVPNトンネルを作成できることを意味する。</u><br>
<br>
<u>例えば、prodという名前のトンネルデバイスを持つようにする場合、その設定ファイルは/etc/wireguard/prod.confファイルとなる。</u><br>
<u>各トンネル設定には、異なるIPv4、IPv6、クライアントファイアウォール設定を含めることができる。</u><br>
<br>
<u>このようにして、それぞれ固有のIPアドレスとルーティングルールを持つ複数の異なるピア接続をサポートすることができる。</u><br>
<br>
WireGuardサービスを起動する。<br>
sudo systemctl start wg-quick@wg0.service
<br>
WireGuardサービスがアクティブであることを確認する。<br>
正常に起動している場合、アクティブ(実行中)と表示される。<br>
sudo systemctl status wg-quick@wg0.service
# 出力例
● wg-quick@wg0.service - WireGuard via wg-quick(8) for wg0
    Loaded: loaded (/lib/systemd/system/wg-quick@.service; 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.
<br>
上記の出力例では、仮想wg0デバイスを作成して、設定ファイルに追加したIPv4アドレスとIPv6アドレスを割り当てるために使用される<code>ip</code>コマンドを示している。<br>
これらのルールは、トンネルのトラブルシューティングに使用することができる。<br>
<br>
WireGuardサーバの設定と実行が完了した後、クライアントマシンをWireGuardピアとして設定して、WireGuardサーバに接続する。<br>
<br>
==== 構築 ステップ7 : WireGuardピアの設定 ====
WireGuardピアの設定は、WireGuardサーバの設定と似ており、<br>
クライアントソフトウェアをインストールした後、公開鍵と秘密鍵のペアを生成して、ピアのIPアドレスまたはアドレスを決定およびピアの設定ファイルを定義して、wg-quickスクリプトを使用してトンネルを開始する。<br>
<br>
以下の手順で鍵ペアの生成と設定することにより、VPNにいくつでもピアを追加することができる。<br>
複数のピアをVPNに追加する場合は、衝突を防ぐために必ずプライベートIPアドレスを確認すること。<br>
<br>
WireGuardピア上で、WireGuardパッケージをインストールする。<br>
sudo apt update
sudo apt install wireguard
<br>
WireGuardサーバと同様の手順で、WireGuardピア上でキーペアを生成する。<br>
<br>
まず、WireGuardピアの秘密鍵ファイルを生成する。(base64エンコードされている)<br>
出力された秘密鍵は、このセクションの後半でWireGuardピアの設定ファイルに追加する必要がある。<br>
wg genkey | sudo tee /etc/wireguard/private.key
sudo chmod go= /etc/wireguard/private.key
<br>
次に、WireGuardピアの公開鍵ファイルを生成する。(base64エンコードされている)<br>
暗号化された接続を確立するには、WireGuardピアの公開鍵をWireGuardサーバに配布する必要がある。<br>
sudo cat /etc/wireguard/private.key | wg pubkey | sudo tee /etc/wireguard/public.key
<br>
次に、WireGuardサーバへの接続を確立するために必要な全ての情報を含むWireGuardピア用の設定ファイルを作成する。<br>
この設定ファイルには、以下に示す情報が必要となる。<br>
* WireGuardピア上で生成した秘密鍵をbase64エンコードしたもの。
* WireGuardサーバで定義したIPv4およびIPv6アドレス範囲。
* WireGuardサーバから取得したbase64エンコードされた公開鍵。
* WireGuardサーバの公開IPアドレスとポート番号。<br>通常、これはIPv4アドレスになるが、もし、WireGuardサーバにIPv6アドレスがあり、クライアントマシンがインターネットにIPv6接続できる場合は、IPv4の代わりにこれを使用することができる。
<br>
WireGuardピア上にある/etc/wireguard/wg0.confファイルを、以下に示すように編集する。<br>
sudo vi /etc/wireguard/wg0.conf
<br>
<syntaxhighlight lang="ini">
# /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
</syntaxhighlight>
<br>
最初のAddressキー値は、先ほど選んだ10.8.0.0/24サブネットのIPv4アドレスを使用していることに注目する。<br>
このIPアドレスは、サーバのIPと異なる限り、サブネット内のどのアドレスでも構わない。<br>
ピアを追加するたびにアドレスを1ずつ増やすのが、一般的にIPを割り当てる最も簡単な方法である。<br>
<br>
2番目のAddressキー値は、先ほど生成したサブネットのIPv6アドレスを使用して、サーバのアドレスを1ずつ増やしていることに注目する。<br>
この場合も、異なるアドレスを使用する場合は、範囲内のどのIPでも有効である。<br>
<br>
この設定ファイルのもう1つの注目すべき部分は、AllowedIPsキー値である。<br>
この2つのIPv4とIPv6の範囲は、宛先システムがいずれかの範囲のIPアドレスを持っている場合にのみ、VPN経由でトラフィックを送信するようピアに指示する。<br>
AllowedIPsキーを使用することにより、WireGuardピアのVPNを制限して、VPN上の他のWireGuardピアやサービスのみに接続させることも、全てのトラフィックをVPN上にトンネルして、WireGuardサーバをゲートウェイとして使用するように設定することもできる。<br>
<br>
IPv4のみを使用する場合は、末尾のfd24:609a:6c18::/64範囲(、カンマを含む)を省略する。<br>
逆に、IPv6のみを使用する場合は、fd24:609a:6c18::/64プレフィックスのみを含め、10.8.0.0/24 IPv4範囲を省略する。<br>
<br>
どちらの場合も、相手のトラフィックを全てVPN経由で送信して、WireGuardサーバを全てのトラフィックのゲートウェイとして使用する場合は、<br>
IPv4アドレス空間全体を表す0.0.0.0/0と、IPv6アドレス空間全体を表す::/0を使用できる。<br>
<br>
===== オプション 1 : 全てのトラフィックをトンネル上にルーティングするピアの設定 =====
もし、ピアがリモートシステムの場合、かつ、<code>0.0.0.0/0</code>、または、<code>::/0</code>ルートを使用してトンネル上でピアの全てのトラフィックをルーティングすることを選択する場合は、このセクションの手順を行う必要がある。<br>
ピアがローカルシステムの場合は、このセクションをスキップする。<br>
<br>
パブリックIPアドレスを使用してSSHまたは他のプロトコルを介してアクセスするリモート・ピアの場合、ピアのwg0.confファイルにルールを追加する必要がある。<br>
これらのルールを追加することにより、ピアシステムが接続されている時に、トンネルの外からピアシステムに接続できるようになる。<br>
そうしないと、トンネルが確立された時に、通常パブリックネットワークインターフェースで処理される全てのトラフィックが、<br>
wg0トンネルインターフェースをバイパスするように正しくルーティングされず、アクセスできないリモートシステムになってしまうからである。<br>
<br>
まず、相手システムがデフォルトゲートウェイとして使用しているIPアドレスを特定する必要がある。<br>
ip route list table main default
# 出力例
default via 203.0.113.1 dev eth0 proto static
<br>
<u>※注意</u><br>
<u>ゲートウェイの強調表示されたIPアドレスとネットワークデバイス名(例: eth0)を覚えておくこと。</u><br>
<br>
次に、ネットワークデバイス名を使用して、相手システムのパブリックIPを探す。<br>
ip -brief address show eth0
# 出力例
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
<br>
上記の出力例では、強調表示された203.0.113.5(末尾の/20なし)が、WireGuardピア構成に追加する必要があるeth0デバイスに割り当てられているパブリックIPである。<br>
<br>
次に、WireGuardピアの/etc/wireguard/wg0.confファイルを開いて、[Peer]セクションの直前に以下に示す4行を追記する。<br>
この設定は、カスタムルーティングルールを作成して、ピアシステムへのパブリックトラフィックがデフォルトゲートウェイを使用するようにカスタムルートを追加するものである。<br>
sudo vi /etc/wireguard/wg0.conf
<br>
<syntaxhighlight lang="ini">
# /etc/wireguard/wg0.confファイル
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]
...略
</syntaxhighlight>
<br>
* <code>PostUp</code>キー値
*: <code>ip rule add table 200 from 203.0.113.5</code>とは、ピアシステムのパブリックIP 203.0.113.5に一致する場合に、200番テーブルのルーティングエントリをチェックするルールを作成する。
* <code>PostUp</code>キー値
*: <code>ip route add table 200 default via 203.0.113.1</code>とは、200番テーブルで処理されるトラフィックが、WireGuardインターフェースではなく、ゲートウェイ 203.0.113.1を使用してルーティングされるようにする。
* <code>PreDown</code>キー値
*: トンネルがシャットダウンされる時、カスタムルールとルートを削除する。
<br>
<u>※注意</u><br>
<u>これらのルールを構築する時、テーブル番号である200は任意の数値であり、<code>2〜252</code>までの値を使用することができる。</u><br>
<u>また、/etc/iproute2/rt_tablesファイルにラベルを追加して、数値の代わりにその名前を参照することで、カスタム名を使用することもできる。</u><br>
<br>
<u>Linuxでのルーティングテーブルの動作の詳細については、[http://linux-ip.net/html/routing-tables.html LinuxによるIP層ネットワーク管理ガイド]の[http://linux-ip.net/html/index.html ルーティングテーブル]を参照すること。</u><br>
<br>
全てのピアのトラフィックをVPN経由でルーティングする場合は、<br>
上記の[[設定 - VPNサーバ#構築 ステップ4 : WireGuardサーバのネットワーク設定の調整|構築 ステップ4 : WireGuardサーバのネットワーク設定の調整]]セクション、および、上記の[[設定 - VPNサーバ#構築 ステップ5 : WireGuardサーバのファイアウォールの設定|構築 ステップ5 : WireGuardサーバのファイアウォールの設定]]セクションを参照して、<br>
WireGuardサーバに正しいsysctlルールおよびiptablesルールを設定していることを確認すること。<br>
<br>
===== オプション 2 : WireGuardピアのDNSリゾルバの設定 =====
WireGuardサーバをピアトラフィック全体のVPNゲートウェイとして使用する場合は、[Interface]セクションにDNSリゾルバを指定する行を追加する必要がある。<br>
この設定を行わない場合、DNSリクエストがVPNによって保護されなかったり、インターネットサービスプロバイダ(ISP)またはその他のサードパーティに公開される可能性がある。<br>
<br>
WireGuardを使用してVPNネットワーク上のリソースにアクセスする場合、または、ピアツーピア構成でのみ使用する場合は、このセクションをスキップすることができる。<br>
<br>
ピアの設定にDNSリゾルバを追加するには、まず、WireGuardサーバ上でWireGuardサーバが使用しているDNSサーバを特定する。<br>
出力されるIPアドレスは、WireGuardサーバが使用しているDNSリゾルバである。<br>
ニーズに応じて、これらのいずれかまたは全てを使用するかどうか、IPv4またはIPv6のみを使用するかどうかを選択することができる。<br>
resolvectl dns <ネットワークインターフェース名>
例 : resolvectl dns eth0
# 出力例
Link 2 (eth0): 67.207.67.2 67.207.67.3 2001:4860:4860::8844 2001:4860:4860::8888
<br>
次に、選択したリゾルバをWireGuardピアの設定ファイルに追加する必要がある。<br>
WireGuardピア上にある/etc/wireguard/wg0.confファイルにおいて、[Peer]セクションの直前に以下に示す設定を追記する。<br>
sudo vi /etc/wireguard/wg0.conf
<br>
<syntaxhighlight lang="ini">
# /etc/wireguard/wg0.confファイル
DNS = 67.207.67.2 2001:4860:4860::8844
[Peer]
...略
</syntaxhighlight>
<br>
この場合も、IPv4とIPv6の好みや要件に応じてリストを編集する。<br>
<br>
DNSリゾルバ設定が完了した後は、ピアの公開鍵をwireGuardサーバに追加して、ピア上でWireGuardトンネルを開始する。<br>
<br>
※注意<br>
次のセクションでVPNに接続した後、[https://www.dnsleaktest.com/ DNSリークテスト]を実施して、VPN経由でDNSクエリを送信していることを確認することができる。<br>
また、WireGuardサーバ上で実行したように、<code>resolvectl dns</code>コマンドを実行して、相手が設定されたリゾルバを使用していることを確認することもできる。<br>
VPNトンネル用に設定したDNSリゾルバを示すような出力が得られるはずである。<br>
# 出力例
Global: 67.207.67.2 67.207.67.3
...略
<br>
==== 構築 ステップ8 : WireGuardサーバへのピアの公開鍵の追加 ====
ピアをWireGuardサーバに接続する前に、ピアの公開鍵をWireGuardサーバに追加する必要がある。<br>
これにより、VPNに接続して、VPN上でトラフィックをルーティングできるようになる。<br>
この手順を実施しない場合、WireGuardサーバは、ピアがトンネル上でトラフィックを送受信することを許可しない。<br>
<br>
まず、WireGuardピアのbase64エンコード公開鍵のコピーがあることを確認する。<br>
sudo cat /etc/wireguard/public.key
# 出力例
PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg=
<br>
次に、WireGuardサーバにログインして、以下のコマンドを実行する。<br>
sudo wg set wg0 peer PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg= allowed-ips 10.8.0.2,fd24:609a:6c18::2
<br>
<code>allowed-ips</code>オプションには、IPv4アドレスとIPv6アドレスをカンマ区切りで指定する。<br>
ピアが自分自身に割り当てるIPアドレスを制限したい場合は個々のIPを指定する。<br>
ピアがVPN範囲内のどのIPアドレスでも使用できる場合は、上記の例のように範囲を指定する。<br>
また、2つのピアが同じ<code>allowed-ips</code>オプションを持つことはできないことに注意する。
<br>
既存のピアの<code>allowed-ips</code>オプションを更新する場合は、同じコマンドを再度実行して、IPアドレスを変更する。<br>
<br>
複数のIPアドレスにも対応しており、例えば、追加したばかりのWireGuardピアを変更して、既存の10.8.0.2とfd24:609a:6c18::2のIPに10.8.0.100のようなIPを追加する場合は、<br>
以下の例のように実行する。<br>
sudo wg set wg0 peer PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg= allowed-ips 10.8.0.2,10.8.0.100,fd24:609a:6c18::2
<br>
ピアを追加するコマンドを実行した後、<code>wg</code>コマンドを実行してWireGuardサーバ上のトンネルのステータスを確認する。<br>
sudo wg
# 出力例
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
<br>
<code>peer</code>の行には、WireGuardピアの公開鍵と、WireGuardピアが自分自身にIPを割り当てるために使用できるIPアドレスまたはアドレスの範囲が表示されていることに注意する。<br>
<br>
WireGuardサーバ上でピアの接続パラメータを定義したので、次のセクションではピア上でトンネルを開始する。<br>
<br>
==== 構築 ステップ9 : WireGuard ピアのトンネルへの接続 ====
WireGuardサーバとWireGuardピアの両方がIPv4、IPv6、パケット転送、DNS解決をサポートするように設定した後、最後にWireGuardピアをVPNトンネルに接続する。<br>
<br>
VPNを有効にする場面は特定のユースケースのみかもしれないため、<code>wg-quick</code>コマンドを実行して手動で接続を確立することにする。<br>
WireGuardサーバ上で行ったようにトンネルの起動を自動化する場合は、<code>wq-quick</code>コマンドの代わりに、[[設定 - VPNサーバ#構築 ステップ6 : WireGuardサーバー]]の起動セクションの手順に従うこと。<br>
<br>
全てのトラフィックをVPN経由でルーティングして、DNS転送を設定している場合、トンネルを開始する前にWireGuardピアにresolvconfユーティリティをインストールする必要がある。<br>
sudo apt install resolvconf
<br>
トンネルを開始するには、WireGuardピアで以下に示すコマンドを実行する。<br>
sudo wg-quick up wg0
# 出力例
[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -4 address add 10.8.0.2/24 dev wg0          # WireGuardピアに割り当てたIPv4のアドレス
[#] ip -6 address add fd24:609a:6c18::2/64 dev wg0  # WireGuardピアに割り当てたIPv6のアドレス
[#] ip link set mtu 1420 up dev wg0
[#] resolvconf -a tun.wg0 -m 0 -x
<br>
WireGuardピアの<code>AllowedIPs</code>を<code>0.0.0.0/0</code>と<code>::/0</code>に設定している場合、あるいは、VPN用に選んだ範囲以外を使用している場合、以下に示すような出力例となる。<br>
# 出力例
[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -4 address add 10.8.0.2/24 dev wg0              # WireGuardピアに割り当てたIPv4のアドレス
[#] ip -6 address add fd24:609a:6c18::2/64 dev wg0    # WireGuardピアに割り当てたIPv6のアドレス
[#] 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          # コマンドが追加したルート (ピア設定の<u>AllowedIPs</u>に対応している)
[#] 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      # コマンドが追加したルート (ピア設定の<u>AllowedIPs</u>に対応している)
[#] 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
<br>
WireGuardピア上のトンネルのステータスを確認する。<br>
sudo wg
# 出力例
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
<br>
ip routeコマンドとip -6 routeコマンドを実行して、WirGuardピアがVPNを使用していることを確認する。<br>
全てのインターネットトラフィックのゲートウェイとしてVPNを使用している場合、CloudFlareの1.1.1.1および2606:4700:4700::1111のDNSリゾルバ宛てのトラフィックにどのインターフェースが使用されるかを確認する。<br>
<br>
WireGuardを使用してVPN上のリソースにアクセスする場合のみ、ゲートウェイ自体のような有効なIPv4またはIPv6アドレスに置き換えること。<br>
wg0デバイスが使用され、WireGuardピアに割り当てたIPv4アドレス10.8.0.2が使用されていることに注意すること。<br>
例: 10.8.0.1またはfd24:609a:6c18::1<br>
ip route get 1.1.1.1
# 出力例
1.1.1.1 dev wg0 table 51820 src 10.8.0.2 uid 1000
  cache
<br>
同様に、IPv6を使用している場合は、以下を実行する。<br>
再度、wg0インターフェースと、WireGuardピアに割り当てたIPv6アドレスfd24:609a:6c18::2に注意すること。<br>
ip -6 route get 2606:4700:4700::1111
# 出力例
2606:4700:4700::1111 from :: dev wg0 table 51820 src fd24:609a:6c18::2 metric 1024 pref medium
<br>
また、Webブラウザから、https://ipleak.net/ や https://ipv6-test.com/ にアクセスして、相手がVPN経由でトラフィックをルーティングしていることを確認することもできる。<br>
<br>
WireGuardピアのVPNを切断する準備ができた後は、<code>wg-quick</code>コマンドを実行する。<br>
VPNトンネルがシャットダウンされたことを示す以下のような出力が表示される。<br>
sudo wg-quick down wg0
# 出力例
[#] ip link delete dev wg0
[#] resolvconf -d tun.wg0 -f
<br>
例えば、WireGuardピアの<code>AllowedIPs</code>を<code>0.0.0.0/0</code>と<code>::/0</code>に設定した場合、あるいは、VPN用に選んだ範囲以外を使用した場合は、以下に示すような出力のようになる。<br>
[#] 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
<br>
VPNに再接続するには、WireGuardピア上で以下に示すコマンドを再度実行する。<br>
sudo wg-quick up wg0
<br>
WireGuardサーバからピアの設定を完全に削除する場合は、削除するピアの公開鍵を正しく置き換えて、以下に示すコマンドを実行する。<br>
sudo wg set wg0 peer <ピアの公開鍵の内容> remove
# 実行例
sudo wg set wg0 peer PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg= remove
<br>
<u>※注意</u><br>
<u>通常、ピアの設定を削除する必要がある場合は、そのピアがもう存在しないか、暗号化キーが漏洩または変更された場合のみである。</u><br>
<u>そうでない場合は、設定を残しておいたほうがよい。</u><br>
<u>そのように運用することにより、ピアはその都度キーや<code>allowed-ips</code>を追加しなくても、VPNに再接続できるようになる。</u><br>
<br><br>
<br><br>


__FORCETOC__
__FORCETOC__
[[カテゴリ:RHEL]][[カテゴリ:SUSE]][[カテゴリ:Raspberry_Pi]][[カテゴリ:PinePhone]][[カテゴリ:Windows10]]
[[カテゴリ:RHEL]][[カテゴリ:SUSE]][[カテゴリ:Raspberry_Pi]][[カテゴリ:PinePhone]][[カテゴリ:Windows10]]