Open7

RockyLinux9にWireGuardを導入してさくらVPSと接続する

MailleinMaillein

ローカル側の環境

$ cat /etc/redhat-release
Rocky Linux release 9.6 (Blue Onyx)

さくらVPS側の環境

$ cat /etc/redhat-release
Rocky Linux release 9.6 (Blue Onyx)

さくらVPSは仮想2Core/1GB メモリーのインスタンスを契約。
初期セットアップはここを参考に実施。

MailleinMaillein

まずはVPS側から設定。
WireGuardをインストール

$ sudo dnf install -y epel-release
$ sudo dnf install -y wireguard-tools

インストールが完了したか確認

$ sudo wg --version
wireguard-tools v1.0.20210914 - https://git.zx2c4.com/wireguard-tools/

インストール後、サーバー用のキーペアを作成する。
以下のコマンドで一気に秘密鍵を作成。

$ wg genkey | sudo tee /etc/wireguard/server.key
<サーバー側秘密鍵が出力される>
$ sudo chmod 600 /etc/wireguard/server.key

次に秘密鍵から公開鍵を作成

$ sudo cat /etc/wireguard/server.key | wg pubkey | sudo tee /etc/wireguard/server.pub
<サーバー側公開鍵が出力される>
$ sudo chmod 600 /etc/wireguard/server.pub
MailleinMaillein

クライアント側でもVPS側と同様にインストール~キーペア作成を実施

$ sudo dnf install -y epel-release
$ sudo dnf install -y wireguard-tools
$ wg genkey | sudo tee /etc/wireguard/client.key
$ sudo chmod 600 /etc/wireguard/client.key
$ sudo cat /etc/wireguard/client.key | wg pubkey | sudo tee /etc/wireguard/client.pub
$ sudo chmod 600 /etc/wireguard/client.pub
MailleinMaillein

再びVPS側に戻り、WireGuardの設定ファイルを作成する。
今回はインターフェース名をwg0とした。
また、WireGuard用のネットワークに10.0.0.0/24を割り当てた。
VPS側に10.0.0.1、クライアント側に10.0.0.2を割り当てている。

/etc/wireguard/wg0.confというファイルを作成し、以下のように編集する。

/etc/wireguard/wg0.conf
[Interface]
PrivateKey = 作成したVPSの秘密鍵
Address = 10.0.0.1
ListenPort = 51820

[Peer]
PublicKey = 作成したクライアントの公開鍵
AllowedIPs = 10.0.0.2/32

同様に、クライアント側にもWireGuardの設定ファイルを作成する。
VPSのIPアドレスはVPSに割り当てられているグローバルなIPv4アドレスを指定する。

/etc/wiregurad/wg0.conf
[Interface]
PrivateKey = クライアントの秘密鍵
Address = 10.0.0.2

[Peer]
PublicKey = VPSの公開鍵
EndPoint = VPSのIPアドレス:51820
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25
MailleinMaillein

VPS上で、WireGuardのサービスを有効化する。
--nowオプションをつけると有効化と起動が同時にできるのでお得。

$ sudo systemctl enable --now wg-quick@wg0

ipコマンドでインターフェースが作成できていることを確認。

$ ip a
(...省略...)
5: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
    link/none
    inet 10.0.0.1/32 scope global wg0
       valid_lft forever preferred_lft forever

続いてファイアーウォールの設定を行う。
先ほど設定ファイルで51820番のポートを使って通信するように設定したため、そのポートを開放する。

$ sudo firewall-cmd --permanent --add-port=51820/udp
$ sudo firewall-cmd --reload

以下のコマンドでポートの解放を確認。

$ sudo firewall-cmd --list-ports
(...略...) 51820/udp

VPS側で51820番をパケットフィルタリングしないように設定する必要があると思ったが、さくらのVPSではTCP/UDP 32768-65535番ポートはもともと空いている様子。
ほかのVPSサービスを使用している場合はUDP 51820を開放する。

MailleinMaillein

クライアント側から接続を行う。以下のコマンドでVPNの接続を確立する。

$ sudo wg-quick up wg0
[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -4 address add 10.0.0.2 dev wg0
[#] ip link set mtu 1420 up dev wg0
[#] wg set wg0 fwmark 51820
[#] ip -6 route add ::/0 dev wg0 table 51820
[#] ip -6 rule add not fwmark 51820 table 51820
[#] ip -6 rule add table main suppress_prefixlength 0
[#] nft -f /dev/fd/63
[#] ip -4 route add 0.0.0.0/0 dev wg0 table 51820
[#] ip -4 rule add not fwmark 51820 table 51820
[#] ip -4 rule add table main suppress_prefixlength 0
[#] sysctl -q net.ipv4.conf.all.src_valid_mark=1
[#] nft -f /dev/fd/63

クライアント側にもipコマンドでインターフェースが作成できていることを確認。

$ ip a
(...略...)
7: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
    link/none
    inet 10.0.0.2/32 scope global wg0
       valid_lft forever preferred_lft forever

VPN接続が確立されていることをwgコマンドで確認。
ハンドシェイクが成功し、データの送受信が発生していれば成功。

$ sudo wg
interface: wg0
  public key: (サーバーの公開鍵)
  private key: (hidden)
  listening port: 37072
  fwmark: 0xca6c

peer: (クライアントの公開鍵)
  endpoint: (VPSのIPアドレス):51820
  allowed ips: 0.0.0.0/0, ::/0
  latest handshake: 1 second ago
  transfer: 92 B received, 504 B sent
  persistent keepalive: every 25 seconds
MailleinMaillein

外部からVPSを経由してクライアントへSSH接続できるようにする。
クライアント側の/etc/wireguard/wg0.confを編集する。[Interface]セクションに以下を追記。

/etc/wireguard/wg0.conf
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT;iptables -A FORWARD -o wg0 -j ACCEPT;
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT;iptables -D FORWARD -o wg0 -j ACCEPT;

また、VPS側の/etc/wireguard/wg0.confを編集し、SSH通信をポートフォワードする。[Interface]セクションに以下を追記。また、AllowIPsにクライアントのローカルIPを追記。

/etc/wireguard/wg0.conf
[Interface]
(...略...)
PostUp = iptables -t nat -A PREROUTING -p tcp --dport 22 -j DNAT --to-destination 192.168.0.232:22; iptables -A FORWARD -p tcp -d 192.168.0.232 --dport 22 -j ACCEPT
PostDown = iptables -t nat -D PREROUTING -p tcp --dport 22 -j DNAT --to-destination 192.168.0.232:22; iptables -D FORWARD -p tcp -d 192.168.0.232 --dport 22 -j ACCEPT

[Peer]
(...略...)
AllowedIPs = 10.0.0.2/32, 192.168.0.0/24