LinuxサーバーにWireGuard VPNを構築し、クライアントを接続する構成を示す代表画像

概要

WireGuardは、簡潔な設定と軽量なパフォーマンスでpeer-to-peer VPNを構成できるツールです。

この記事では、LinuxサーバーにWireGuardをインストールし、サーバーキー・ファイアウォール・サービスを整えたうえで、Macクライアントから接続するまでの一連の流れをまとめます。

サーバーキーの生成、wg0の設定、UDP 51820ポートの開放、クライアントPeerの登録、接続確認までを順番に扱うため、同じ手順で設定できます。

サーバーのインストール

システムサービスとして動作するため、rootで進めてください。

基本インストール

1apt install wireguard

インストール確認

1wg --version

サーバーキーの生成

1mkdir -p /etc/wireguard
2wg genkey | tee /etc/wireguard/server.key | wg pubkey | tee /etc/wireguard/server.pub
3
4# 権限設定
5chmod 600 /etc/wireguard/server.key

環境設定

設定ファイルをあらかじめ作成します。

1touch /etc/wireguard/wg0.conf
2chmod 600 /etc/wireguard/wg0.conf

設定ファイルにインターフェースを設定

  • サーバーキーを登録
  • SaveConfigが有効になっている場合、このファイルを編集した後にサーバーを停止すると、サーバーの状態で上書きされてしまいます
  • SaveConfigモードで使用する場合は、wg setなどで制御する必要があります
1# /etc/wireguard/wg0.conf
2[Interface]
3Address = 10.200.0.1/24
4ListenPort = 51820
5PrivateKey = {server key contents}
6SaveConfig = false

Inbound設定(ファイアウォール設定)

Peer to Peerではありますが、最初のハンドシェイクのためにUDPサーバーポートを開放しておく必要があります。

さらにiptablesを使用している場合は、ポートも開放する必要があります。

1iptables -I INPUT 1 -p udp --dport 51820 -j ACCEPT
2
3# ubuntu 24
4# netfilter-persistent save
5
6# Result
7# run-parts: executing /usr/share/netfilter-persistent/plugins.d/15-ip4tables save
8# run-parts: executing /usr/share/netfilter-persistent/plugins.d/25-ip6tables save

サーバーの実行

サービスの登録と起動

1systemctl enable wg-quick@wg0
2systemctl start wg-quick@wg0

wgの確認

1wg
2
3# Result
4# interface: wg0
5#  public key: Y9oH7jnQVVILuRnhekWDRh9s7gCOyOf2HerAfS5Iymw=
6#  private key: (hidden)

インターフェースの確認

1ip addr show wg0
2
3# Result
4# 3: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 8920 qdisc noqueue state UNKNOWN group default qlen 1000
5#     link/none 
6#     inet 10.200.0.1/24 scope global wg0
7#       valid_lft forever preferred_lft forever

クライアントのインストール

ユーザークライアントキーの生成(ローカルクライアント作業)

  • ユーザーの秘密鍵はサーバー上で生成しても構いませんが、生成後にサーバーに残しておいてはいけません
  • サーバーは公開鍵のテキストさえ分かれば十分です
  • 生成した秘密鍵は、クライアントに移動した後に削除してください

ローカルのMacにインストールする場合、wgがなければインストールが必要です。

1brew install wireguard-tools

キーの生成

1# ディレクトリを作成して移動
2mkdir -p ~/.wireguard
3cd ~/.wireguard
4
5# キー生成: wg genkey | tee {KeyName}.key | wg pubkey > {KeyName}.pub
6wg genkey | tee user.key | wg pubkey > user.pub

重要!サーバーへのユーザーキー登録

wg0.confファイルにpeer情報を登録します。

  • Peerは複数設定できます
  • AllowedIPs宛てに送られたリクエストは、該当のPeerに転送されます
1# /etc/wireguard/wg0.conf append
2
3# plzhans
4[Peer]
5PublicKey = {public key contents}
6AllowedIPs = 10.200.0.2/32

サーバーの再起動

1systemctl restart wg-quick@wg0

クライアントからサーバーへの接続

peer to peer通信の特性だと理解し、サーバーの設定を逆にすればよいです。

WireGuardクライアントの設定

インストール確認

1wg --version
2wg-quick --version

ユーザークライアントの接続(ローカルクライアント作業)

  • Endpoint : External public ip
  • PersistentKeepalive : Keep alive time
 1# ~/.wireguard/xx-server.conf
 2
 3[Interface]
 4PrivateKey = {user private key contents}
 5Address = 10.200.0.2/24
 6
 7[Peer]
 8PublicKey = {server key contents}
 9Endpoint = {server public IP}:51820
10AllowedIPs = 10.200.0.1/32
11PersistentKeepalive = 25

クライアントの実行

1sudo wg-quick up ~/.wireguard/xx-server.conf
2
3# stop
4sudo wg-quick down ~/.wireguard/xx-server.conf

クライアントの状態確認

  • この部分が表示されれば最終的に接続完了です: latest handshake: 5 seconds ago
 1wg
 2
 3# Result
 4# interface: utun12
 5#   public key: b69QMnldUd60JLXEUc4j8QzKI/1su1h4e6scx/YgrHE=
 6#   private key: (hidden)
 7#   listening port: 64874
 8
 9# peer: Y9oH7jnQVVILuRnhekWDRh9s7gCOyOf2HerAfS5Iymw=
10#   endpoint: 161.33.140.98:51820
11#   allowed ips: 10.200.0.1/32
12#   latest handshake: 5 seconds ago
13#   transfer: 92 B received, 180 B sent
14#   persistent keepalive: every 25 seconds

クライアントGUIツールを使用する場合

作成したクライアントconfファイルをimportします。

import

WireGuard GUIクライアントでクライアントconfファイルをimportする画面

登録確認

importしたトンネルがGUIクライアントの一覧に登録されたことを確認する画面

接続確認

GUIクライアントでVPNトンネルが接続された状態を確認する画面

社内サーバーへの接続確認

VPN IPでのSSHアクセス確認

1nc -vz 10.200.0.1 22
2Connection to 10.200.0.1 port 22 [tcp/ssh] succeeded!

IPルーティング

次に、ローカルクライアントからVPNサーバーを経由して内部ネットワークにアクセスできるよう設定する必要があります(MASQUERADEを使用)。

以下の内容を前提とします。

  • サーバーのプライベートネットワーク: 10.200.0.0/24
  • サーバーのネットワークインターフェース: enp0s6
 1# /etc/wireguard/wg0.conf append
 2[Interface]
 3...
 4
 5# IP FORWARD
 6PostUp = sysctl -w net.ipv4.ip_forward=1
 7PostUp = iptables -t nat -A POSTROUTING -s 10.200.0.0/24 -o enp0s6 -j MASQUERADE
 8PostUp = iptables -I FORWARD 1 -i %i -j ACCEPT
 9PostUp = iptables -I FORWARD 1 -o %i -j ACCEPT
10
11PostDown = iptables -t nat -D POSTROUTING -s 10.200.0.0/24 -o enp0s6 -j MASQUERADE
12PostDown = iptables -D FORWARD -i %i -j ACCEPT
13PostDown = iptables -D FORWARD -o %i -j ACCEPT

まとめ

サーバーのインストールからクライアント接続確認までを終えたら、VPN IPを使ってSSHなどの内部サービスにアクセスできるようになります。

Peerを追加する際は、公開鍵とAllowedIPsだけをサーバーに登録し、秘密鍵はクライアントにのみ保管しておけば問題ありません。

GUIクライアントを使えば、作成したconfファイルをimportするだけで同じように接続できます。

SaveConfigオプションとファイアウォールのUDPポートは運用中によくミスが起きやすい部分なので、設定前にもう一度確認しておくことをおすすめします。

参考

関連記事