さくらのVPS
WireGuardについて
WireGuardは導入が簡単で高速にVPN接続をすることができます。
実際にインストールを行ったところ、OpenVPNよりもインストールは簡単に行うことができました。
「Andoroid」「iOS」用のアプリではQRコードを使用して設定を読み込むこともできるため、クライアント側も簡単に設定を行うことが出来ます。
「Windows」用のソフトも、事前に作成した設定ファイルを読み込ませることで設定を行えるのため、設定は簡単に行うことができます。
作業内容
WireGuardを使ってVPN接続環境を作成するためのインストール作業を、VPNサーバ側とクライアント側に分けて説明を行っていきます。
VPNサーバ側作業
- 通信許可設定(51820/udp)
- IPフォワーディング許可設定
- WireGuardインストール
- 秘密鍵・公開鍵の作成
- preshared-key(事前共有鍵)作成
- WireGuard設定ファイル作成
- クライアント用設定ファイルの作成
- 起動・停止・自動起動設定
クライアント側作業
- WireGuardインストール
- 設定の読み込み
VPNサーバ側作業
通信許可設定(51820/udp)
ファイアウォール(firewalld)に、WireGuardで使用するUDP/51820番ポートの通信を許可する設定を行います。
$ sudo su - # firewall-cmd --add-port 51820/udp --permanent # firewall-cmd --reload
通信許可の設定が追加されているかの確認します。
# firewall-cmd --list-all
IPフォワーディング許可設定
WireGardではVPN通信を行うためのネットワークインターフェイスが作成されます。
作成されたネットワークインターフェイスと、元々あるネットワークインターフェイス間で通信を行えるようにIPフォワーディングを許可する設定を行います。
「/etc/sysctl.conf」に設定を追加する方法もありますが、今回は追加した設定があとで分かりやすいように「/etc/sysctl.d」ディレクトリに設定ファイルを新規作成します。
# cd /etc/sysctl.d # vi 10-net.ipv4.ip_forward.conf
作成するファイルには下記の内容を記述します。
net.ipv4.ip_forward=1
設定反映
「sysctl -p」コマンドで設定を反映させます。
# sysctl -p /etc/sysctl.d/10-net.ipv4.ip_forward.conf net.ipv4.ip_forward = 1
設定した内容が反映されてるか確認を行います。
「net.ipv4.ip_forward = 1」と表示されていれば設定が反映されています。
# sysctl net.ipv4.ip_forward net.ipv4.ip_forward = 1
WireGuardインストール
「dnf」を使ってWireGuardをインストールします。
# dnf install wireguard-tools
秘密鍵・公開鍵の作成
WireGuardで使用する鍵ペアPraivateKey(秘密鍵)とPublicKey(公開鍵)を、「/etc/wireguard」ディレクトリに作成します。
今回は作成する鍵ペアは以下のとおりです。
- WireGuardサーバ用鍵ペア
- PraivateKey: server_private.key
- PublicKey: server_public.key
- クライアント用鍵ペア
- PraivateKey: client_private.key
- PublicKey: client_public.key
WireGuardサーバ用鍵ペアの作成
PraivateKey(秘密鍵)の作成
「wg genkey」コマンドでPraivateKey(秘密鍵)を作成します。
# cd /etc/wireguard # wg genkey > server_private.key Warning: writing to world accessible file. Consider setting the umask to 077 and trying again.
Warningのメッセージが表示されますが、これは作成した鍵ファイルのパーミッションが他のユーザからもアクセス可能な設定になっているためです。
ですので、他のユーザからアクセス出来ないように、作成したファイルのパーミッションを600に変更します。
# chmod 600 server_private.key
PublicKey(公開鍵)の作成
「wg pubkey」コマンドで、先程作成したPraivateKey(秘密鍵)を使用してPublicKey(公開鍵)を作成します。
# wg pubkey < server_private.key > server_public.key
作成した公開鍵のパーミッションを600に設定します。
# chmod 600 server_public.key
クライアント用鍵ペアの作成
鍵ペアの作り方はサーバ用鍵ペアの作り方と同じですが、作成する鍵の名前をクライアント用であることがわかるようにして作成します。
また、クライアント用の鍵ペアを複数作成する場合は、それぞれがどのクライアント用の鍵ペアなのか分かりやすい名前にすることをおすすめします。
PraivateKey(秘密鍵)の作成
# wg genkey > client_private.key Warning: writing to world accessible file. Consider setting the umask to 077 and trying again. # chmod 600 client_private.key
PublicKey(公開鍵)の作成
# wg pubkey < client_private.key > client_public.key # chmod 600 client_public.key
preshared-key(事前共有鍵)作成
preshared-key(事前共有鍵)は、VPN接続の時に使用するパスフレーズのようなものです。
WierGuardでは必須ではないのですが、少しでもセキュリティを高めるために今回は使用しています。
今回は「client_preshared.key」という名前でpreshared-key(事前共有鍵)を作成していきます。
# wg genkey > client_preshared.key Warning: writing to world accessible file. Consider setting the umask to 077 and trying again. # chmod 600 client_preshared.key
複数のクライアントと接続する場合は、クライアント毎にpreshared-keyを作成することをおすすめします。
WireGuard設定ファイル作成
「/etc/wireguard/」ディレクトリに、「VPNインターフェイス名.conf」という名前でWireGuardサーバの設定ファイルを作成します。
今回はインターフェイスの名前「wg0」と設定したいので、「wg0.conf」という名前で設定ファイルを作成していきます。
# vi /etc/wireguard/wg0.conf
設定内容
設定ファイルは[Interface]と[Peer]の項目に分かれています。
- [Interface]: 自分(VPNサーバ側)に関する設定
- [Peer]: クライアント側に関する設定
[Interface]の項目で設定する内容
- PrivateKey: VPNサーバ用PrivateKey(秘密鍵)
- Address: VPN用インターフェイスに設定するIPアドレス
- ListenPort: VPN接続に使用するポート番号
- PostUp: WireGuard 起動後に実行するコマンド
- PostDown: WireGuard 終了前に実行するコマンド
「PostUp」には、VPNインターフェイスと物理インターフェイス間をNATさせるルールをiptablesで追加し、「PostDown」では「PostUp」で作成したルールの削除をします。
[Peer]の項目で設定する内容
- PublicKey: クライアント用のPublicKey(公開鍵)
- PresharedKey: 事前共有キー
- AllowedIPs: クライアントのVPN用インターフェイスに設定するIPアドレス
接続するクライアントの数だけ[Peer]の設定が必要になります。
設定例
「PostUp」と「PostDown」の設定で指定している「ens3」の部分は、クライアントとの接続用IPアドレスが設定されているネットワークインターフェイスを指定します。
私が借りている「さくらのVPS」では「ens3」にグローバルIP設定されていましたが、「ip a」等のコマンドで自分の環境を確認して適宜設定を行って下さい。
[Interface] PrivateKey = server_private.keyの内容 Address = 172.16.0.254/24 ListenPort = 51820 PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o ens3 -j MASQUERADE PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o ens3 -j MASQUERADE [Peer] PublicKey = client_public.keyの内容 PresharedKey = client_preshared.keyの内容 AllowedIPs = 172.16.0.1/32
複数のクライアントと接続させたい場合
下記のように[Peer]部分を追加するクライアント分設定します。
[Peer] PublicKey = client_public.keyの内容 PresharedKey = client_preshared.keyの内容 AllowedIPs = 172.16.0.1/32 [Peer] PublicKey = クライアント2用public.keyの内容 PresharedKey = クライアント2用preshared.keyの内容 AllowedIPs = 172.16.0.2/32 # クライアント2のVPNに割り振るIP
クライアント用設定ファイルの作成
クライアント用の設定ファイルを作成していきます。
# vi /etc/wireguard/wg_client.conf
複数クライアントと接続させたい場合は、設定ファイル名をどのクライアント用なのか分かりやすい名前にすると管理しやすくなります。
設定内容
クライアント用の設定ファイルも[Interface]と[Peer]の項目に分かれています。
こちらは、[Interface]がクライアント側に関する設定となり、[Peer]がWireGuardサーバ側に関する設定となっています。
[Interface]項目の設定
クライアント側に関する設定となります。
- PrivateKey: クライアント用のPrivateKey
- Address: VPN用インターフェイスに設定するIPアドレス
- DNS: VPN通信時に使用するDNSサーバ
DNS設定について
[Peer]部分で設定する「AllowedIPs」に「0.0.0.0/0」を指定すると、すべての通信がVPN(WireGuardサーバ)を経由します。
そのため、VPN接続前に設定されていたDNSサーバと通信できなくなる場合があるので、VPN接続時に使用するDNSの設定も入れる必要があります。
[Peer]項目の設定
[Peer]部分は接続先のVPNサーバ側に関する設定です。
- PublicKey: VPNサーバのPublicKey(公開鍵)
- PresharedKey: 事前共有キー
- EndPoint: VPNサーバ側の接続用アドレスとポート番号
- AllowedIPs: VPNを経由させる通信先アドレス
EndPoint設定について
EndPpintに設定するアドレスは、WireGuardサーバのグローバルIPかホスト名を設定します。
AllowedIPs設定について
AllowedIPsに0.0.0.0/0を指定するとすべての通信をVPN経由することになります。
複数のネットワークを設定した場合は、下記のように「,」で区切って設定を行います。
AllowedIPs = 172.16.0.0/24,192.168.1.0/24
設定例
「DNS」の設定はGoogle Public DNSを設定していますが、ご自分が使用したいDNSを適宜設定してください。
VPN接続後は全ての通信をWireGuardサーバを経由させる設定としています。
[Interface] PrivateKey = client_private.keyの内容 Address = 172.16.0.1/24 DNS = 8.8.8.8 [Peer] PublicKey = server_public.keyの内容 PresharedKey = client_preshared.keyの内容 EndPoint = WireGuardサーバーのアドレス:51820 AllowedIPs = 0.0.0.0/0
スマホ用に設定ファイルをQRコードに変換
「qrencode」というソフトを使用することで、設定ファイルをQRコードに変換することが出来ます。
WireGuardのクライアントがスマホの場合、WireGuardのアプリからQRコードで設定を読み込むことが出来ます。
そのため、設定ファイルをQRコードに変換することで、簡単に作成した設定をクライアントに読み込ませることが出来ます。
「qrencode」は「EPEL」リポジトリにありますので、それを使用してインストールを行います。
EPELリポジトリの追加方法は下記のページで説明しています。
https://www.server-memo.net/almalinux/almalinux9_epelrepo.html
# dnf install --enablerepo=epel qrencode
クライアント用の設定ファイルを指定してQRコードの画像ファイルを作成します。
# qrencode -o wg_client.png -r /etc/wireguard/wg_client.conf
コンソールにQRコードを直接表示させたい場合は下記のようにコマンドを実行します。
# qrencode -t ansiutf8 -r /etc/wireguard/wg_client.conf
WireGuardの起動・停止・自動起動設定
WireGardの起動
「wg-quick up インターフェイス」でWireGuardを起動させることが出来ます。
インターフェイスはWireGuard用に設定したものを指定するため、今回は「wg0」を指定しています。
# wg-quick up wg0 [#] ip link add wg0 type wireguard [#] wg setconf wg0 /dev/fd/63 [#] ip -4 address add 172.16.0.254/24 dev wg0 [#] ip link set mtu 1420 up dev wg0 [#] iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o ens3 -j MASQUERADE
起動確認
「ip」コマンドでWireGuard用のネットワークインターフェイスが存在していることを確認します。
# ip a show wg0 5: wg0:mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000 link/none inet 172.16.0.254/24 scope global wg0 valid_lft forever preferred_lft forever
「wg」コマンドを実行すると、現在のWireGuardサーバの状態が表示されます。
# wg interface: wg0 public key: サーバ用公開鍵の内容 private key: (hidden) listening port: 51820 peer: クライアント用公開鍵の内容 preshared key: (hidden) allowed ips: 172.16.0.1/32
停止の方法
「wg-quick down インターフェイス」でWireGuardを停止させることが出来ます。
# wg-quick down wg0 [#] ip link delete dev wg0 [#] iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o ens3 -j MASQUERADE
停止確認
WireGuardを停止させると、ネットワークインターフェイスも削除されます。
# ip a show wg0 Device "wg0" does not exist.
「wg」コマンドを実行しても何も表示されません。
# wg
自動起動設定
「systemctl enable wg-quick@インターフェイス」自動起動の設定を行うことが出来ます。
# systemctl enable wg-quick@wg0 Created symlink /etc/systemd/system/multi-user.target.wants/wg-quick@wg0.service → /usr/lib/systemd/system/wg-quick@.service.
クライアント側での設定
WireGuardインストール
クライアント側にインストールするWireGuardについては、公式サイトから探してインストールして下さい。
https://www.wireguard.com/install/
設定の読み込み
手元に用意できた下記環境での設定方法を説明します。
- iPhone(QRコード使用)
- Android(QRコード使用)
- Windows11(設定ファイルをインポート)
iPhone(iOS)の設定方法(QRコード使用)
WireGuardを起動した後に画面右上の「+」をタップします。
WireGuardトンネルの追加メニューが表示されるので、「QRコードから作成」を選択します。
カメラへのアクセスを許可するかどうかの確認が表示されたら「OK」を選択します。
QRコードをスキャンするとトンネル名を設定する画面が表示されるので、名前を入力して「保存」を選択します。
「"WireGuard"がVPN構成の追加を求めています」画面が表示されたら「許可」を選択します。
追加されたトンネル名が表示されるので、右側のスイッチをタップしてVPNの接続を行います。
VPNが接続されると画面上部に「VPN」と表示されます。
トンネル名をクリックすると、VPNの接続状態が表示されます。
接続状態の画面はこのような感じです。
Androidの設定方法(QRコード使用)
WireGuardを起動した後に画面右下の「+」をタップします。
どのように設定を行うかのメニューが表示されるので、「QRコードをスキャン」を選択します。
作成するトンネル名を入力し、トンネルを作成をタップします。
作成したトンネルの右側にあるスイッチをタップすると、VPN接続を行うことが出来ます。
VPNが接続されると画面上部に鍵マークのアイコンが表示されます。
トンネル名をクリックすると、VPNの接続状態が表示されます。
Windows11の設定方法(設定ファイルをインポート)
WireGuardを起動し「トンネル」タブを選択します。
画面左下のメニューから「トンネルの追加」-「ファイルからトンネルをインポート」と選択します。
※画面中央の「ファイルからトンネルをインポート」ボタンをクリックでも可
クライアント用設定ファイルを指定するウィンドウが表示されるので、設定ファイルを指定しインポートを行って下さい。
インポートした設定ファイルの名前がトンネルとして追加されているので、それを選択して「有効化」ボタンをクリックするとVPN接続を行います。
インターフェイス部分の状態が「有効」となり画面下部のピア部分に表示されている転送・受信済み部分でデータの送受信が行われていることが確認できればVPN接続に成功しています。
コメント