設定 - VPNサーバ
概要
WireGuard
WireGuardは、IPv4およびIPv6接続をサポートする軽量のVPNである。
VPNは、信頼されていないネットワークをプライベートネットワークであるかのように通過することができる。
また、Tailscaleの仕組みと同様に、SSHや他の機密ポートをオープンにしておく必要がないように、自社のインフラにアクセスするためにVPNを導入したいと思うかもしれない。
WireGuardの暗号化は、ピア同士が暗号化されたトンネルを確立するための公開鍵と秘密鍵に依存している。
WireGuardの各バージョンでは、シンプルさ、セキュリティ、ピアとの互換性を確保するために、特定の暗号スイートが使用されている。
それに比べて、OpenVPNやIPSec等の他のVPNソフトウェアは、TLS(Transport Layer Security)と証明書を使用して、システム間の認証と暗号化トンネルの確立を行う。
TLSのバージョンが異なると、何百種類もの暗号スイートやアルゴリズムがサポートされるため、様々なクライアントに柔軟に対応できる反面、TLSを使用したVPNの設定に時間がかかり、複雑で、エラーが起こりやすくなる。
Shadowsocksとは
Shadowsocksは、SOCKS5プロキシを使用してインターネットトラフィックを迂回・偽装して、検閲ブロックを突破するツールである。
当初は中国のプログラマーによって開発されたため、中国のグレート・ファイアウォールを突破するのに特に役立つが、他の政権のブロックを回避するためにも使用できるという報告を受けている。
しかし、Netflixのリージョンを変更したり、Torrentを利用したりするのであれば、VPNを利用した方がはるかに良い。
Shadowsocksの問題点は、設定に少しコツがいることである。
Shadowsocksをインストールする方法はいくつかあるが、その多くはギークが作成したスクリプトを使用する必要がある。
VPNサーバの構築 (BPHの使用)
BPHの概要
しかし、Netflixやその他のストリーミングサービスのブロックを解除する場合、VPSを使用してもVPNの使用が検出される可能性が高いため、うまくいかない場合がある。
また、Torrentの利用にはセキュリティの強化が必要なため、VPSの利用は推奨しない。
VPSとOutlineというソフトウェアを使用して、Shadowsocksプロトコルをセットアップした方がよい。
BPHサービス企業
BPH(防弾ホスティング)のVPS
- HostMaze
- ルーマニア拠点
- https://hostmaze.com
- CockBox
- ルーマニア拠点
- https://cockbox.org
- W3Space
- バングラデシュ拠点
- https://www.w3space.net/
- VPSAG
- キプロスに拠点を置く。サーバは、ブルガリアのNeterraを利用している。
- https://www.vpsag.com/
- Vultr
- BitLaunch
- Pterodactyl
- NiceVPS.net
構築 ステップ1 : WireGuardのインストールとキーペアの生成
Debian 11上でWireGuardをセットアップして、IPv4とIPv6の両方の接続(一般にデュアルスタック接続と呼ばれる)を使用して、ピアとして接続するように別のデバイスを設定する。
また、暗号化されたP2PトンネルにVPNを使用するだけでなく、ゲートウェイ構成でピアのインターネットトラフィックをWireGuardサーバー経由でルーティングする方法も記載する。
ここでは、Debian 11をWireGuardサーバのピア(クライアントとも呼ばれる)として設定する。
まず、WireGuardをサーバにインストールする。
sudo apt update sudo apt install wireguard
次に、WireGuardサーバ用の秘密鍵と公開鍵のペアを生成する。
組み込みのwg genkeyおよびwg pubkeyコマンドを使用して鍵を作成して、秘密鍵をWireGuardの設定ファイルに追加する。
<bt>
また、chmodコマンドを使用して、作成した鍵のパーミッションを変更する必要がある。
(chmod go=
コマンドは、ルートユーザだけが秘密鍵にアクセスできるように、ルートユーザ以外のユーザやグループのファイルのパーミッションを削除している。)
wg genkey | sudo tee /etc/wireguard/private.key sudo chmod go= /etc/wireguard/private.key
base64エンコードされた1行を出力する。これが秘密鍵である。
この出力は、/etc/wireguard/private.keyファイルにも保存されている。
出力された秘密鍵は、WireGuardの設定ファイルに追加する必要があるため、覚えておく必要がある。
次に、秘密鍵から派生する対応する公開鍵を作成する。
- 最初のコマンドは、秘密鍵ファイルを読み込み、標準出力ストリームに出力する。
- 2番目のコマンドは、最初のコマンドの出力を標準入力として受け取り、それを処理して公開鍵を生成する。
- 最後のコマンドは、公開鍵生成コマンドの出力を受け取り、/etc/wireguard/public.keyファイルにリダイレクトする。
sudo cat /etc/wireguard/private.key | wg pubkey | sudo tee /etc/wireguard/public.key
上記のコマンドを実行すると、Base64エンコードされた出力が1行表示される。
この公開鍵は、WireGuardサーバに接続するピアに配布する必要があるため、参照用にどこかにコピーする必要がある。
構築 ステップ2 : IPv4 および IPv6 アドレスの選択
上記のセクションでは、WireGuardをインストールし、サーバとの間のトラフィックを暗号化するために使用するキーペアを生成した。
このセクションでは、WireGuardサーバ用の設定ファイルを作成して、WireGuardサーバの再起動時にWireGuardが自動的に起動するように設定する。
また、WireGuardサーバとピアで使用するプライベートIPv4アドレスとIPv6アドレスを定義する。
IPv4アドレスとIPv6アドレスの両方を使用する場合は、このセクションの両方に従う必要がある。
IPv4を使用する
WireGuardサーバをIPv4ピアで使用する場合、サーバには、クライアントおよびトンネルインターフェースに使用するプライベートIPv4アドレスの範囲が必要である。
以下の予約済みアドレスブロックから、任意の範囲のIPアドレスを選択できる。
- 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の範囲であればどのアドレスでも使用できる。
10.8.0.1/24と異なるものを使用する場合は、選択したIPアドレスを覚えておくこと。
このIPv4アドレスは、次のセクションで定義する設定ファイルに追加する。
IPv6を使用する
IPv6でWireGuardを使用する場合は、RFC 4193のアルゴリズムに基づいて、一意のローカルIPv6ユニキャストアドレスプレフィックスを生成する必要がある。
WireGuardサーバで使用するアドレスは、仮想トンネルインターフェースに関連付けられる。
プライベートIPv6アドレスの予約済みfd00::/8ブロック内でランダムな一意のIPv6プレフィックスを生成するには、いくつかの手順を完了する必要がある。
RFCによると、一意のIPv6プレフィックスを取得する推奨方法は、シリアル番号やデバイスIDのようなシステムからの一意の識別値と時刻を組み合わせることである。
これらの値は、ハッシュ化されて切り捨てられた結果、IPの予約済みプライベートfd00::/8ブロック内で一意なアドレスとして使用できるビットセットになる。
まず、WireGuardサーバのIPv6範囲の生成を開始するには、日付ユーティリティを使用して64ビットのタイムスタンプを収集する。
以下の例では、1970-01-01 00:00:00 UTCからの秒数(date
コマンドの%s
)とナノ秒数(%N
)を合わせたものである。
date +%s%N 出力例 : 1650301699497770167
次に、WireGuardサーバのマシンID値を、/var/lib/dbus/machine-idファイルからコピーする。
この識別子は、システム固有のもので、WireGuardサーバが存在する限り変更されることはない。
# /var/lib/dbus/machine-idファイルの例 610cef4946ed46da8f71dba9d66c67fb
タイムスタンプとマシンIDを組み合わせて、SHA-1アルゴリズムを使用してハッシュ化する必要がある。
printf <タイムスタンプ><マシンID> | sha1sum # 実行例 : printf 1650301699497770167610cef4946ed46da8f71dba9d66c67fb | sha1sum # 出力例 : 442adea1488d96388dae9ab816045b24609a6c18 -
sha1sum
コマンドの出力は16進数であるため、1バイトのデータを表すのに2文字を使用することに注意する。
例えば、出力例の4fと26は、ハッシュ化されたデータの最初の2バイトである。
RFCのアルゴリズムは、ハッシュ化された出力の最下位(末尾)の40ビット、つまり5バイトしか必要としないため、cut
コマンドを使用して、ハッシュから最後の5バイトを16進エンコードして出力する。
-c
オプションは、cut
コマンドに指定された文字の集合だけを選択するように指示する。
例えば、31-オプションは、cut
コマンドに31位から入力行の終わりまでの全ての文字を表示する。
printf 442adea1488d96388dae9ab816045b24609a6c18 | cut -c 31- # 出力例 : 24609a6c18
上記の出力例では、バイトのセットは、24 60 9a 6c 18となる。
これにより、生成した5バイトをfdプレフィックスに追加して、2バイトごとに:(コロン)で区切って読みやすくすることで、一意のIPv6ネットワークプレフィックスを構築することができる。
一意なプレフィックスに含まれる各サブネットは、合計で18,446,744,073,709,551,616個のIPv6アドレスを保持できるため、簡単にするためにサブネットを標準サイズの/64に制限することができる。
先に/64サブネットサイズで生成したバイトを使用すると、結果のプレフィックスは次のようになる。
# 一意のローカルIPv6プレフィックス例 fd24:609a:6c18::/64
上記の例のfd24:609a:6c18::/64の範囲は、WireGuardサーバとピアのWireGuardトンネルインターフェイスに個々のIPアドレスを割り当てるために使用する。
WireGuardサーバにIPアドレスを割り当てるには、最後の::
の後に1を追加する。
上記のものを例に取ると、アドレスはfd24:609a:6c18::1/64になる。
ピアはこの範囲内のどのIPアドレスでも使用できるが、通常はピアを追加するたびに値を1ずつ増やす。(例 : fd24:609a:6c18::2/64)
このIPアドレスは、次のセクションのWireGuardサーバの設定で使用するために覚えておく必要がある。
構築 ステップ3 : WireGuardサーバ構成の作成
秘密鍵とIPアドレスを使用して、WireGuardサーバの設定ファイルを作成する。
- PrivateKey
- 秘密鍵ファイルのフルパスを指定する。
- Address
- IPアドレスを指定する。
- SaveConfig
- WireGuardインターフェイスがシャットダウンされた時に、変更内容が設定ファイルに保存されるようにする設定である。
- ListenPort
- WireGuardを別のポートで使用したい場合は、値を変更する。
sudo vi /etc/wireguard/wg0.conf
# /etc/wireguard/wg0.confファイル
[Interface]
PrivateKey = <秘密鍵ファイルのフルパス>
Address = <IPv4のアドレス 例 : 10.8.0.1/24>, <IPv6のアドレス 例 : fd24:609a:6c18::1/64>
ListenPort = 51820
SaveConfig = true
構築 ステップ4 : WireGuardサーバのネットワーク設定の調整
WireGuardピアのインターネットトラフィックをWireGuardサーバー経由でルーティングする場合は、このセクションに従ってIP転送を設定する必要がある。
WireGuardを使用してピアをWireGuardサーバーに接続して、サーバー上のサービスにのみアクセスする場合は、このセクションの設定は不要である。
転送の設定をするには、/etc/sysctl.confファイルを編集する。
sudo vi /etc/sysctl.conf
WireGuardでIPv4を使用している場合は、ファイルの一番下に以下の行を追加する。
net.ipv4.ip_forward=1
WireGuardでIPv6を使用する場合は、ファイルの末尾に次の行を追加する。
net.ipv6.conf.all.forwarding=1
IPv4とIPv6の両方を使用する場合は、両方の行を追記する。
設定を反映させる。
sudo sysctl -p
これにより、WireGuardサーバは、仮想VPNイーサネットデバイスからの受信トラフィックをサーバー上の他のデバイスに転送して、そこからパブリックインターネットに転送できるようになる。
この設定を使用すると、WireGuardピアからの全てのウェブトラフィックをサーバのIPアドレス経由で転送できるようになり、クライアントのパブリックIPアドレスは効果的に隠蔽される。
ただし、トラフィックをサーバ経由で正しくルーティングする前に、いくつかのファイアウォールルールを設定する必要がある。
このルールにより、WireGuardサーバとピアとの間のトラフィックが正しく流れるようになる。
構築 ステップ5 : WireGuardサーバのファイアウォールの設定
このセクションでは、WireGuardサーバとクライアント間のトラフィックが正しくルーティングされるようにするため、ファイアウォールルールを追加する。
もし、WireGuard VPNをマシン間接続にのみ使用して、VPNに制限されているリソースにアクセスする場合は、この設定は不要である。
WireGuard VPNトラフィックをサーバのファイアウォール経由で許可する場合は、マスカレードを有効にする必要がある。
マスカレードとは、クライアント接続を正しくルーティングするためにオンザフライで動的なネットワークアドレス変換(NAT)を行うiptablesの概念である。
まず、WireGuardサーバのパブリックネットワークインターフェースを探す。
パブリックインターフェースは、このコマンド出力の"dev"の後に続く文字列である。
以下の例では、eth0というインターフェイスが表示される。
ip route list default # 出力例 default via 203.0.113.1 dev eth0 proto static
ファイアウォールルールをWireGuardサーバに追加するため、/etc/wireguard/wg0.confファイルの最下行に、以下に示す設定を追記する。
sudo vi /etc/wireguard/wg0.conf
# /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インターフェイスの転送ルールとマスカレードルールを元に戻す働きをする。
どちらの場合も、VPNに適したIPv4ルールとIPv6ルールを含むか含まないか、設定を編集する。
例えば、IPv4のみを使用しているのであれば、ip6tables
コマンドで行を除外することができる。
逆に IPv6のみを使うのであれば、ip6tables
コマンドだけを含むように設定を編集する。
PreDown
キー値のufw 〜と記述している設定は、IPv4とIPv6のネットワークの組み合わせに関係なく存在する必要がある。
WireGuardサーバのファイアウォール設定の最後は、WireGuard UDPポート自体とのトラフィックを許可することである。
また、WireGuardサーバの/etc/wireguard/wg0.confファイルでポートを変更しなかった場合、デフォルトで使用されるポートは51820
である。
もし、別のポートを使用する場合は、必ずufw
コマンドを実行して、該当ポートを置き換えること。
また、SSHのポートを開放すること。
sudo ufw allow 51820/udp sudo ufw allow OpenSSH
※注意
別のファイアウォールを使用している場合、または、UFWの設定をカスタマイズしている場合は、追加のファイアウォールルールを追加する必要がある場合がある。
例えば、ネットワークトラフィックの全てをVPN接続でトンネリングする場合、DNSリクエストにはポート53、HTTPとHTTPSトラフィックにはそれぞれ80と443のようなポートを許可する必要がある。
また、VPN経由で使用する他のプロトコルがある場合は、それらのルールも追加する必要がある。
ルールの設定を反映させるため、UFWを無効にして再度有効にする。
sudo ufw disable sudo ufw enable
ルールが反映されているかどうかを確認する。
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)
これにより、ピアの転送やマスカレード等、VPNのトラフィックを正しく処理するようにWireGuardサーバが設定される。
ファイアウォールルールを設定した後、WireGuardサービス自体を起動してピア接続をリッスンすることができる。
構築 ステップ6 : WireGuardサーバーの起動
WireGuardは、組み込みのwg-quickスクリプトを使用して、systemdサービスとして実行するように設定できる。
VPNを使用するたびにwg
コマンドを使用して手動でトンネルを作成することもできるが、手作業で行うため繰り返しが多くなり、エラーが発生しやすくなる。
代わりに、wg-quickスクリプトの助けを借りてトンネルを管理するためにSystemdサービスユニットを使用することができる。
Systemdサービスユニットを使用することにより、ブート時にWireGuardが起動するように設定することで、サーバが稼働している限り、いつでもVPNに接続することができる。
これを行うには、定義したwg0トンネルのwg-quickサービスをsystemctlに追加して有効にする。
sudo systemctl enable wg-quick@wg0.service
※注意
サービス名の一部としてトンネルwg0デバイス名を指定していることに注意する。
この名前は、/etc/wireguard/wg0.confファイルにマッピングされる。
このように名前の付けることにより、任意の個別のVPNトンネルを作成できることを意味する。
例えば、prodという名前のトンネルデバイスを持つようにする場合、その設定ファイルは/etc/wireguard/prod.confファイルとなる。
各トンネル設定には、異なるIPv4、IPv6、クライアントファイアウォール設定を含めることができる。
このようにして、それぞれ固有のIPアドレスとルーティングルールを持つ複数の異なるピア接続をサポートすることができる。
WireGuardサービスを起動する。
sudo systemctl start wg-quick@wg0.service
WireGuardサービスがアクティブであることを確認する。
正常に起動している場合、アクティブ(実行中)と表示される。
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.
上記の出力例では、仮想wg0デバイスを作成して、設定ファイルに追加したIPv4アドレスとIPv6アドレスを割り当てるために使用されるip
コマンドを示している。
これらのルールは、トンネルのトラブルシューティングに使用することができる。
WireGuardサーバの設定と実行が完了した後、クライアントマシンをWireGuardピアとして設定して、WireGuardサーバに接続する。
構築 ステップ7 : WireGuardピアの設定
WireGuardピアの設定は、WireGuardサーバの設定と似ており、
クライアントソフトウェアをインストールした後、公開鍵と秘密鍵のペアを生成して、ピアのIPアドレスまたはアドレスを決定およびピアの設定ファイルを定義して、wg-quickスクリプトを使用してトンネルを開始する。
以下の手順で鍵ペアの生成と設定することにより、VPNにいくつでもピアを追加することができる。
複数のピアをVPNに追加する場合は、衝突を防ぐために必ずプライベートIPアドレスを確認すること。
WireGuardピア上で、WireGuardパッケージをインストールする。
sudo apt update sudo apt install wireguard
WireGuardサーバと同様の手順で、WireGuardピア上でキーペアを生成する。
まず、WireGuardピアの秘密鍵ファイルを生成する。(base64エンコードされている)
出力された秘密鍵は、このセクションの後半でWireGuardピアの設定ファイルに追加する必要がある。
wg genkey | sudo tee /etc/wireguard/private.key sudo chmod go= /etc/wireguard/private.key
次に、WireGuardピアの公開鍵ファイルを生成する。(base64エンコードされている)
暗号化された接続を確立するには、WireGuardピアの公開鍵をWireGuardサーバに配布する必要がある。
sudo cat /etc/wireguard/private.key | wg pubkey | sudo tee /etc/wireguard/public.key
次に、WireGuardサーバへの接続を確立するために必要な全ての情報を含むWireGuardピア用の設定ファイルを作成する。
この設定ファイルには、以下に示す情報が必要となる。
- WireGuardピア上で生成した秘密鍵をbase64エンコードしたもの。
- WireGuardサーバで定義したIPv4およびIPv6アドレス範囲。
- WireGuardサーバから取得したbase64エンコードされた公開鍵。
- WireGuardサーバの公開IPアドレスとポート番号。
通常、これはIPv4アドレスになるが、もし、WireGuardサーバにIPv6アドレスがあり、クライアントマシンがインターネットにIPv6接続できる場合は、IPv4の代わりにこれを使用することができる。
WireGuardピア上にある/etc/wireguard/wg0.confファイルを、以下に示すように編集する。
sudo vi /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キーを使用することにより、WireGuardピアのVPNを制限して、VPN上の他のWireGuardピアやサービスのみに接続させることも、全てのトラフィックをVPN上にトンネルして、WireGuardサーバをゲートウェイとして使用するように設定することもできる。
IPv4のみを使用する場合は、末尾のfd24:609a:6c18::/64範囲(、カンマを含む)を省略する。
逆に、IPv6のみを使用する場合は、fd24:609a:6c18::/64プレフィックスのみを含め、10.8.0.0/24 IPv4範囲を省略する。
どちらの場合も、相手のトラフィックを全てVPN経由で送信して、WireGuardサーバを全てのトラフィックのゲートウェイとして使用する場合は、
IPv4アドレス空間全体を表す0.0.0.0/0と、IPv6アドレス空間全体を表す::/0を使用できる。
オプション 1 : 全てのトラフィックをトンネル上にルーティングするピアの設定
もし、ピアがリモートシステムの場合、かつ、0.0.0.0/0
、または、::/0
ルートを使用してトンネル上でピアの全てのトラフィックをルーティングすることを選択する場合は、このセクションの手順を行う必要がある。
ピアがローカルシステムの場合は、このセクションをスキップする。
パブリックIPアドレスを使用してSSHまたは他のプロトコルを介してアクセスするリモート・ピアの場合、ピアのwg0.confファイルにルールを追加する必要がある。
これらのルールを追加することにより、ピアシステムが接続されている時に、トンネルの外からピアシステムに接続できるようになる。
そうしないと、トンネルが確立された時に、通常パブリックネットワークインターフェースで処理される全てのトラフィックが、
wg0トンネルインターフェースをバイパスするように正しくルーティングされず、アクセスできないリモートシステムになってしまうからである。
まず、相手システムがデフォルトゲートウェイとして使用しているIPアドレスを特定する必要がある。
ip route list table main default # 出力例 default via 203.0.113.1 dev eth0 proto static
※注意
ゲートウェイの強調表示されたIPアドレスとネットワークデバイス名(例: eth0)を覚えておくこと。
次に、ネットワークデバイス名を使用して、相手システムのパブリックIPを探す。
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
上記の出力例では、強調表示された203.0.113.5(末尾の/20なし)が、WireGuardピア構成に追加する必要があるeth0デバイスに割り当てられているパブリックIPである。
次に、WireGuardピアの/etc/wireguard/wg0.confファイルを開いて、[Peer]セクションの直前に以下に示す4行を追記する。
この設定は、カスタムルーティングルールを作成して、ピアシステムへのパブリックトラフィックがデフォルトゲートウェイを使用するようにカスタムルートを追加するものである。
sudo vi /etc/wireguard/wg0.conf
# /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]
...略
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サーバのネットワーク設定の調整セクション、および、上記の構築 ステップ5 : WireGuardサーバのファイアウォールの設定セクションを参照して、
WireGuardサーバに正しいsysctlルールおよびiptablesルールを設定していることを確認すること。
オプション 2 : WireGuardピアのDNSリゾルバの設定
WireGuardサーバをピアトラフィック全体のVPNゲートウェイとして使用する場合は、[Interface]セクションにDNSリゾルバを指定する行を追加する必要がある。
この設定を行わない場合、DNSリクエストがVPNによって保護されなかったり、インターネットサービスプロバイダ(ISP)またはその他のサードパーティに公開される可能性がある。
WireGuardを使用してVPNネットワーク上のリソースにアクセスする場合、または、ピアツーピア構成でのみ使用する場合は、このセクションをスキップすることができる。
ピアの設定にDNSリゾルバを追加するには、まず、WireGuardサーバ上でWireGuardサーバが使用しているDNSサーバを特定する。
出力されるIPアドレスは、WireGuardサーバが使用しているDNSリゾルバである。
ニーズに応じて、これらのいずれかまたは全てを使用するかどうか、IPv4またはIPv6のみを使用するかどうかを選択することができる。
resolvectl dns <ネットワークインターフェース名> 例 : resolvectl dns eth0 # 出力例 Link 2 (eth0): 67.207.67.2 67.207.67.3 2001:4860:4860::8844 2001:4860:4860::8888
次に、選択したリゾルバをWireGuardピアの設定ファイルに追加する必要がある。
WireGuardピア上にある/etc/wireguard/wg0.confファイルにおいて、[Peer]セクションの直前に以下に示す設定を追記する。
sudo vi /etc/wireguard/wg0.conf
# /etc/wireguard/wg0.confファイル
DNS = 67.207.67.2 2001:4860:4860::8844
[Peer]
...略
この場合も、IPv4とIPv6の好みや要件に応じてリストを編集する。
DNSリゾルバ設定が完了した後は、ピアの公開鍵をwireGuardサーバに追加して、ピア上でWireGuardトンネルを開始する。
※注意
次のセクションでVPNに接続した後、DNSリークテストを実施して、VPN経由でDNSクエリを送信していることを確認することができる。
また、WireGuardサーバ上で実行したように、resolvectl dns
コマンドを実行して、相手が設定されたリゾルバを使用していることを確認することもできる。
VPNトンネル用に設定したDNSリゾルバを示すような出力が得られるはずである。
# 出力例 Global: 67.207.67.2 67.207.67.3 ...略
構築 ステップ8 : WireGuardサーバへのピアの公開鍵の追加
ピアをWireGuardサーバに接続する前に、ピアの公開鍵をWireGuardサーバに追加する必要がある。
これにより、VPNに接続して、VPN上でトラフィックをルーティングできるようになる。
この手順を実施しない場合、WireGuardサーバは、ピアがトンネル上でトラフィックを送受信することを許可しない。
まず、WireGuardピアのbase64エンコード公開鍵のコピーがあることを確認する。
sudo cat /etc/wireguard/public.key # 出力例 PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg=
次に、WireGuardサーバにログインして、以下のコマンドを実行する。
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.2とfd24:609a:6c18::2のIPに10.8.0.100のようなIPを追加する場合は、
以下の例のように実行する。
sudo wg set wg0 peer PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg= allowed-ips 10.8.0.2,10.8.0.100,fd24:609a:6c18::2
ピアを追加するコマンドを実行した後、wg
コマンドを実行してWireGuardサーバ上のトンネルのステータスを確認する。
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
peer
の行には、WireGuardピアの公開鍵と、WireGuardピアが自分自身にIPを割り当てるために使用できるIPアドレスまたはアドレスの範囲が表示されていることに注意する。
WireGuardサーバ上でピアの接続パラメータを定義したので、次のセクションではピア上でトンネルを開始する。
構築 ステップ9 : WireGuard ピアのトンネルへの接続
WireGuardサーバとWireGuardピアの両方がIPv4、IPv6、パケット転送、DNS解決をサポートするように設定した後、最後にWireGuardピアをVPNトンネルに接続する。
VPNを有効にする場面は特定のユースケースのみかもしれないため、wg-quick
コマンドを実行して手動で接続を確立することにする。
WireGuardサーバ上で行ったようにトンネルの起動を自動化する場合は、wq-quick
コマンドの代わりに、設定 - VPNサーバ#構築 ステップ6 : WireGuardサーバーの起動セクションの手順に従うこと。
全てのトラフィックをVPN経由でルーティングして、DNS転送を設定している場合、トンネルを開始する前にWireGuardピアにresolvconfユーティリティをインストールする必要がある。
sudo apt install resolvconf
トンネルを開始するには、WireGuardピアで以下に示すコマンドを実行する。
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
WireGuardピアのAllowedIPs
を0.0.0.0/0
と::/0
に設定している場合、あるいは、VPN用に選んだ範囲以外を使用している場合、以下に示すような出力例となる。
# 出力例 [#] 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 # コマンドが追加したルート (ピア設定のAllowedIPsに対応している) [#] 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 # コマンドが追加したルート (ピア設定のAllowedIPsに対応している) [#] 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
WireGuardピア上のトンネルのステータスを確認する。
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
ip routeコマンドとip -6 routeコマンドを実行して、WirGuardピアがVPNを使用していることを確認する。
全てのインターネットトラフィックのゲートウェイとしてVPNを使用している場合、CloudFlareの1.1.1.1および2606:4700:4700::1111のDNSリゾルバ宛てのトラフィックにどのインターフェースが使用されるかを確認する。
WireGuardを使用してVPN上のリソースにアクセスする場合のみ、ゲートウェイ自体のような有効なIPv4またはIPv6アドレスに置き換えること。
wg0デバイスが使用され、WireGuardピアに割り当てたIPv4アドレス10.8.0.2が使用されていることに注意すること。
例: 10.8.0.1またはfd24:609a:6c18::1
ip route get 1.1.1.1 # 出力例 1.1.1.1 dev wg0 table 51820 src 10.8.0.2 uid 1000 cache
同様に、IPv6を使用している場合は、以下を実行する。
再度、wg0インターフェースと、WireGuardピアに割り当てたIPv6アドレスfd24:609a:6c18::2に注意すること。
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
また、Webブラウザから、https://ipleak.net/ や https://ipv6-test.com/ にアクセスして、相手がVPN経由でトラフィックをルーティングしていることを確認することもできる。
WireGuardピアのVPNを切断する準備ができた後は、wg-quick
コマンドを実行する。
VPNトンネルがシャットダウンされたことを示す以下のような出力が表示される。
sudo wg-quick down wg0 # 出力例 [#] ip link delete dev wg0 [#] resolvconf -d tun.wg0 -f
例えば、WireGuardピアのAllowedIPs
を0.0.0.0/0
と::/0
に設定した場合、あるいは、VPN用に選んだ範囲以外を使用した場合は、以下に示すような出力のようになる。
[#] 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に再接続するには、WireGuardピア上で以下に示すコマンドを再度実行する。
sudo wg-quick up wg0
WireGuardサーバからピアの設定を完全に削除する場合は、削除するピアの公開鍵を正しく置き換えて、以下に示すコマンドを実行する。
sudo wg set wg0 peer <ピアの公開鍵の内容> remove # 実行例 sudo wg set wg0 peer PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg= remove
※注意
通常、ピアの設定を削除する必要がある場合は、そのピアがもう存在しないか、暗号化キーが漏洩または変更された場合のみである。
そうでない場合は、設定を残しておいたほうがよい。
そのように運用することにより、ピアはその都度キーやallowed-ips
を追加しなくても、VPNに再接続できるようになる。