ウェブサイト検索

Wireguardを使用してUbuntu 20.04でVPNを作成する方法


Wireguardは最新の非常に簡単に設定できるVPNで、複数のオペレーティングシステムで利用できます。このアプリケーションは、Ubuntu 20.04の公式リポジトリにあるため、インストールも非常に簡単です。OpenVPNのようにSSL証明書を使用するソフトウェアとは異なり、Wireguardはキーのペアを使用しています。このチュートリアルでは、Ubuntuの最新安定版でVPNサーバーとクライアントピアを数ステップで設定する方法を見ていきます。

このチュートリアルでは、あなたは学びます:

  • Ubuntu 20.04 Focal FossaにWireguardをインストールする方法
  • 公開鍵と秘密鍵のペアを作成する方法
  • サーバーとクライアントピアを構成する方法
  • すべての着信トラフィックをVPNにリダイレクトする方法

Ubuntu 20.04でのWireguard VPN

ソフトウェアの要件と使用される規約

インストール

WireguardはUbuntu 20.04の「universe」リポジトリで公式に利用可能であるため、aptを介してインストールできます。執筆時点で利用可能なバージョンは1.0.20200319-1ubuntu1です。

sudo apt install wireguard

システムは、プログラムとその依存関係をインストールしたいか確認するように求め、数秒で操作を完了します。

キーを生成しています

私たちは、VPNで使用したい各マシンのために公開鍵と秘密鍵を生成する必要があります。秘密鍵はマシン上で秘密にしておくべきで、公開鍵は他のピアからマシンにアクセスするために使用されます。

キーを生成するには、wgユーティリティを使用できます。Wireguardの設定ファイル内では、マシンの秘密鍵を参照する必要がありますが、公開鍵は他のピアで使用されます。鍵を直接参照するため、理論的にはファイルに保存する必要はありませんが、利便性のためにそれでも保存します。

サーバーのプライベートキーを生成するには、wgのgenkeyサブコマンドを使用する必要があります。このコマンドは作成されたキーをstdoutに出力します。キーをファイルに書き込むには、シェルのリダイレクションの力を利用して次のようにします。

wg genkey > server_private_key

このコマンドは鍵を生成してserver_private_keyファイルに保存しますが、以下の警告が表示されます:

Warning: writing to world accessible file.
Consider setting the umask to 077 and trying again.

これは、デフォルトのユーザーumask(002)では、ファイルがモード664で作成されるため、世界中から読み取り可能であるため、推奨されません。この問題を解決するために、ファイルを作成する前に現在のシェルセッションで使用するumaskを変更することができます:

umask 077

または、作成後にファイルの権限を600に変更してください。ここでは後者の解決策を選択します。

プライベートキーが準備でき次第、それに基づいてパブリックキーを生成できます。この作業を達成するために、wgのpubkeyサブコマンドを使用します。前と同様に、シェルのリダイレクションを使用します。最初にserver_private_keyファイルの内容をコマンドのstdinに渡し、次に生成されたキーをserver_public_keyファイルにリダイレクトします:

wg pubkey < server_private_key > server_public_key

入力を少なくするために、一つのコマンドで両方のキーを生成できます。これはシェルの|(パイプ)演算子とteeコマンドを使用することを含みます:

wg genkey | tee server_private_key | wg pubkey > server_public_key

パイプ演算子(|)の左側のコマンドの出力は、その右側のプログラムの標準入力に渡されます。tee コマンドは、コマンドの出力をファイルと標準出力の両方にリダイレクトすることを可能にします(シェルのリダイレクションについてはここで詳しく説明しています)。

鍵が準備でき次第、サーバー設定ファイルを作成できます。

サーバー構成ファイル

私たちの Wireguard インストールを設定するために、次の内容を含む wg0.conf という名前の構成ファイルを作成することができます:

[Interface]
PrivateKey = <private key of the server (the content of the server_private_key file)>
Address = 10.0.0.1/24
ListenPort = 51820

ファイルの名前は任意ですが、この場合は私たちのインターフェースで使用する名前、すなわちwg0に基づくべきです。この名前は、下記で見るようにサービスを開始するときに参照されます。

私たちの例では、[interface] セクションの設定ファイルには次のフィールドが含まれています:

  • PrivateKey
  • 住所
  • ListenPort

PrivateKeyフィールドの値は、私たちが前に生成したサーバーの秘密鍵に他なりません。

アドレスフィールドには、VPN内のインターフェースに割り当てるアドレスとサブネットマスクをCIDR表記で指定しました。この場合、10.0.0.1/24を使用したので、VPN内の私たちのWireguard「サーバー」アドレスは10.0.0.1になります。これは、10.0.0.1から10.0.0.254までの利用可能なアドレス範囲に含まれています。

最後に、ListenPortフィールドで、Wireguardが受信トラフィックのためにリッスンするポートを指定しました。このトラフィックを許可するルールもファイアウォールに追加する必要があります。これについては次のセクションで行います。

私たちは今、ファイルの権限を変更し、/etc/wireguard ディレクトリに移動することができます:

chmod 600 server_public_key server_private_key wg0.conf
sudo mv server_private_key server_public_key wg0.conf /etc/wireguard

私たちは今、ユニット名の@の後にWireguardインターフェースの名前を指定してwg-quickサービスを開始できます。この表記法は何ですか?これはsystemdの機能です:これを使うことで、「テンプレート」としてのユニットファイルを基にして、@シンボルの後にテンプレートに置き換えられる値を渡すことで、複数のユニットファイルを生成できます。これがwg-quick@.serviceユニットの内容です:

[Unit]
Description=WireGuard via wg-quick(8) for %I
After=network-online.target nss-lookup.target
Wants=network-online.target nss-lookup.target
Documentation=man:wg-quick(8)
Documentation=man:wg(8)
Documentation=https://www.wireguard.com/
Documentation=https://www.wireguard.com/quickstart/
Documentation=https://git.zx2c4.com/wireguard-tools/about/src/man/wg-quick.8
Documentation=https://git.zx2c4.com/wireguard-tools/about/src/man/wg.8

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/wg-quick up %i
ExecStop=/usr/bin/wg-quick down %i
Environment=WG_ENDPOINT_RESOLUTION_RETRIES=infinity

[Install]
WantedBy=multi-user.target

開始または停止する際にユニット名の@の後に指定する値は、ExecStartとExecStop行の%iを置き換えます。この場合、wg0を使用します:

sudo systemctl enable --now wg-quick@wg0

上記のコマンドでサービスを開始し、ブート時に自動的に起動するように設定しました。設定が適用されたことを確認するために、wg コマンドを実行できます。出力には wg0 インターフェースに関する情報が表示される必要があります。

sudo wg
interface: wg0
  public key: nNx3Zpcv9D2dtgHDsoYGBNr64zG5jTJ4Z4T2sE759V4=
  private key: (hidden)
  listening port: 51820

さあ、ファイアウォールとパケット転送の設定を進めましょう。

ファイアウォールとネットワークの設定

このチュートリアルでは、ufwの使用を前提とします。前述のように、設定ファイル51820で指定したポートを通過する着信トラフィックを許可するために、ルールを追加する必要があります。それを行うために、非常にシンプルなコマンドを実行します:

sudo ufw allow 51820/udp

私たちは、システムでパケット転送を許可する必要もあります。この作業を実行するためには、/etc/sysctl.confファイルの28行目のコメントを削除し、次のように見えるようにします:

Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1

システムを再起動せずに変更を有効にするために、次のコマンドを実行する必要があります:

sudo sysctl -p

次のステップでは、クライアントを設定します。

クライアントキーの生成

クライアントとして使用するシステムに進みましょう。それにWireguardをインストールする必要があります。インストールが完了したら、サーバーで行ったようにキー ペアを生成できます。

wg genkey | tee client_private_key | wg pubkey > client_public_key

サーバーサイドと同様に、wg0.confという設定ファイルを作成します。今回はこの内容で:

[Interface]
PrivateKey = <client_private_key>
Address = 10.0.0.2/24

[Peer]
PublicKey = <server_public_key>
EndPoint  = <server_public_ip>:51820
AllowedIPs = 0.0.0.0/0

私たちはすでにInterfaceセクションに含まれるフィールドの意味を、サーバー設定を生成したときに見ました。ここでは、私たちのクライアントに合わせて値を調整しました(VPNでは10.0.0.2のアドレスになります)。

この構成では、新しいセクション[Peer]を使用しました。この中で、ピアに関連する情報を指定できます。この場合、私たちが「サーバー」として使用するものです。使用したフィールドは次のとおりです:

  • PublicKey
  • EndPoint
  • 許可されたIP

PublicKeyフィールドでは、ピアのパブリックキーを指定しますので、この場合、サーバーで生成したパブリックキーを指します。

エンドポイントは、ピアのパブリックIPアドレスまたはホスト名の後にコロンと、ピアがリッスンしているポート番号(この場合は51820)を続けたものです。

最終的に、AllowedIPsフィールドに渡された値は、コンマ区切りのIPアドレスとCIDR表記のサブネットマスクのリストです。指定されたアドレスから来るピアに向けられたトラフィックのみが許可されます。この場合、0.0.0.0/0を値として使用しました:これは「すべてをキャッチする」値として機能するため、すべてのトラフィックがVPNピア(サーバー)に送信されます。

サーバーサイドで行ったように、適切な権限を設定し、キーと設定ファイルを/etc/wireguardディレクトリに移動します:

chmod 600 client_public_key client_private_key wg0.conf
sudo mv client_public_key client_private_key wg0.conf /etc/wireguard

設定ファイルが整ったので、サービスを開始できます:

sudo systemctl enable --now wg-quick@wg0

最後に、私たちのクライアントに関連する[Peer]セクションを、以前に作成したサーバーの設定ファイルに追加する必要があります。以下の内容を追加します:

[Peer]
PublicKey = <public key of the client>
AllowedIPs = 10.0.0.2/32

この時点でサービスを再起動します:

sudo systemctl restart wg-quick@wg0

関連するピアに関する情報は、現在コマンドの出力に報告されるべきです。

sudo wg
interface: wg0
  public key: nNx3Zpcv9D2dtgHDsoYGBNr64zG5jTJ4Z4T2sE759V4=
  private key: (hidden)
  listening port: 51820

peer: t5pKKg5/9fJKiU0lrNTahv6gvABcmCjQq5gF3BxwiDQ=
  allowed ips: 10.0.0.2/32

この時点で、「クライアント」システムから、10.0.0.1 アドレスのサーバーに ping を送信できるはずです:

ping -c 3 10.0.0.1
PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data.
64 bytes from 10.0.0.1: icmp_seq=1 ttl=64 time=2.82 ms
64 bytes from 10.0.0.1: icmp_seq=2 ttl=64 time=38.0 ms
64 bytes from 10.0.0.1: icmp_seq=3 ttl=64 time=3.02 ms

--- 10.0.0.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 2.819/14.613/37.999/16.536 ms

結論

このチュートリアルでは、最新の安定版Ubuntu 20.04 Focal FossaでWireguardを使用してVPNを作成する方法を見ました。このソフトウェアは、他のソリューション、例えばOpenVpnと比較しても、インストールおよび設定が非常に簡単です。

私たちは、設定に使用される公開鍵と秘密鍵を生成する方法、そしてすべてのトラフィックがVPNにリダイレクトされるようにサーバーとクライアントの両方を構成する方法を見ました。指示に従えば、動作するセットアップが得られます。詳しい情報については、プロジェクトページをご覧ください。

関連記事: