Ubuntu Server 22.04 LTSにWireGuardを導入

2022年5月29日日曜日

Linux Rasberry Pi

t f B! P L
Ubuntu Server 22.04 LTSにWireGuardを導入

概要

Ubuntu 22.04 LTSにインターネットVPN用途のWireGuardを導入し、Androidスマートフォンから接続出来るようにする記事です。

インターネットVPN環境を必要した理由

  • Androidスマートフォンで野良WiFiを使った時の通信盗み見を防止する。
  • 外出先から自宅のネットワークに接続し、OctoPrintにアクセスする。

前提

環境構築

192.168.2.0/24をVPNアクセス用のセグメントとしており、自宅LANのセグメントとは異なります。
また、DNSにはGoogle DNSを指定しています。 PostUpにはWireGuardの起動前の処理、PostDownにはWireGuardの停止前の処理を設定します。

Androidスマートフォン用のWireGuard設定ファイルをUbuntu上で作り、それをQRコードにして、Androidスマートフォン読み込ませるために、qrencodeを使います。
なお、ライブラリにlibqrencodeを使ったQRコード生成ユーティリティqrencodeは、英数字で最大約4000字を埋め込むことができます。

ファイヤーウォールの設定

Ubuntu Server 22.04 LTSは、デフォルトだとファイヤーウォールの設定がされていないため、ufwを使ってファイヤーウォールの設定をする。
誤った設定をするとSSHで接続が出来なくなったり、セキュリティリスクが高くなったりするので要注意です。

  • 自宅LANのセグメント192.168.1.0/24からのSSHアクセスを許可する。
  • WireGuard用にUDP51820を許可する。
  • OctoPrint用にTCP80、TCP443を許可する。
username@ubuntu:~$ sudo ufw status username@ubuntu:~$ sudo ufw allow proto tcp from 192.168.1.0/24 to any port 22 username@ubuntu:~$ sudo ufw allow 51820/udp username@ubuntu:~$ sudo ufw allow 80/tcp username@ubuntu:~$ sudo ufw allow 443/tcp username@ubuntu:~$ sudo ufw enable username@ubuntu:~$ sudo ufw status

UbuntuにWireGuardを導入する

  1. WireGuardとqrencodeをインストールします。
username@ubuntu:~$ sudo apt install wireguard qrencode -y
  1. needrestartパッケージの機能でサービスの確認画面が出ますが、特に再起動の必要なサービスはないと思うので、そのままOKを選択します。

  2. サーバの秘密鍵と公開鍵を作成

作成する秘密鍵と公開鍵のパーミッションが600になるようumaskを設定。
ファイルは初期値では実行権限が付かないので、「u=rwx,g=,o=」となっていますが、600になります。
ログアウトすればumaskはデフォルトの0002に戻るので再設定は不要です。

username@ubuntu:~$ sudo -i [sudo] password for username: root@ubuntu:~# umask 0022 root@ubuntu:~# umask 0077 root@ubuntu:~# umask -S u=rwx,g=,o=

便宜上、Ubuntu側をサーバとして扱います。
wg genkeyで秘密鍵を作成し、作成した秘密鍵から公開鍵をwg pubkeyで作成します。

root@ubuntu:~# wg genkey | tee /etc/wireguard/server.key root@ubuntu:~# cat /etc/wireguard/server.key | wg pubkey | tee /etc/wireguard/server.pub
  1. クライアントの秘密鍵と公開鍵を作成

便宜上、Androidスマートフォン側をクライアントとして扱います。
wg genkeyで秘密鍵を作成し、作成した秘密鍵から公開鍵をwg pubkeyで作成します。

root@ubuntu:~# wg genkey | tee /etc/wireguard/client.key root@ubuntu:~# cat /etc/wireguard/client.key | wg pubkey | tee /etc/wireguard/client.pub
  1. サーバとなるUbuntuで動作させるWireGuardの設定ファイルをヒアドキュメントで作成します。
root@ubuntu:~# cat <<EOF > /etc/wireguard/wg0.conf [Interface] ListenPort = 51820 Address = 192.168.2.1/24 PrivateKey = (サーバの秘密鍵) PostUp = echo 1 > /proc/sys/net/ipv4/ip_forward; iptables -A FORWARD -i wg0 -o wlan0 -j ACCEPT; iptables -A FORWARD -i wlan0 -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE PostDown = echo 0 > /proc/sys/net/ipv4/ip_forward; iptables -D FORWARD -i wg0 -o wlan0 -j ACCEPT; iptables -D FORWARD -i wlan0 -o wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o wlan0 -j MASQUERADE [Peer] PublicKey = (クライアントの公開鍵) AllowedIPs = 192.168.2.100/32 EOF
  1. WireGuardの手動実行でWireGuardのwg0インターフェースが作成される事とPostUp、PostDownの動作確認をします。
username@ubuntu:~$ sudo wg-quick up wg0 username@ubuntu:~$ sudo wg username@ubuntu:~$ ip addr username@ubuntu:~$ iptables -L username@ubuntu:~$ sysctl net.ipv4.ip_forward username@ubuntu:~$ sudo wg-quick down wg0 username@ubuntu:~$ sudo wg username@ubuntu:~$ ip addr username@ubuntu:~$ iptables -L username@ubuntu:~$ sysctl net.ipv4.ip_forward
  1. Ubuntuの起動時に自動起動するように設定します。
username@ubuntu:~$ systemctl status wg-quick@wg0 ○ wg-quick@wg0.service - WireGuard via wg-quick(8) for wg0 Loaded: loaded (/lib/systemd/system/wg-quick@.service; disabled; vendor preset: enabled) Active: inactive (dead) Docs: man:wg-quick(8) man:wg(8) https://www.wireguard.com/ https://www.wireguard.com/quickstart/ https://git.zx2c4.com/wireguard-tools/about/src/man/wg-quick.8 https://git.zx2c4.com/wireguard-tools/about/src/man/wg.8 username@ubuntu:~$ sudo systemctl enable wg-quick@wg0 Created symlink /etc/systemd/system/multi-user.target.wants/wg-quick@wg0.service → /lib/systemd/system/wg-quick@.service. username@ubuntu:~$ systemctl status wg-quick@wg0 ○ wg-quick@wg0.service - WireGuard via wg-quick(8) for wg0 Loaded: loaded (/lib/systemd/system/wg-quick@.service; enabled; vendor preset: enabled) Active: inactive (dead) Docs: man:wg-quick(8) man:wg(8) https://www.wireguard.com/ https://www.wireguard.com/quickstart/ https://git.zx2c4.com/wireguard-tools/about/src/man/wg-quick.8 https://git.zx2c4.com/wireguard-tools/about/src/man/wg.8 username@ubuntu:~$
  1. Ubuntuを再起動します。
username@ubuntu:~$ sudo reboot
  1. 再起動後、WireGuardが自動起動するか確認します。
username@ubuntu:~$ systemctl status wg-quick@wg0 ● wg-quick@wg0.service - WireGuard via wg-quick(8) for wg0 Loaded: loaded (/lib/systemd/system/wg-quick@.service; enabled; vendor preset: enabled) Active: active (exited) since Sat 2022-05-28 07:27:25 JST; 4min 21s ago Docs: man:wg-quick(8) man:wg(8) https://www.wireguard.com/ https://www.wireguard.com/quickstart/ https://git.zx2c4.com/wireguard-tools/about/src/man/wg-quick.8 https://git.zx2c4.com/wireguard-tools/about/src/man/wg.8 Process: 814 ExecStart=/usr/bin/wg-quick up wg0 (code=exited, status=0/SUCCESS) Main PID: 814 (code=exited, status=0/SUCCESS) CPU: 168ms May 28 07:27:24 ubuntu systemd[1]: Starting WireGuard via wg-quick(8) for wg0... May 28 07:27:24 ubuntu wg-quick[814]: [#] ip link add wg0 type wireguard May 28 07:27:25 ubuntu wg-quick[814]: [#] wg setconf wg0 /dev/fd/63 May 28 07:27:25 ubuntu wg-quick[814]: [#] ip -4 address add 192.168.2.1/24 dev wg0 May 28 07:27:25 ubuntu wg-quick[814]: [#] ip link set mtu 1420 up dev wg0 May 28 07:27:25 ubuntu wg-quick[814]: [#] echo 1 > /proc/sys/net/ipv4/ip_forward; iptables -A FORWARD -i wg0 -o wlan0 -j ACCEPT; iptables -A FORWARD -i wlan0 -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE May 28 07:27:25 ubuntu systemd[1]: Finished WireGuard via wg-quick(8) for wg0. username@ubuntu:~$

AndroidスマートフォンにWireGuard導入

  1. クライアントとなるAndroidスマートフォンで動作させるWireGuardの設定ファイルをヒアドキュメントで作成します。
username@ubuntu:~$ sudo -i [sudo] password for username: root@ubuntu:~# root@ubuntu:~# cat <<EOF > /etc/wireguard/android_wg0.conf [Interface] PrivateKey = (クライアントの秘密鍵) Address = 192.168.2.100/24 DNS = 8.8.8.8, 8.8.4.4 [Peer] PublicKey = (サーバの公開鍵) EndPoint = test.kabukigoya.com:51820 AllowedIPs = 0.0.0.0/0 PersistentKeepAlive = 30 EOF
  1. Androidスマートフォン上のWireGuardに読み込ませるため、作成した設定ファイルをQRコードにする。
    画像ファイルの所有者を変更しているのは、一般ユーザで画像をダウンロードするためです。
root@ubuntu:~# qrencode -o /etc/wireguard/android.png < /etc/wireguard/android_wg0.conf root@ubuntu:~# cp /etc/wireguard/android.png /home/username/ root@ubuntu:~# chown username /home/username/android.png
  1. WinSCPでWindowsPCにandroid.pngをダウンロードし、ディスプレイに画像を表示させます。

  2. Android版WireGuardを起動し、右下の「+」ボタンをタップする。

  3. 「QRコードをスキャン」をタップする。

  4. トンネル名に myhome など適当な名前を付け、「トンネルを作成」をタップする。

  5. 有効にすればUbuntu on Raspberry PiへのVPN接続完了です。


次は、OctoPrint導入の記事を公開予定です。

QooQ