はじめに

リモートで仕事する人が増えたと思いますが、VPN がないと何かと不便です。

Oracle Cloud で無料で構築できるのでメモを残しておきます。

VPN には WireGuard を使用します。とっても簡単。


今回使う環境

項目 内容
契約 Oracle Cloud Always Free (ずっと無料)
インスタンス VM.Standard.E2.1.Micro / OCPU 1 / RAM 1GB
OS Oracle Linux 8 (RHEL互換)
ミドルウェア WireGuard (Linux,Windows,Mac OSX,iOS,Android 対応)

CentOS 8 のサポート期間短縮に伴い、Oracle Linux 8 を使って建ててみます。


サーバーとクライアントの関係

WireGuad では、それぞれの秘密鍵を生成し、それぞれの設定ファイルにはお互いの公開鍵を書いていきます。

サーバー側の設定ファイル
  • サーバーの秘密鍵
  • クライアントの公開鍵(クライアントの秘密鍵から生成したもの)
クライアント側の設定ファイル
  • クライアントの秘密鍵
  • サーバーの公開鍵(サーバーの秘密鍵から生成したもの)

クライアントが複数の場合

クライアントが複数になる場合は、サーバー側の設定ファイルにクライアントの公開鍵をひたすら追加していきます。

サーバー


導入

# 利用できる EPEL リポジトリを確認する
[root@vm opc]# dnf repolist all | grep -i epel
ol8_developer_EPEL    Oracle Linux 8 EPEL Packages for Development (x86 disabled)

# EPEL を有効化してアップデートをかける(注意:ol8_developer_EPEL は Oracle Linux 8 専用です)
[root@vm opc]# dnf config-manager --enable ol8_developer_EPEL
[root@vm opc]# dnf update
...(省略)...
Complete!

# WireGuard をインストールする
[root@vm opc]# dnf install wireguard-tools

サーバー側の設定


設定ファイル

# サーバー側のプライベートキー(秘密鍵)を生成する
[root@vm opc]# wg genkey | tee /etc/wireguard/server.key
OJHeFvySvtcqllcIz+LgaZ+58JflkdPpWd3BmNyq1WM=

#サーバー側のパブリックキー(公開鍵)を生成する
[root@vm opc]# cat /etc/wireguard/server.key | wg pubkey | tee /etc/wireguard/server.pub
tKkp9E2sa8W0aX2I21bWaqG6lXJY+o6iftwWpLijoUc=

#インターフェースを確認する
[root@vm opc]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 02:00:17:00:19:db brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.5/24 brd 10.0.0.255 scope global dynamic ens3
       valid_lft 84446sec preferred_lft 84446sec
    inet6 fe80::17ff:fe00:19db/64 scope link 
       valid_lft forever preferred_lft forever

Firewall の設定を確認する

[root@vm opc]# firewall-cmd --get-active-zone
public
  interfaces: ens3

# WireGuard の設定ファイルを作る
[root@vm opc]# vi /etc/wireguard/wg0.conf

# /etc/wireguard/wg0.conf
[Interface]
PrivateKey = OJHeFvySvtcqllcIz+LgaZ+58JflkdPpWd3BmNyq1WM= 
Address = 10.10.10.1/24 
ListenPort = 51820 
MTU = 1380 
  
PostUp = firewall-cmd --zone=public --add-masquerade; firewall-cmd --direct --add-rule ipv4 filter FORWARD 0 -i wg0 -o ens3 -j ACCEPT; firewall-cmd --direct --add-rule ipv4 nat POSTROUTING 0 -o ens3 -j MASQUERADE; firewall-cmd --add-port=51820/udp 
PostDown = firewall-cmd --zone=public --remove-masquerade; firewall-cmd --direct --remove-rule ipv4 filter FORWARD 0 -i wg0 -o ens3 -j ACCEPT; firewall-cmd --direct --remove-rule ipv4 nat POSTROUTING 0 -o ens3 -j MASQUERADE; firewall-cmd --remove-port=51820/udp 
  
[Peer] 
PublicKey = 9wVHswghFDUnBm+erw8HZFBC3PvLuacdZLKlasaORg4=
AllowedIPs = 10.10.10.2/32
[Interface] 自身の設定(ここではサーバー)
PrivateKey サーバーの秘密鍵
Address VPN インターフェースの IP アドレス(ローカル IP アドレス)
ListenPort ポート番号
MTU パケットのサイズ(応答が無くなる場合は設定する)
PostUp WG 起動時に実行するコマンド(Firewall に穴を開ける、など)
PostDown WG 起動時に実行するコマンド(Firewall の穴をふさぐ、など)


[Peer] 相手の設定(ここではクライアント)
PublicKey クライアントの公開鍵
AllowedIPs VPN を経由させる対象 IP アドレスの範囲(CIDR)
基本的にはクライアントに割り当てるIPアドレスで良い

複数のクライアントを定義するには [Peer] をセクションを増やしていけばいいです。


起動

# 起動してサービスに登録
[root@vm opc]# systemctl enable --now wg-quick@wg0
Created symlink /etc/systemd/system/multi-user.target.wants/wg-quick@wg0.service → /usr/lib/systemd/system/wg-quick@.service.

# 穴が開いている確認します。
[root@vm opc]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 02:00:17:00:19:db brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.5/24 brd 10.0.0.255 scope global dynamic ens3
       valid_lft 83602sec preferred_lft 83602sec
    inet6 fe80::17ff:fe00:19db/64 scope link 
       valid_lft forever preferred_lft forever
3: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 8920 qdisc noqueue state UNKNOWN group default qlen 1000
    link/none 
    inet 10.10.10.1/32 scope global wg0
       valid_lft forever preferred_lft forever

インフラ側の準備

仮想ファイアウォールにも、51820番ポートで UDP 通信を許可するよう設定します。

※ 環境によって操作手順が異なります。


Oracle Cloud の場合はセキュリティーリストのイングレスルールに追加します。


クライアント


導入

Linuxであればサーバー側導入と同じ手順。

Windows,Android,OS X,iOSであれば公式および各ストアからダウンロードしてください。

設定ファイル

[Interface]
PrivateKey = ECR41Y/9tslY6TjTj33kzHWcTUsFj8DSaXN2jHp580A=
Address = 10.10.10.2/32
MTU = 1380
DNS = 8.8.8.8, 8.8.4.4

[Peer]
PublicKey = tKkp9E2sa8W0aX2I21bWaqG6lXJY+o6iftwWpLijoUc=
AllowedIPs = 10.10.10.1/24
Endpoint = <VpnServerIpAddress>:51820 PersistentKeepalive = 25
[Interface] 自身の設定(ここではクライアント)
PrivateKey クライアントの秘密鍵
Address VPN インターフェースの IP アドレス(ローカル IP アドレス)
MTU パケットのサイズ(応答が無くなる場合は設定する)
DNS DNS サーバーを指定(必要に応じて)


[Peer] 相手の設定(ここではサーバー)
PublicKey サーバーの公開鍵
Endpoint エンドポイント(サーバーのグローバル IP アドレスまたはFQDNと、ポート番号)
AllowedIPs VPN を経由させる対象 IP アドレスの範囲(CIDR)
0.0.0.0/0 ですべての宛先が経由する,内部だけであれば 10.10.10.1/24 でよい
PersistentKeepalive KeepAlive 送信間隔(秒)
勝手に切れてしまう場合は設定・調整すると良い


おわり。