【Linux】Ubuntu 22.04 Wireguard インストール手順

Linux
スポンサーリンク

今回は、Ubuntu 22.04 ServerにWireGuardをインストールする手順を記事にしていきたいと思います。

Wireguardとは

WireGuardは、フリーかつオープンソースルーティング又はブリッジで安全なポイント・ツー・ポイント接続を作成するための技術であるVirtual Private Network (VPN) の実装であり、アプリケーション及び通信プロトコルである。Linuxカーネル内のモジュールとして実行され、IPsecOpenVPNよりも優れた性能を目指している[2]。WireGuardはJason A. Donenfeldによって書かれ、GNU GPL v2の下で配布されている[3]

wikiより引用

WireGuardはVPNソフトウェアの一種となります。
VPN自体は、業務用のルータや最近だとコンシューマ向けのルータなどにも搭載されていることが多いです。WireGuardはソフトウェアとしてVPNサーバの機能を提供するため、OSにインストールして利用する形になります。
OpenVPNなどの他のVPNソフトウェアに比べ、軽量でセキュリティ性が高く設計されているらしいです。

期待する目標

本手順で期待する目標は以下の通りです。

  • Ubuntu 22.04にWireGuardをインストールすることができる
  • WireGuardの設定ファイルを理解できる
  • WireGuardを設定することができる
  • WireGuardを自動起動できる

前提条件

本手順で使用する環境は以下の通りです。

  • CPU : 2vCPU
  • MEM : 4GB
  • DISK : 60GB
  • OS : Ubuntu Server 22.04
  • IP : 192.168.100.174
  • VPN IP : 192.168.100.175/32

今回はVPNクライアントの接続元は1台なので、VPN用のIPは1IPを確保しておきます。

WireGuard インストール

Ubuntu ServerのターミナルまたはSSH接続します。
SSH接続後、以下のコマンドを実行することで、WireGuardをインストールすることができます。

willserver@dev-wire:~$ sudo apt install wireguard
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following packages were automatically installed and are no longer required:
  libflashrom1 libftdi1-2 libintl-perl libintl-xs-perl libmodule-find-perl libmodule-scandeps-perl libproc-processtable-perl libsort-naturally-perl libterm-readkey-perl
Use 'sudo apt autoremove' to remove them.
The following NEW packages will be installed:
  wireguard
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 3,114 B of archives.
After this operation, 17.4 kB of additional disk space will be used.
Get:1 http://jp.archive.ubuntu.com/ubuntu jammy/universe amd64 wireguard all 1.0.20210914-1ubuntu2 [3,114 B]
Fetched 3,114 B in 1s (3,274 B/s)
Selecting previously unselected package wireguard.
(Reading database ... 73933 files and directories currently installed.)
Preparing to unpack .../wireguard_1.0.20210914-1ubuntu2_all.deb ...
Unpacking wireguard (1.0.20210914-1ubuntu2) ...
Setting up wireguard (1.0.20210914-1ubuntu2) ...
willserver@dev-wire:~$

Ubuntu 22.04では、標準のリポジトリにWireGuardは入っているので、APTコマンドで一発で入ります。

キーの生成

WireGuardのインストールが完了したら、Serverの秘密鍵・公開鍵とクライアントの秘密鍵・公開鍵を生成していきます。
一般的なVPNであれば、ユーザIDやパスワードなどを作成してそのユーザ情報を認証情報として利用することで、VPNを張りますが、WireGuardは、作成した秘密鍵や公開鍵を使用して認証を行います。
そのため、ユーザIDなどを作成する代わりに秘密鍵・公開鍵のセットを作成します。
サーバの秘密鍵ペアについては、1セットで良いですが、VPNを張るユーザについては、複数の鍵ペアがあったほうがセキュリティ的に安全だと思います。

WireGuardで生成する鍵は最低4つ必要になります。

  1. サーバの秘密鍵
  2. サーバの公開鍵
  3. クライアントの秘密鍵
  4. クライアントの公開鍵

設定上、必要な鍵は[1.サーバの秘密鍵]と、[4.クライアントの公開鍵]になります。
作成の流れとして、wg genkeyを使用して、キー生成を行い、teeコマンドでキーを保存します。

以下のコマンドを使用して1.サーバの秘密鍵を作成します。

willserver@dev-wire:~$ wg genkey | sudo tee /etc/wireguard/server_private.key 
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
willserver@dev-wire:~$

キーを作成し、teeコマンドで出力します。
表示される文字列が鍵になります。

以下のコマンドを使用して2.サーバの公開鍵を作成します。

willserver@dev-wire:~$ wg genkey | sudo tee /etc/wireguard/server_public.pub 
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
willserver@dev-wire:~$

以下のコマンドを使用して、3.クライアントの秘密鍵を作成します。

willserver@dev-wire:~$ wg genkey | sudo tee /etc/wireguard/client_001.key
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
willserver@dev-wire:~$

以下のコマンドを使用して、4.クライアントの公開鍵を作成します。

willserver@dev-wire:~$ wg genkey | sudo tee /etc/wireguard/client_001.pub
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
willserver@dev-wire:~$

キーの作成が完了したら、鍵類のアクセス権を変更しておきます。
パーミッションは600で設定しています。

willserver@dev-wire:~$ sudo chmod 600 /etc/wireguard/client_001.key
willserver@dev-wire:~$ sudo chmod 600 /etc/wireguard/client_001.pub
willserver@dev-wire:~$ sudo chmod 600 /etc/wireguard/server_private.key
willserver@dev-wire:~$ sudo chmod 600 /etc/wireguard/server_public.pub
willserver@dev-wire:~$ sudo ls -ln /etc/wireguard/
total 20
-rw------- 1 0 0  45 Mar 13 20:41 client_001.key
-rw------- 1 0 0  45 Mar 13 20:41 client_001.pub
-rw------- 1 0 0  45 Mar 13 20:11 server_private.key
-rw------- 1 0 0  45 Mar 13 20:13 server_public.pub

600なので、rootユーザのみRead/Writeが可能なパーミッションになりました。
以上でキー生成は完了です。

WireGuard設定ファイル作成

WireGuardのキー生成が完了したら、設定ファイルを作成していきます。
WireGuardの設定ファイルは、以下のパスに作成します。
作成ファイル名は任意ですが、起動する際に設定名が必要になるため、設定ファイル名は簡単なものにしておくなど、工夫をしておきます。
今回は、[wg0]という設定ファイルを作成します。

WireGuard設定ファイルパス
/etc/wireguard/(任意の設定名).conf

以下のコマンドを使用して設定ファイルを生成し、設定ファイルを書き込みます。

willserver@dev-wire:~$ sudo touch /etc/wireguard/wg0.conf
willserver@dev-wire:~$ sudo ls /etc/wireguard/
client_001.key  client_001.pub  server_private.key  server_public.pub  wg0.conf
willserver@dev-wire:~$ sudo cat /etc/wireguard/wg0.conf

<設定ファイル/wg0.conf>

#WireGuardサーバのインターフェース設定を行います。
[Interface]

PrivateKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

#1.サーバの秘密鍵を記載します。

Address = 192.168.100.174/32
#WireGuardをインストールしたサーバのIPアドレスを記載します。

DNS = xxx.xxx.xxx.xxx

#サーバのDNSサーバを指定します。

ListenPort = 51820
#WireGuardをインストールしたサーバのWireGuard受け待ちポートを
指定します。(デフォルトだと51820です。)

PostUp = echo 1 > /proc/sys/net/ipv4/ip_forward; iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o ens192 -j MASQUERADE
PostDown = echo 0 > /proc/sys/net/ipv4/ip_forward; iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o ens192 -j MASQUERADE
#ポートフォワードの設定を行います。
#強調表示の部分は、自身のWireGuardをインストールしたサーバのNICの名前を確認してください。
#[ip a]コマンドで確認可能です。

#WireGuardのピア(接続元)情報の設定をします。
[Peer]
PublicKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
#4.クライアントの公開鍵を記載します。

Endpoint = xxx.xxxx.xxxx.xxxx:51820

#接続元のゲートウェイIPまたはFQDNを指定します。
#大体の場合、グローバルIPになると思います。

AllowedIPs = 192.168.100.175/32
#接続元に払い出すIPを指定します。
#1つのピアに対し1IPを指定します。

設定が完了したらファイルを保存します。
なお、外部からVPNを使用してローカルネットワークにアクセスさせる場合、デフォルト設定の場合WireGuardをインストールしたサーバのIPに対し、51820/UDPでNAPTを行う必要があります。
また、個人でWireGuardを使用してポートの解放を行う場合、該当ポートへの通信ログを監視し、不正アクセスを受けても検知できるような仕組みを導入することをお薦めします。

ここら辺の知識や理解ができてない場合、基本的にWireGuardによるVPNを構築しないことを強くお勧めします。

ポートフォワード設定

WireGuardの設定ファイルの作成が終わったら、Ubuntu 22.04に対し、ポートフォワードの設定を行う必要があります。
ポートフォワードを行うことで、WireGuardからOS経由で内部のローカルネットワークへアクセスさせることができるようになります。

以下のコマンドを使用して、ポートフォワードの設定を行います。

willserver@dev-wire:~$ sudo vi /etc/sysctl.conf

#
# /etc/sysctl.conf - Configuration file for setting system variables
# See /etc/sysctl.d/ for additional system variables.
# See sysctl.conf (5) for information.
#

#kernel.domainname = example.com

# Uncomment the following to stop low-level messages on console
#kernel.printk = 3 4 1 3

###################################################################
# Functions previously found in netbase
#

# Uncomment the next two lines to enable Spoof protection (reverse-path filter)
# Turn on Source Address Verification in all interfaces to
# prevent some spoofing attacks
#net.ipv4.conf.default.rp_filter=1
#net.ipv4.conf.all.rp_filter=1

# Uncomment the next line to enable TCP/IP SYN cookies
# See http://lwn.net/Articles/277146/
# Note: This may impact IPv6 TCP sessions too
#net.ipv4.tcp_syncookies=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


###################################################################
# Additional settings - these settings can improve the network
# security of the host and prevent against some network attacks
# including spoofing attacks and man in the middle attacks through
# redirection. Some network environments, however, require that these
# settings are disabled so review and enable them as needed.
#
# Do not accept ICMP redirects (prevent MITM attacks)
#net.ipv4.conf.all.accept_redirects = 0
#net.ipv6.conf.all.accept_redirects = 0
# _or_
# Accept ICMP redirects only for gateways listed in our default
# gateway list (enabled by default)
# net.ipv4.conf.all.secure_redirects = 1
#
# Do not send ICMP redirects (we are not a router)
#net.ipv4.conf.all.send_redirects = 0
#
# Do not accept IP source route packets (we are not a router)
#net.ipv4.conf.all.accept_source_route = 0
#net.ipv6.conf.all.accept_source_route = 0
#
# Log Martian Packets
#net.ipv4.conf.all.log_martians = 1
#

###################################################################
# Magic system request Key
# 0=disable, 1=enable all, >1 bitmask of sysrq functions
# See https://www.kernel.org/doc/html/latest/admin-guide/sysrq.html
# for what other values do
#kernel.sysrq=438

sysctlの27行目付近にあるnet.ipv4.ip_forward=1のコメントアウトを外します。

以下のコマンドを使用して設定を再ロードします。

willserver@dev-wire:~$ sudo sysctl -p
net.ipv4.ip_forward = 1

変更した設定が表示されれば、設定の再ロードは完了です。

WireGuardの起動・停止

ここまで設定が完了したら、WireGurdを起動してみます。
起動する場合は、以下のコマンドを実行します。

willserver@dev-wire:~$ sudo wg-quick up wg0
[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -4 address add 192.168.100.174/32 dev wg0
[#] ip link set mtu 1420 up dev wg0
[#] resolvconf -a wg0 -m 0 -x
/usr/bin/wg-quick: line 32: resolvconf: command not found
[#] ip link delete dev wg0

wg0の部分は、設定名となり、設定ファイルの.confより前の部分を指定することで、その設定ファイルを読み込み、起動することができます。

初回起動時にエラーとなりました。
これは、resolvconfがWireGuardから見えていないことが原因らしく、再度シンボリックリンクを張ってあげることで解決します。

willserver@dev-wire:~$ sudo ln -s /usr/bin/resolvectl /usr/local/bin/resolvconf

resolvconfの設定が完了したら、再度起動します。

willserver@dev-wire:~$ sudo wg-quick up wg0
[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -4 address add 192.168.100.174/32 dev wg0
[#] ip link set mtu 1420 up dev wg0
[#] resolvconf -a wg0 -m 0 -x
[#] ip -4 route add 192.168.100.175/32 dev wg0
[#] echo 1 > /proc/sys/net/ipv4/ip_forward; iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o ens192 -j MASQUERADE

起動したら、起動確認をしてみます。

willserver@dev-wire:~$ sudo wg show
interface: wg0
  public key: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  private key: (hidden)
  listening port: 51820

peer: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  endpoint: xxx.xxx.xxx.xxx:51820
  allowed ips: 192.168.100.175/32

WireGuardが起動していると、wg showコマンドで起動状態を確認することができます。

起動の状態が確認できたら、WireGuradを停止してみます。

willserver@dev-wire:~$ sudo wg-quick down wg0
[#] ip link delete dev wg0
[#] resolvconf -d wg0 -f
[#] echo 0 > /proc/sys/net/ipv4/ip_forward; iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o ens192 -j MASQUERADE
willserver@dev-wire:~$

停止する場合は、起動時のupをdownに変えることで、停止することができます。
以上で、WireGuradの起動・停止は完了です。

WireGuardの自動起動設定

このままだとWireGurdをインストールしたサーバを再起動するたびに起動しなければならないので、自動起動の設定を入れていきたいと思います。

willserver@dev-wire:~$ sudo systemctl enable --now wg-quick@wg0
willserver@dev-wire:~$

通常のsystemctlコマンドにWireGurd用のオプションを指定してあげます。
@のあとについては、起動時に読み込む設定ファイルを指定してあげます。
今回の場合であれば、wg0という設定ファイルを使用しているので、wg0を指定しています。

設定が完了したら、OSを再起動して、WireGuradが自動起動しているか確認してみてください。
以上で、WireGurdの自動起動設定は完了です。

コマンド一覧

ファイルの生成だったり、アクセス権の設定だったりが面倒な方のためにコピペで生成できるように一カ所にコマンドをまとめてみました。

sudo apt update -y
sudo apt install wireguard -y
wg genkey | sudo tee /etc/wireguard/server_private.key
wg genkey | sudo tee /etc/wireguard/server_public.pub
wg genkey | sudo tee /etc/wireguard/client_001.key
wg genkey | sudo tee /etc/wireguard/client_001.pub
sudo chmod 600 /etc/wireguard/client_001.key
sudo chmod 600 /etc/wireguard/client_001.pub
sudo chmod 600 /etc/wireguard/server_private.key
sudo chmod 600 /etc/wireguard/server_public.pub

sudo cat <<EOL >> /etc/wireguard/wg1.conf

#WireGuardサーバのインターフェース設定を行います。
[Interface]
PrivateKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

#1.サーバの秘密鍵を記載します。

Address = xxx.xxx.xxx.xxx/32
#WireGuardをインストールしたサーバのIPアドレスを記載します。

DNS = xxx.xxx.xxx.xxx

#サーバのDNSサーバを指定します。

ListenPort = 51820
#WireGuardをインストールしたサーバのWireGuard受け待ちポートを
指定します。(デフォルトだと51820です。)

PostUp = echo 1 > /proc/sys/net/ipv4/ip_forward; iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o ens192 -j MASQUERADE
PostDown = echo 0 > /proc/sys/net/ipv4/ip_forward; iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o ens192 -j MASQUERADE
#ポートフォワードの設定を行います。
#強調表示の部分は、自身のWireGuardをインストールしたサーバのNICの名前を確認してください。
#[ip a]コマンドで確認可能です。

#WireGuardのピア(接続元)情報の設定をします。
[Peer]
PublicKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
#4.クライアントの公開鍵を記載します。

Endpoint = xxx.xxxx.xxxx.xxxx:51820

#接続元のゲートウェイIPまたはFQDNを指定します。
#大体の場合、グローバルIPになると思います。

AllowedIPs = xxx.xxx.xxx.xxx/32
#接続元に払い出すIPを指定します。
#1つのピアに対し1IPを指定します。

EOL



sudo sed -i s/#net.ipv4.ip_forward=1/net.ipv4.ip_forward=1/g /etc/sysctl.conf
sudo sysctl -p
sudo ln -s /usr/bin/resolvectl /usr/local/bin/resolvconf
sudo wg-quick up wg0
sudo wg show
sudo systemctl enable --now wg-quick@wg0

まとめ

今回は、Ubuntu 22.04 ServerにVPNソフトウェアであるWireGurdをインストールしてみました。
WireGurd自体は、コマンド一発でインストールすることができますが、設定の癖が強く、設定のパラメータの読み解きに時間がかかりました。
しかし、一度設定してしまえば、ほぼ構成を変えることはないので、比較的簡単だと思いました。
注意点としては、WireGurdの設定を間違えて起動すると、SSHの接続ができなくなるので、その点は注意が必要になります。
Hyper-Vや仮想環境だとコンソール画面が表示できるので、コンソール画面からWireGurdのサービスを落としてあげればSSH接続は復活するので焦る必要はないのですが、これがAWS上だと結構めんどくさいなーと思いました。
次回以降は、AndroidやiOS、Windows OSなどにWireGuardクライアントを導入してVPNの接続テストが可能か確認してみたいと思います。

おまけ

本ブログではVMwareやWindows、Linuxのインストール手順等も公開しております。
インフラエンジニアとして有益な記事や無益なコンテンツも作成しておりますので、通勤時間や休憩時間、休日のスキマ時間等に合わせて読んでいただけると幸いです。
また、Youtubeで解説動画も鋭意作成中です。本ブログで記事にしているものも動画にしようと思っておりますので、よろしくお願いいたします。
willserverのnoteも開設したのでフォローお願いします。

コメント

タイトルとURLをコピーしました