Ubuntu 16.04でWireGuardを使用してポイント・ツー・ポイントVPNを作成する方法
Ubuntu 16.04を使用していませんか?別のバージョンまたはディストリビューションを選択してください。
紹介
WireGuardは現代的で高性能なVPNであり、使いやすさと強力なセキュリティを提供することを目的としています。WireGuardは、公開鍵認証で暗号化されたネットワークインターフェースを介して当事者間の安全な接続を提供することにのみ焦点を当てています。これは、多くのVPNとは異なり、トポロジーが強制されないため、周囲のネットワーク設定を操作することで異なる構成を実現できることを意味します。このモデルは、個々のニーズに応じて適用できる大きな力と柔軟性を提供します。
WireGuardが使用できる最も単純なトポロジーの1つは、ポイントツーポイント接続です。これにより、中央サーバーの仲介なしに2台のマシン間に安全なリンクが確立されます。このタイプの接続は、メッシュVPNトポロジーを確立するために2台以上のメンバー間でも使用でき、各サーバーは直接同僚と通信できます。各ホストが平等な立場にあるため、これらの2つのトポロジーは、トラフィックをルーティングするためのゲートウェイとして単一のサーバーを使用するのではなく、サーバー間で安全なメッセージングを確立するのに最適です。
このガイドでは、2台のUbuntu 16.04サーバーを使用して、WireGuardによるポイントツーポイントVPN接続の確立方法を示します。まず、ソフトウェアをインストールし、次に各ホストの暗号鍵ペアを生成します。次に、ピアの接続情報を定義する短い構成ファイルを作成します。インターフェースを起動すると、WireGuardインターフェースを介してサーバー間で安全なメッセージを送信できるようになります。
前提条件
このガイドに従うには、2つのUbuntu 16.04サーバーにアクセスする必要があります。各サーバーには、管理操作を行うためのsudo権限を持つ非ルートユーザーを作成する必要があります。また、各システムに基本的なファイアウォールを設定する必要があります。これらの要件は、以下のチュートリアルを完了することで満たすことができます:
- Ubuntu 16.04による初期サーバー設定
続行する準備ができたら、各サーバーに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の値はサブシェルで設定され、通常の環境に影響を与えずに制限付きの権限でファイルを作成します。
二番目のコマンドは、WireGuard の wg コマンドを使用してプライベートキーを生成し、それを直接私たちの制限された設定ファイルに書き込みます。また、キーを wg pubkey コマンドにパイプして関連するパブリックキーを導出し、それを参照のために /etc/wireguard/publickey というファイルに書き込みます。このファイルのキーは、設定を定義する際に二台目のサーバーと交換する必要があります。
初期設定ファイルの作成
次に、いくつかの詳細を設定するためにエディタで設定ファイルを開きます:
- sudo nano /etc/wireguard/wg0.conf
内部には、[Interface]というセクションに定義された生成されたプライベートキーが表示されるはずです。このセクションには、接続のローカル側の設定が含まれています。
インターフェースセクションの設定
このノードが使用するVPNのIPアドレスと、ピアからの接続を待機するポートを定義する必要があります。最初に、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と定義します。これにより、CIDR表現は10.0.0.2/24になります:
[Interface]
PrivateKey = generated_private_key
ListenPort = 5555
SaveConfig = true
Address = 10.0.0.2/24
これは[Interface]セクションの終わりです。
サーバーのピアに関する情報は、設定ファイル内で設定するか、後で手動で wg コマンドを使用して入力することができます。上記のように、wg-quick サービスの SaveConfig オプションが true に設定されている場合、どちらの方法でもピア情報が最終的にファイルに書き込まれることになります。
ピアのアイデンティティを定義する2つの方法の両方を示すために、第二のサーバーの構成ファイルに[Peer]セクションを作成しますが、第一のサーバーには作成しません。10.0.0.1アドレスを定義している最初のサーバーの構成ファイルは、今すぐ保存して閉じることができます。
ピアセクションの定義
まだ開いている設定ファイルで、[Interface] セクションの下に [Peer] というセクションを作成します。
まず、PublicKeyを最初のサーバーの公開鍵の値に設定します。この値は、対向サーバーでcat /etc/wireguard/publickeyと入力することで見つけることができます。また、AllowedIPsをトンネル内で有効なIPアドレスに設定します。最初のサーバーが使用している特定のIPアドレスが分かっているので、それを直接入力し、単一のIP値を含む範囲を示すために/32で終わります:
[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
では、定義した
- 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
私たちは
- 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
私たちのポイントツーポイント接続は現在利用可能なはずです。最初のサーバーから第二のサーバーの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をインストールし、各ホストをピアへのポイントツーポイント接続のサーバーとして構成しました。このトポロジーは、各側が平等な参加者であるか、ホストが他のサーバーへのアドホック接続を確立する必要がある場合に、サーバー間の通信を確立するのに理想的です。
