WireGuardでVPNサーバーを構築して繋いでみた

「SAVACAN」担当のMKです。

今回のブログでは、WireGuardでVPN環境を構築をする設定方法と動作確認結果を紹介します。
拠点間VPNではなくリモートアクセスVPNのブログとなります。

VPNがどういうものか概要を理解している方向けの記事となっておりますのでVPNの仕組み、種類、プロトコルの説明は省略させて頂きます。

はじめに、簡単ですがVPNとは何か、どういうことができるのかを説明しておきます。

目次

VPNとは何か、どういうことができるのか

VPN(Virtual Private Network)を利用すると、会社の社内ネットワークなどインターネット公開されていないLANネットワークに、暗号化された通信を経由して安全にアクセスすることができます。
VPNの接続元にクライアントソフトウェア(または機器)、接続先にVPNサーバー機器を用意する形が一般的です。

VPNを使うと、外出先から社内や自宅など施設内のLANネットワークに安全にアクセスできる

WireGuardとはどのようなものか

今回のVPN環境の構築に使用するWireGuardはオープンソースのVPNソフトウェアになります。
クライアント用、サーバー用の両方がソフトウェアが提供されています。
その時点で最も安全と考えられる暗号方式を採用し、SSHと同じくらい簡単に構成できるシンプルで高速なVPNを目指しています。

WireGuardでのVPN接続はudp通信でIPパケットをカプセル化し、WireGuardサーバーとクライアントPCで公開鍵を交換する形で実現しています。
構造がシンプルな反面、認証部のセキュリティを強化したい場合、他のツールと組み合わせて利用する必要があります。
その辺りもいずれか記事にしていきたいと思います。

設定が非常にシンプルな構造となっていますので、やろうと思ったその日のうちに導入する事も可能です!

WireGuard環境の構成

・構築環境
WireGuardサーバーIPアドレス
パブリックIPアドレス:XXX.XXX.XXX.111
プライベートIPアドレス:ZZZ.ZZZ.ZZZ.111

OSバージョン
AlmaLinux release 8.9 (Midnight Oncilla)

kmod-wireguardバージョン
9:1.0.20220627-6

wireguard-toolsバージョン
1.0.20210914-1

クライアント用PCのWindows11にWireGuardアプリケーションをインストールします。
https://www.wireguard.com/install/

クライアント側の固定IPアドレス
YYY.YYY.YYY.222

・事前準備
WireGuardサーバーを設置するネットワーク環境のルーターにWireGuardサーバーのDMZ IPアドレスへの指定ポート番号(今回は51820)でのUDP通信を許可します。ポートの解放方法は設置しているルーターの仕様に従ってください。

・期待する動作
クライアント用Windows11からWireGuardサーバー経由でWireGuardサーバーのプライベートIPアドレスにSSHで接続します。
(プライベートIPアドレスは通常外部から直接接続できないネットワークです。)

設定してみる

WireGuardインストール

dnf -y install epel-release elrepo-release
dnf -y install kmod-wireguard wireguard-tools

秘密鍵と公開鍵の作成

cd /etc/wireguard/
umask 077

# WireGuard側の秘密鍵作成
wg genkey | tee /etc/wireguard/server_private.key
# WireGuard側の公開鍵作成
wg pubkey < /etc/wireguard/server_private.key > /etc/wireguard/server_public.key

キーの内容をメモします。
[root@wire ~]# cat /etc/wireguard/server_private.key 
(WireGuard秘密鍵)
[root@wire ~]# cat /etc/wireguard/server_public.key 
(WireGuard公開鍵)
[root@wire ~]# 

クライアントPC用の秘密鍵、公開鍵はWireGuardのPC用アプリケーションで作成するか、
WireGuard側の鍵作成と同じ手順で秘密鍵、公開鍵を作成します。
公開鍵:(クライアント公開鍵)
秘密鍵:(クライアント秘密鍵)

WireGuard設定

vi /etc/wireguard/wg0.conf

[Interface]
# WireGuard側の秘密鍵を指定
PrivateKey = (WireGuard秘密鍵)
# WireGuard側のVPNインターフェースに割り当てるIPアドレス
Address = 10.0.0.1/24
ListenPort = 51820

# WireGuard起動後/終了後に以下のコマンドを実行
PostUp = firewall-cmd --zone=public --add-masquerade; firewall-cmd --direct --add-rule ipv4 filter FORWARD 0 -i wg0 -o enp1s0 -j ACCEPT; firewall-cmd --direct --add-rule ipv4 nat POSTROUTING 0 -o enp1s0 -j MASQUERADE; firewall-cmd --add-port=51820/udp
PostDown = firewall-cmd --zone=public --remove-masquerade; firewall-cmd --direct --remove-rule ipv4 filter FORWARD 0 -i wg0 -o enp1s0 -j ACCEPT; firewall-cmd --direct --remove-rule ipv4 nat POSTROUTING 0 -o enp1s0 -j MASQUERADE; firewall-cmd --remove-port=51820/udp

[Peer]
# クライアントPC用公開鍵を指定(アカウントの人分の数の設定をします)
PublicKey = (クライアント公開鍵)
# 接続を許可するクライアントにWireGuardで割り当てられるIPアドレス
AllowedIPs = 10.0.0.3/32

IPフォワード設定
IPフォワードは異なるNIC間でパケットを転送する技術です。

vi /etc/sysctl.conf

net.ipv4.ip_forward = 1
# ipv6を許可する場合は以下も記載します
net.ipv6.conf.all.forwarding = 1

反映します
sysctl -p

firewall設定

WireGuard経由でWireGuardサーバーにSSH接続する場合にWireGuardで割り当てるIPを許可します
firewall-cmd --zone=public --add-rich-rule='rule family=ipv4 source address="10.0.0.0/24" port port=22 protocol=tcp accept' --permanent

反映します
firewall-cmd --reload

起動設定をします

起動と停止動作でエラーが出ないことを確認します。
wg-quick up wg0
wg-quick down wg0

起動と停止の動作に問題なければ自動起動します。
systemctl enable wg-quick@wg0

ここまで設定が終わったらWireGuardのIPアドレスを確認します

[root@wire ~]# wg
interface: wg0
  public key: (WireGuard公開鍵)
  private key: (hidden)
  listening port: 51820
  fwmark: 0xca6c

peer: (クライアント公開鍵)
  endpoint: YYY.YYY.YYY.222:7094
  allowed ips: 10.0.0.3/32
  latest handshake: 18 minutes, 7 seconds ago
  transfer: 6.86 KiB received, 12.80 KiB sent
[root@wire ~]# 


[root@wire ~]# ip a show wg0
4: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
    link/none 
    inet 10.0.0.1/24 scope global wg0
       valid_lft forever preferred_lft forever
[root@wire ~]# 

クライアントPC側の設定

WindowsPCからWireGuardアプリケーションを使って接続します。
以下の内容をWireGuardアプリケーションのトンネルに追加します。

以下の内容をwg.conf(ファイル名は任意です)というファイル名で保存しておきconfファイルをインポートします。
[Interface]
# クライアントPC用の秘密鍵を指定
PrivateKey = (クライアント秘密鍵)
Address = 10.0.0.3/24
DNS = 1.1.1.1

[Peer]
# WireGuard側の公開鍵を指定
PublicKey = (WireGuard公開鍵)
# 通信する際にWireGuardサーバーを経由させたい対向ネットワーク帯(すべての通信をWireGuardを経由させたい場合は0.0.0.0/0)
AllowedIPs = XXX.XXX.XXX.0/24(WireGuardサーバーを設置したパブリックネットワーク), ZZZ.ZZZ.ZZZ.0/24(WireGuardサーバーを設置したプライベートネットワーク)
Endpoint = XXX.XXX.XXX.111:51820

WireGuardアプリケーションからWireGuardサーバーとのトンネルを有効化します。

トンネル有効化後にWindowsのコマンドプロンプトでWireGuardサーバーからIPアドレスが割り当てられたことを確認します。

C:\Users\guest>ipconfig

Windows IP 構成

不明なアダプター wire_vpn:

   接続固有の DNS サフィックス . . . . .:
   IPv4 アドレス . . . . . . . . . . . .: 10.0.0.3
   サブネット マスク . . . . . . . . . .: 255.255.255.0
   デフォルト ゲートウェイ . . . . . . .:

クライアントPCからターミナルソフトを使ってSSH接続する
ここではmobaxtermというターミナルソフトを使ってWireGuardサーバーのプライベートIPアドレスに接続しています。

22/03/2024 15:17.08 /home/mobaxterm ssh root@ZZZ.ZZZ.ZZZ.111 ← ZZZ.ZZZ.ZZZ.111にssh接続
Warning: Permanently added 'ZZZ.ZZZ.ZZZ.111' (ED25519) to the list of known hosts.
[root@wire ~]$

プライベートIPアドレスは公開されず外部から直接アクセスできないIPアドレスですので、無事VPNを使って公開されていないIPアドレスに直接アクセスできることが確認できました!

VPNを使うと便利なケースの紹介

テレワークなどで自宅から社内に設置しているパソコン、NASなどへの接続(社内に固定IPアドレスが必要です)

外出先のWi-Fiから固定IPアドレスで接続制限している環境への接続
WireGuardサーバーのIPアドレスでの接続になりますので社外から固定IPアドレスを利用することができます。

VPNを使うとこのようなことができます。
テレワークの導入を検討したり、外出先で社内と同じように働きたいとお困りの方はぜひお試しください!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

目次