Ubuntu 16.04でWireGuardを使用してポイントツーポイントVPNを作成する方法

前書き

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

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

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

前提条件

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

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

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

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

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

sudo add-apt-repository ppa:wireguard/wireguard

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

sudo apt-get update
sudo apt-get install wireguard-dkms wireguard-tools

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

秘密鍵の作成

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

秘密鍵を生成してWireGuard構成ファイルに直接書き込むには、次のon each serverを入力します。

(umask 077 && printf "[Interface]\nPrivateKey = " | sudo tee /etc/wireguard/wg0.conf > /dev/null)
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番目のサーバーと交換する必要があります。

初期構成ファイルの作成

次に、エディターで構成ファイルを開き、その他の詳細を設定します。

sudo nano /etc/wireguard/wg0.conf

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

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

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

/etc/wireguard/wg0.conf

[Interface]
PrivateKey = generated_private_key
ListenPort = 5555
SaveConfig = true

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

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

[.note]#Note: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 notationを使用してアドレスとサブネットを指定する必要があります。

first serverに10.0.0.1のアドレスを指定します。これは、CIDR表記では10.0.0.1/24として表されます。

/etc/wireguard/wg0.conf on first server

[Interface]
PrivateKey = generated_private_key
ListenPort = 5555
SaveConfig = true
Address = 10.0.0.1/24

second serverで、アドレスを10.0.0.2として定義します。これにより、10.0.0.2 / 24のCIDR表現が得られます。

/etc/wireguard/wg0.conf on second server

[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と入力することで見つけることができます。 また、トンネル内で有効なIPアドレスにAllowedIPsを設定します。 最初のサーバーが使用している特定のIPアドレスがわかっているので、それを直接入力して、/32で終わり、単一のIP値を含む範囲を示すことができます。

/etc/wireguard/wg0.conf on second server

[Interface]
. . .

[Peer]
PublicKey = public_key_of_first_server
AllowedIPs = 10.0.0.1/32

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

/etc/wireguard/wg0.conf on second server

[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ポートを開きます。

sudo ufw allow 5555

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

sudo systemctl start wg-quick@wg0

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

ip addr show wg0
Output on first server6: wg0:  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のアクティブな構成に関する情報を表示できます。

sudo wg

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

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

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

Output on second serverinterface: 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番目のサーバーのピアリング情報を最初のサーバーに追加する必要があります。

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

first server(ピア情報を表示しないもの)に、次の形式でピアリング情報を手動で入力します。 2番目のサーバーの公開鍵は、2番目のサーバーからのsudo wgの出力にあります。

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と入力すると、情報がアクティブな構成になっていることを確認できます。

sudo wg
Output on first serverinterface: 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を試してください。

ping -c 3 10.0.0.2
Output on first serverPING 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ファイルに保存して戻すことができます。

sudo systemctl restart wg-quick@wg0

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

sudo systemctl enable wg-quick@wg0

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

結論

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

Related