はじめに
ConoHa VPSサービスを利用して、Ubuntu 22.04環境にWireGuard VPNサーバーを構築したときの記録を共有します。
ConoHa VPSは初期状態でrootユーザーが有効になってしまっているため、§1. ConoHa VPSの初期設定 ではrootユーザーの無効化など最低限のセキュリティ設定をしています。
ConoHa VPSではない方は §2. WireGuardのインストール・設定 から読み進めてください。
この記事を読んでConoHa VPSに興味をもたれた方へ!下のリンクからご契約頂ければ、すぐ使えるクーポン1,000円分が貰えます!個人情報的なものは双方に連絡ないのでご安心ください。(契約後に2,000円分以上ご利用頂くと私にもクーポンが出るらしい?けど貰ったことはありません笑)
§1. ConoHa VPSの初期設定
前提
- ConoHa VPSで「Ubuntu 22.04 (64bit)」のサーバーを追加していること
- ConoHa VPSの管理画面からコンソールを開く、または、SSH接続した状態で、rootユーザーでログインしていること
ユーザーの設定
ユーザーを追加する
好きなユーザー名を追加してください。
# "mulong"という名前のユーザーを追加する場合の例です
adduser mulong
Adding user `mulong' ...
Adding new group `mulong' (1000) ...
Adding new user `mulong' (1000) with group `mulong' ...
Creating home directory `/home/mulong' ...
Copying files from `/etc/skel' ...
New password:
作成したユーザーにsudo権限を付与する
gpasswd -a mulong sudo
Adding user mulong to group sudo
ログアウト
logout
追加したユーザーでログインし直す
SSH接続の場合
# サーバーのグローバルIPアドレスが"198.51.100.120"の場合の例です
ssh mulong@198.51.100.120
VPS管理画面のコンソールの場合
Ubuntu 22.04 LTS 198-51-100-120 tty1
login: mulong
Password:
rootアカウントを無効化する
sudo passwd -l root
SSHとファイアウォールの設定
Ubuntu標準搭載のファイアウォール管理ツールUFWを使い、ファイアウォールの設定をします。
UFWのデフォルトポリシーを設定する
# 全てのポートを閉じます。
sudo ufw default deny
UFWで接続ログを残す設定をする
sudo ufw logging on
sudo ufw logging medium
SSHの設定を変更する
sudo vim /etc/ssh/sshd_config
: (省略)
#Port 22
: (省略)
PermitRootLogin yes
: (省略)
: (省略)
Port 54321 👈 sshのポート番号を変更(54321番の場合)
: (省略)
PermitRootLogin no 👈 rootでのsshログインを無効化
: (省略)
SSHの設定を反映する
sudo systemctl restart sshd
【注意】 この時点ではまだSSH接続できません。 このまま続けて、変更後のSSHポート番号に合わせてファイアウォールを設定します。
SSH接続用にUFWを設定する
接続元のIPアドレスが固定の場合、IPアドレスを限定してポートを開くと安心です。
# 接続元IPアドレスを"203.0.113.32"に限定する場合の例です
sudo ufw allow from 203.0.113.32 to any port 54321
接続元が固定IPアドレスではない場合や、よりセキュリティを高めたい場合には、公開鍵認証も追加すると良いでしょう。(手順は下記記事を参照してください。)
UFWを有効化する
sudo ufw enable
新しいポート番号で再接続する
exit
# サーバーのIPアドレスが"198.51.100.120"、SSHポートを"54321"に設定していた場合の例です
ssh -p 54321 mulong@198.51.100.120
ちなみに、もし設定ミスでSSH接続できなくなっても、ConoHaのVPS管理画面のコンソールからであればログインできます。(便利ですね!)
UFWの不要なルールを削除する
現在のルールを確認します。
sudo ufw status
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
54321 ALLOW 203.0.113.32
OpenSSH (v6) ALLOW Anywhere (v6)
SSH (OpenSSH: 22) ポートは変更済みなので削除します。
sudo ufw delete allow OpenSSH
sudo ufw reload
Status: active
To Action From
-- ------ ----
54321 ALLOW 203.0.113.32
これで必要最小限の初期設定は完了です。
お待たせしました。それではWireGuardの設定をしましょう!
§2. WireGuardのインストール・設定
インストール
sudo apt update
sudo apt install wireguard
鍵の発行
事前準備として、先にWireGuardの設定で使う鍵を発行しておきます。
発行する鍵が沢山あるので、混乱しないようにフォルダ分けしておくと良いと思います。
サーバー用のキーペア(公開鍵&秘密鍵)の作成
mkdir -p ~/wireguard/server
cd ~/wireguard/server
wg genkey | tee privatekey | wg pubkey > publickey
作成した2つのファイル(privatekey, publickey)のファイルアクセス権を変更します。
chmod 600 privatekey publickey
作成したキー値はcat
コマンドで確認できます。
cat privatekey publickey
クライアント用のキーペア(公開鍵&秘密鍵)と事前共有鍵の作成
サーバーとほぼ同様の方法でクライアント用の鍵を発行します。
クライアント用では事前共有鍵も作ります。
接続したいクライアントの数だけ作ります。(下記の例では3つ作成しています)
mkdir -p ~/wireguard/client_001
cd ~/wireguard/client_001
wg genkey | tee privatekey | wg pubkey > publickey
wg genpsk > preshared
chmod 600 privatekey publickey preshared
cat privatekey publickey preshared
mkdir -p ~/wireguard/client_002
cd ~/wireguard/client_002
wg genkey | tee privatekey | wg pubkey > publickey
wg genpsk > preshared
chmod 600 privatekey publickey preshared
cat privatekey publickey preshared
mkdir -p ~/wireguard/client_003
cd ~/wireguard/client_003
wg genkey | tee privatekey | wg pubkey > publickey
wg genpsk > preshared
chmod 600 privatekey publickey preshared
cat privatekey publickey preshared
IPフォワードの設定
IPv4とIPv6のパケットフォワーディングを有効にします。
sudo vim /etc/sysctl.conf
# Uncomment the next line to enable packet forwarding for IPv4
#net.ipv4.ip_forward=1
# Uncomment the next line to enable packet forwarding for IPv6
# Enabling this option disables Stateless Address Autoconfiguration
# based on Router Advertisements for this host
#net.ipv6.conf.all.forwarding=1
# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1 👈 コメント(#)を外す
# Uncomment the next line to enable packet forwarding for IPv6
# Enabling this option disables Stateless Address Autoconfiguration
# based on Router Advertisements for this host
net.ipv6.conf.all.forwarding=1 👈 コメント(#)を外す
変更を反映します。
sudo sysctl -p
ファイアウォールの設定
WireGuardはデフォルトでは51820ポートを使います。
この記事でもそれにならって51820にしていますが、実際には別のポート番号に変えると良いでしょう。
# WireGuardで"51820"ポートを使う場合の例です。
sudo ufw allow 51820/udp
WireGuardのconfファイル作成
WireGuardは後述するwg-quick
コマンドを実行すると、自動で/etc/wireguard
内のconfファイルを読み込んで設定・起動する仕組みになっています。
読み込ませるconfファイルを作成しましょう。
サーバー用のconfファイル作成
sudo vim /etc/wireguard/wg0.conf
[Interface]
# server
Address = 10.0.25.1/24 # CIDR表記を使います。例はVPNで使うアドレス範囲を 10.0.25.1 ~ 10.0.25.254 にする場合。
ListenPort = 51820 # WireGuardサーバーのポート番号
PrivateKey = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX= 👈 cat ~/wireguard/server/privatekey の値
PostUp = ufw route allow in on wg0 out on eth0
PostUp = iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
PostUp = ip6tables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
PreDown = ufw route delete allow in on wg0 out on eth0
PreDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
PreDown = ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
[Peer]
# client_001
PublicKey = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX= 👈 cat ~/wireguard/client_001/publickey の値
PresharedKey = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX= 👈 cat ~/wireguard/client_001/preshared の値
AllowedIPs = 10.0.25.2/32 # client_001に割り当てるIPアドレス
[Peer]
# client_002
PublicKey = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX= 👈 cat ~/wireguard/client_002/publickey の値
PresharedKey = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX= 👈 cat ~/wireguard/client_002/preshared の値
AllowedIPs = 10.0.25.3/32 # client_002に割り当てるIPアドレス
[Peer]
# client_003
PublicKey = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX= 👈 cat ~/wireguard/client_003/publickey の値
PresharedKey = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX= 👈 cat ~/wireguard/client_003/preshared の値
AllowedIPs = 10.0.25.4/32 # client_003に割り当てるIPアドレス
PostUp, PreDownの部分
wg0ネットワークからの通信をeth0へフォワーディングし、その通信がWireGuardサーバーから直接行われたように見せかける設定をしています。以下のサイトを参考にしました。
クライアント用のconfファイル作成
sudo vim ~/wireguard/client_001.conf
[Interface]
# client_001
PrivateKey = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX= 👈 cat ~/wireguard/client_001/privatekey の値
Address = 10.0.25.2/24
DNS = XXX.XXX.XXX.XXX, XXX.XXX.XXX.XXX 👈 ConoHaの場合は管理画面でDNS1,DNS2のアドレスを設定する(確認方法は後述)と良いと思います。
[Peer]
# server
PublicKey = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX= 👈 cat ~/wireguard/server/publickey の値
PresharedKey = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX= 👈 cat ~/wireguard/client_001/preshared の値
AllowedIPs = 0.0.0.0/0 👈 WireGuard経由で接続したいIPアドレスを指定します。0.0.0.0/0にすると全ての通信がWireGuard経由になります。
Endpoint = 198.51.100.120:51820 👈 WireGuardサーバーのグローバルIPアドレス:ポート番号を指定
クライアント側のconfファイルでは、[Peer]がWireGuardサーバーのことを意味します。
同様にして、client_002, client003についても書くとこうなります。
[Interface]
# client_002
PrivateKey = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX= 👈 cat ~/wireguard/client_002/privatekey の値
Address = 10.0.25.3/24
DNS = XXX.XXX.XXX.XXX, XXX.XXX.XXX.XXX 👈 ConoHaの場合は管理画面でDNS1,DNS2のアドレスを設定する(確認方法は後述)と良いと思います。
[Peer]
# server
PublicKey = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX= 👈 cat ~/wireguard/server/publickey の値
PresharedKey = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX= 👈 cat ~/wireguard/client_002/preshared の値
AllowedIPs = 0.0.0.0/0 👈 WireGuard経由で接続したいIPアドレスを指定します。0.0.0.0/0にすると全ての通信がWireGuard経由になります。
Endpoint = 198.51.100.120:51820 👈 WireGuardサーバーのグローバルIPアドレス:ポート番号を指定
[Interface]
# client_003
PrivateKey = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX= 👈 cat ~/wireguard/client_003/privatekey の値
Address = 10.0.25.4/24
DNS = XXX.XXX.XXX.XXX, XXX.XXX.XXX.XXX 👈 ConoHaの場合は管理画面でDNS1,DNS2のアドレスを設定する(確認方法は後述)と良いと思います。
[Peer]
# server
PublicKey = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX= 👈 cat ~/wireguard/server/publickey の値
PresharedKey = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX= 👈 cat ~/wireguard/client_003/preshared の値
AllowedIPs = 0.0.0.0/0 👈 WireGuard経由で接続したいIPアドレスを指定します。0.0.0.0/0にすると全ての通信がWireGuard経由になります。
Endpoint = 198.51.100.120:51820 👈 WireGuardサーバーのグローバルIPアドレス:ポート番号を指定
AllowedIPsの書き方
WireGuardサーバー経由で通信したい、接続先IPアドレスを記述します。
海外から日本のサービスを使うときや、IPアドレス制限の掛かっているサービスにアクセスするときだけWireGuardサーバー経由で通信したいけど、その他はクライアントPCから直接通信したい。
という場合は、AllowIPsにWireGuardサーバー経由で接続したいサービスのIPアドレスを指定すると実現できます。
面倒臭がって0.0.0.0/0
を指定すると、全てのIPアドレス(ローカルIPアドレス範囲含む(!))に対する通信がWireGuardサーバー経由になるため、ローカルネットワーク内で通信したい場合は、そのローカルネットワークのIPアドレス範囲を除外したアドレスを指定する必要があります。
[ConoHa VPSの場合] DNS1, DNS2サーバーアドレスの確認方法
VPS管理画面に入って、下画像の赤枠部分に記載されています。
WireGuardクライアントにconfファイルを読み込ませる
WireGuardクライアントを下記リンク(WireGuard公式)からダウンロードします。
クライアント用confファイルを、WireGuardクライアントに読み込ませて下さい。
動作確認
sudo wg-quick up /etc/wireguard/wg0.conf
これでWireGuardサーバーが立ち上がるので、クライアントから接続を試してみましょう。
【失敗メモ】 はじめ、sudo wg setconf wg0 /etc/wireguard/wg0.conf
を実行してWireGuardに設定を読み込ませるものと勘違いしていたため、Line unrecognized: `Address=10.0.25.1/24' Configuration parsing error
というエラーが出てきて躓きました。wg-quick
コマンドとwg
コマンドでは、confファイルの書き方が違います。wg-quick
用に書かれたconfファイルを、wg
コマンドで読み込むと上記エラーが出ます。
接続が確認できたらWireGuardサーバーを終了します。
sudo wg-quick down /etc/wireguard/wg0.conf
自動起動の設定
sudo systemctl enable wg-quick@wg0
sudo systemctl start wg-quick@wg0
おまけ)VPN接続中にSSH接続するためのファイアウォール設定
sudo ufw allow from 10.0.25.0/24 to any port 54321 proto tcp
以上です!
コメント