--- [article] uuid = "210673d0-c19e-4195-a280-968a0729dd41" title = "【備忘録】 個人用サーバに WireGuard を導入する" description = "個人用サービスのセルフホストに使っているサーバに WireGuard を導入する作業をしたメモ" tags = [ "note-to-self", "wireguard", ] [[article.revisions]] date = "2024-02-03" remark = "公開" [[article.revisions]] date = "2024-02-17" remark = "80 番ポートについて追記" --- {#intro} # はじめに 個人用サービスのセルフホストに使っているサーバに [WireGuard](https://www.wireguard.com/) を導入する作業をしたのでメモ。 登場するホストは以下のとおり: * サーバ (Ubuntu): `10.10.1.1` * クライアント 1 (Windows): `10.10.1.2` * クライアント 2 (Android): `10.10.1.3` 後ろの IP アドレスは VPN 内で使用するプライベート IP アドレス。 {#install-wireguard-server} # WireGuard のインストール: サーバ まずは個人用サービスをホストしている Ubuntu のサーバに WireGuard をインストールする。 ``` $ sudo apt install wireguard ``` 次に、WireGuard で使用する鍵を生成する。 ``` $ wg genkey | sudo tee /etc/wireguard/server.key | wg pubkey | sudo tee /etc/wireguard/server.pub $ sudo chmod 600 /etc/wireguard/server.{key,pub} ``` {#install-wireguard-client} # WireGuard のインストール: クライアント 公式サイトから各 OS 向けのクライアントソフトウェアを入手し、インストールする。次に、設定をおこなう。 ```ini # クライアント 1 の場合 [Interface] Address = 10.10.1.2/32 PrivateKey = <クライアント 1 の秘密鍵> [Peer] PublicKey = <サーバの公開鍵> AllowedIPs = <サーバの外部 IP アドレス>/32 Endpoint = <サーバの外部 IP アドレス>:51820 ``` ```ini # クライアント 2 の場合 [Interface] Address = 10.10.1.3/32 PrivateKey = <クライアント 2 の秘密鍵> [Peer] PublicKey = <サーバの公開鍵> AllowedIPs = <サーバの外部 IP アドレス>/32 Endpoint = <サーバの外部 IP アドレス>:51820 ``` `PrivateKey` や `PublicKey` は鍵ファイルのパスではなく中身を書くことに注意。 {#configure-wireguard} # WireGuard の設定 一度サーバへ戻り、WireGuard の設定ファイルを書く。 ``` $ sudo vim /etc/wireguard/wg0.conf ``` ```ini [Interface] Address = 10.10.1.1/32 SaveConfig = true PrivateKey = <サーバの秘密鍵> ListenPort = 51820 [Peer] PublicKey = <クライアント 1 の公開鍵> AllowedIPs = 10.10.1.2/32 [Peer] PublicKey = <クライアント 2 の公開鍵> AllowedIPs = 10.10.1.3/32 ``` 次に、WireGuard のサービスを起動する。 ``` $ sudo systemctl enable wg-quick@wg0 $ sudo systemctl start wg-quick@wg0 ``` {#configure-firewall} # ファイアウォールの設定 続けてファイアウォールを設定する。まずは WireGuard が使用する UDP のポートを開き、`wg0` を通る通信を許可する。 ``` $ sudo ufw allow 51820/udp $ sudo ufw allow in on wg0 $ sudo ufw allow out on wg0 ``` 次に、80 や 443 などの必要なポートについて、`wg0` を経由してのアクセスのみ許可する。 ``` $ sudo ufw allow in on wg0 to any port 80 proto tcp $ sudo ufw allow in on wg0 to any port 443 proto tcp ``` 最後に、`ufw` を有効にする。 ``` $ sudo ufw status $ sudo ufw enable ``` {#connect-each-other} # 接続する これで、各クライアントで VPN を有効にすると、当該サーバの 80 ポートや 443 ポートにアクセスできるようになったはずだ。念のため VPN を切った状態でアクセスできないことも確認しておくとよいだろう。 {#edit-80-port} # 追記: 80 番ポートについて Let's Encrypt でサーバの証明書を取得している場合、80 番ポートを空けておく必要がある。気づかないうちに証明書が切れないよう注意。