序章

WireGuard は、堅牢なセキュリティを提供しながら使いやすいように設計された、最新の高性能VPNです。 WireGuardは、公開鍵認証で暗号化されたネットワークインターフェイスを介して当事者間の安全な接続を提供することにのみ焦点を当てています。 これは、ほとんどのVPNとは異なり、トポロジが適用されないため、周囲のネットワーク構成を操作することでさまざまな構成を実現できることを意味します。 このモデルは、個々のニーズに応じて適用できる優れたパワーと柔軟性を提供します。

WireGuardが使用できる最も単純なトポロジの1つは、ポイントツーポイント接続です。 これにより、中央サーバーによる仲介なしに2台のマシン間に安全なリンクが確立されます。 このタイプの接続は、3つ以上のメンバー間で使用して、メッシュVPNトポロジを確立することもできます。このトポロジでは、個々のサーバーがピアと直接通信できます。 各ホストは対等な立場にあるため、これら2つのトポロジは、トラフィックをルーティングするためのゲートウェイとして単一のサーバーを使用するのではなく、サーバー間で安全なメッセージングを確立するのに最適です。

このガイドでは、2台のUbuntu16.04サーバーを使用してWireGuardとのポイントツーポイントVPN接続を確立する方法を示します。 まず、ソフトウェアをインストールしてから、ホストごとに暗号化キーのペアを生成します。 その後、ピアの接続情報を定義するための短い構成ファイルを作成します。 インターフェイスを起動すると、WireGuardインターフェイスを介してサーバー間で安全なメッセージを送信できるようになります。

前提条件

このガイドに従うには、 two Ubuntu16.04サーバーにアクセスする必要があります。 各サーバーで、管理アクションを実行するためにsudo権限を持つ非rootユーザーを作成する必要があります。 また、各システムに基本的なファイアウォールを構成する必要があります。 次のチュートリアルを完了することで、これらの要件を満たすことができます。

続行する準備ができたら、sudoユーザーで各サーバーにログインします。

ソフトウェアのインストール

WireGuardプロジェクトは、Ubuntuシステム用の最新パッケージを備えたPPAを提供します。 続行する前に、両方のサーバーにWireGuardをインストールする必要があります。 各サーバーで、次のアクションを実行します。

まず、WireGuard PPAをシステムに追加して、プロジェクトのパッケージへのアクセスを構成します。

  1. sudo add-apt-repository ppa:wireguard/wireguard

新しいパッケージソースをapt構成に追加するように求められたら、ENTERを押します。 PPAが追加されたら、ローカルパッケージインデックスを更新して、新しく利用可能なパッケージに関する情報を取得し、WireGuardカーネルモジュールとユーザーランドコンポーネントをインストールします。

  1. sudo apt-get update
  2. sudo apt-get install wireguard-dkms wireguard-tools

次に、各サーバーでWireGuardの構成を開始できます。

秘密鍵の作成

WireGuard VPNの各参加者は、公開鍵暗号を使用してピアに対して認証を行います。 新しいピア間の接続は、公開鍵を交換し、最小限の構成を実行することで確立できます。

秘密鍵を生成してWireGuard構成ファイルに直接書き込むには、各サーバーに次のと入力します。

  1. (umask 077 && printf "[Interface]\nPrivateKey = " | sudo tee /etc/wireguard/wg0.conf > /dev/null)
  2. wg genkey | sudo tee -a /etc/wireguard/wg0.conf | wg pubkey | sudo tee /etc/wireguard/publickey

最初のコマンドは、構成ファイルの初期内容を/etc/wireguard/wg0.confに書き込みます。 サブシェルのumask値。これにより、通常の環境に影響を与えることなく、制限されたアクセス許可でファイルを作成できます。

2番目のコマンドは、WireGuardのwgコマンドを使用して秘密鍵を生成し、制限された構成ファイルに直接書き込みます。 また、キーをwg pubkeyコマンドにパイプで戻し、関連する公開キーを取得します。この公開キーは、簡単に参照できるように/etc/wireguard/publickeyというファイルに書き込みます。 構成を定義するときに、このファイルのキーを2番目のサーバーと交換する必要があります。

初期構成ファイルの作成

次に、エディターで構成ファイルを開いて、他のいくつかの詳細を設定します。

  1. sudo nano /etc/wireguard/wg0.conf

内部には、[Interface]というセクションで定義された生成された秘密鍵が表示されます。 このセクションには、接続のローカル側の構成が含まれています。

インターフェイスセクションの構成

このノードが使用するVPNIPアドレスと、ピアからの接続をリッスンするポートを定義する必要があります。 まず、ListenPortSaveConfigの行を追加して、ファイルが次のようになるようにします。

/etc/wireguard/wg0.conf
[Interface]
PrivateKey = generated_private_key
ListenPort = 5555
SaveConfig = true

これにより、WireGuardがリッスンするポートが設定されます。 これは任意の無料のバインド可能なポートにすることができますが、このガイドでは、両方のサーバーのポート5555にVPNを設定します。 各ホストのListenPortを、選択したポートに設定します。

また、SaveConfigtrueに設定します。 これにより、wg-quickサービスは、シャットダウン時にアクティブな構成をこのファイルに自動的に保存するように指示されます。

注: SaveConfigが有効になっている場合、wg-quickサービスは、サービスがシャットダウンするたびに/etc/wireguard/wg0.confファイルの内容を上書きします。 WireGuard構成を変更する必要がある場合は、/etc/wireguard/wg0.confファイルを編集する前にwg-quickサービスをシャットダウンするか、wgコマンドを使用して実行中のサービスに変更を加えます(これらサービスのシャットダウン時にファイルに保存されます)。 wg-quickがアクティブな構成を保存すると、サービスの実行中に構成ファイルに加えられた変更はすべて上書きされます。

次に、一意のAddress定義を各サーバーに追加して、wg-quickサービスがWireGuardインターフェイスを起動したときにネットワーク情報を設定できるようにします。 VPNのアドレス空間として10.0.0.0/24サブネットを使用します。 コンピューターごとに、この範囲(10.0.0.1〜10.0.0.254)内の一意のアドレスを選択し、CIDR表記を使用してアドレスとサブネットを指定する必要があります。

最初のサーバーに10.0.0.1のアドレスを指定します。これは、CIDR表記で10.0.0.1/24として表されます。

最初のサーバーの/etc/wireguard/wg0.conf
[Interface]
PrivateKey = generated_private_key
ListenPort = 5555
SaveConfig = true
Address = 10.0.0.1/24

2番目のサーバーでは、アドレスを10.0.0.2として定義します。これにより、10.0.0.2/24のCIDR表現が得られます。

2番目のサーバーの/etc/wireguard/wg0.conf
[Interface]
PrivateKey = generated_private_key
ListenPort = 5555
SaveConfig = true
Address = 10.0.0.2/24

これで[Interface]セクションは終わりです。

サーバーのピアに関する情報は、構成ファイル内に入力するか、後でwgコマンドを使用して手動で入力できます。 上記のように、SaveConfigオプションがtrueに設定されたwg-quickサービスは、ピア情報が最終的にどちらの方法でもファイルに書き込まれることを意味します。

ピアIDを定義する両方の方法を示すために、2番目のサーバーの構成ファイルに[Peer]セクションを作成しますが、最初のサーバーには作成しません。 これで、 first サーバー(10.0.0.1アドレスを定義するサーバー)の構成ファイルを保存して閉じることができます。

ピアセクションの定義

まだ開いている構成ファイルで、[Interface]セクションのエントリの下に[Peer]というセクションを作成します。

PublicKeyfirstサーバーの公開鍵の値に設定することから始めます。 この値は、反対側のサーバーでcat /etc/wireguard/publickeyと入力すると見つかります。 また、AllowedIPsをトンネル内で有効なIPアドレスに設定します。 最初のサーバーが使用している特定のIPアドレスがわかっているので、それを直接入力して、/32で終わり、単一のIP値を含む範囲を示すことができます。

2番目のサーバーの/etc/wireguard/wg0.conf
[Interface]
. . .

[Peer]
PublicKey = public_key_of_first_server
AllowedIPs = 10.0.0.1/32

最後に、Endpointを最初のサーバーのパブリックIPアドレスとWireGuardリスニングポート(この例ではポート5555を使用)に設定できます。 WireGuardは、別のアドレスでこのピアから正当なトラフィックを受信した場合にこの値を更新し、VPNがローミング条件に適応できるようにします。 このサーバーが連絡を開始できるように、初期値を設定します。

2番目のサーバーの/etc/wireguard/wg0.conf
[Interface]
. . .

[Peer]
PublicKey = public_key_of_first_server
AllowedIPs = 10.0.0.1/32
Endpoint = public_IP_of_first_server:5555

終了したら、ファイルを保存して閉じ、コマンドプロンプトに戻ります。

VPNの開始とピアへの接続

これで、各サーバーでWireGuardを起動し、2つのピア間の接続を構成する準備が整いました。

ファイアウォールを開いてVPNを開始する

まず、各サーバーのファイアウォールでWireGuardポートを開きます。

  1. sudo ufw allow 5555

次に、定義したwg0インターフェイスファイルを使用して、wg-quickサービスを開始します。

  1. sudo systemctl start wg-quick@wg0

これにより、マシンのwg0ネットワークインターフェイスが開始されます。 これは、次のように入力することで確認できます。

  1. ip addr show wg0
Output on first server
6: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1 link/none inet 10.0.0.1/24 scope global wg0 valid_lft forever preferred_lft forever

wgツールを使用して、VPNのアクティブな構成に関する情報を表示できます。

  1. sudo wg

ピア定義のないサーバーでは、表示は次のようになります。

Output on first server
interface: wg0 public key: public_key_of_this_server private key: (hidden) listening port: 5555

ピア構成がすでに定義されているサーバーでは、出力には次の情報も含まれます。

Output on second server
interface: wg0 public key: public_key_of_this_server private key: (hidden) listening port: 5555 peer: public_key_of_first_server endpoint: public_IP_of_first_server:5555 allowed ips: 10.0.0.1/32

接続を完了するには、wgコマンドを使用して、2番目のサーバーのピアリング情報を最初のサーバーに追加する必要があります。

コマンドラインに欠落しているピア情報を追加する

ファーストサーバー(ピア情報を表示しないサーバー)で、以下の形式でピア情報を手動で入力します。 2番目のサーバーの公開鍵は、2番目のサーバーからのsudo wgの出力にあります。

  1. sudo wg set wg0 peer public_key_of_second_server endpoint public_IP_of_second_server:5555 allowed-ips 10.0.0.2/32

最初のサーバーでsudo wgともう一度入力すると、情報がアクティブな構成になっていることを確認できます。

  1. sudo wg
Output on first server
interface: wg0 public key: public_key_of_this_server private key: (hidden) listening port: 5555 peer: public_key_of_second_server endpoint: public_IP_of_second_server:5555 allowed ips: 10.0.0.2/32

これで、ポイントツーポイント接続が利用できるようになります。 最初のサーバーから2番目のサーバーのVPNアドレスにpingを実行してみてください。

  1. ping -c 3 10.0.0.2
Output on first server
PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data. 64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=0.635 ms 64 bytes from 10.0.0.2: icmp_seq=2 ttl=64 time=0.615 ms 64 bytes from 10.0.0.2: icmp_seq=3 ttl=64 time=0.841 ms --- 10.0.0.2 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 1998ms rtt min/avg/max/mdev = 0.615/0.697/0.841/0.102 ms

すべてが正常に機能している場合は、サービスを再起動することで、最初のサーバーの構成を/etc/wireguard/wg0.confファイルに保存できます。

  1. sudo systemctl restart wg-quick@wg0

起動時にトンネルを開始する場合は、次のように入力して、各マシンでサービスを有効にできます。

  1. sudo systemctl enable wg-quick@wg0

これで、マシンが起動するたびにVPNトンネルが自動的に開始されます。

結論

WireGuardは、その柔軟性、軽量な実装、および最新の暗号化により、多くのユースケースに最適なオプションです。 このガイドでは、2台のUbuntu 16.04サーバーにWireGuardをインストールし、各ホストをピアへのポイントツーポイント接続を備えたサーバーとして構成しました。 このトポロジは、各サイドが同等の参加者であるピア、またはホストが他のサーバーへのアドホック接続を確立する必要があるピアとのサーバー間通信を確立するのに理想的です。