Ubuntu16.04でWireGuardを使用してポイントツーポイントVPNを作成する方法
序章
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をシステムに追加して、プロジェクトのパッケージへのアクセスを構成します。
- 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構成ファイルに直接書き込むには、各サーバーに次のと入力します。
- (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]
というセクションで定義された生成された秘密鍵が表示されます。 このセクションには、接続のローカル側の構成が含まれています。
インターフェイスセクションの構成
このノードが使用するVPNIPアドレスと、ピアからの接続をリッスンするポートを定義する必要があります。 ファイルが次のようになるように、ListenPort
行とSaveConfig
行を追加することから始めます。
[Interface]
PrivateKey = generated_private_key
ListenPort = 5555
SaveConfig = true
これにより、WireGuardがリッスンするポートが設定されます。 これは任意の無料のバインド可能なポートにすることができますが、このガイドでは、両方のサーバーのポート5555にVPNを設定します。 各ホストのListenPort
を、選択したポートに設定します。
また、SaveConfig
をtrue
に設定します。 これにより、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として表されます。
[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表現が得られます。
[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]
というセクションを作成します。
PublicKey
をfirstサーバーの公開鍵の値に設定することから始めます。 この値は、反対側のサーバーでcat /etc/wireguard/publickey
と入力すると見つかります。 また、AllowedIPs
をトンネル内で有効なIPアドレスに設定します。 最初のサーバーが使用している特定のIPアドレスがわかっているので、それを直接入力して、/32
で終わり、単一のIP値を含む範囲を示すことができます。
[Interface]
. . .
[Peer]
PublicKey = public_key_of_first_server
AllowedIPs = 10.0.0.1/32
最後に、Endpoint
を最初のサーバーのパブリックIPアドレスとWireGuardリスニングポート(この例ではポート5555を使用)に設定できます。 WireGuardは、別のアドレスでこのピアから正当なトラフィックを受信した場合にこの値を更新し、VPNがローミング条件に適応できるようにします。 このサーバーが連絡を開始できるように、初期値を設定します。
[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: <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のアクティブな構成に関する情報を表示できます。
- 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番目のサーバーのピアリング情報を最初のサーバーに追加する必要があります。
コマンドラインに欠落しているピア情報を追加する
ファーストサーバー(ピア情報を表示しないサーバー)で、以下の形式でピア情報を手動で入力します。 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をインストールし、各ホストをピアへのポイントツーポイント接続を備えたサーバーとして構成しました。 このトポロジは、各側が同等の参加者であるピア、またはホストが他のサーバーへのアドホック接続を確立する必要があるピアとのサーバー間通信を確立するのに理想的です。