設定 - VPNサーバ

提供:MochiuWiki - SUSE, Electronic Circuit, PCB
ナビゲーションに移動 検索に移動

概要



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


構築 ステップ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の設定ファイルに追加する必要があるため、覚えておく必要がある。

次に、秘密鍵から派生する対応する公開鍵を作成する。

  1. 最初のコマンドは、秘密鍵ファイルを読み込み、標準出力ストリームに出力する。
  2. 2番目のコマンドは、最初のコマンドの出力を標準入力として受け取り、それを処理して公開鍵を生成する。
  3. 最後のコマンドは、公開鍵生成コマンドの出力を受け取り、/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インターフェイスがシャットダウンされた時に、変更内容が設定ファイルに保存されるようにする設定である。
WireGuardを別のポートで使用したい場合は、ListenPortキー値を変更することもできる。

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_forwardnet.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コマンドだけを含むように設定を編集する。

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経由で使用する他のプロトコルがある場合は、それらのルールも追加する必要がある。