RockyLinux9にWireGuardを導入する

RockyLinux9にWireGuardを導入する

WireGuardの公式ドキュメントに従って導入していきます。

公式ドキュメントを参考にされる方は以下に進んでください。

https://www.wireguard.com/quickstart/


リポジトリをインストールする

# dnf install epel-release

WireGuardをインストールする

WireGuardのインストールでは、RHEL9からはカーネルにWireGuardが組み込まれているため、kmod-wireguardは不要です。

# dnf install wireguard-tools

WireGuard用の公開鍵を作成する

WireGuard には、base64 でエンコードされた公開キーと秘密キーが必要とのこと。

wgコマンドを使用して以下のファイルを作成していきます。
/etc/wireguard/privatekey
/etc/wireguard/publickey

まずは、ディレクトリを移動。

# cd /etc/wireguard/

秘密鍵の作成

# umask 077
# wg genkey > privatekey

公開鍵の作成

# wg pubkey < privatekey > publickey

WireGuardのNICを作る

wg0のNICを作成する為、以下のファイルを作成する。
WireGuardの設定ファイルは、「⁠/etc/wireguard/作成するインターフェイス名.conf」という名前で作成する必要があるので、/etc/wireguard/wg0.confで作成します。

先ず、/etc/wireguard/privatekeyの中身を取得しておきます。

# cat /etc/wireguard/privatekey
XXXXXXXXXXvy6EWKX88DyRuiXabmMvCKdXXXXXX5FU=

PrivateKeyには、/etc/wireguard/privatekeyの内容を記載し、Addressにはクライアントとサーバーで被らないIP CIDRのIPを持たせる。ここでは、192.168.2.0/24の192.168.2.1/32をwg0に持たせる設定を行う。

# vi /etc/wireguard/wg0.conf
[Interface]
PrivateKey = /etc/wireguard/privatekeyの内容を記載する(XXXXXXXXXXvy6EWKX88DyRuiXabmMvCKdXXXXXX5FU=)
Address = 192.168.2.1/32 (サーバーのインターフェイスに割り当てるIPアドレス)
ListenPort = 51820

作成したwg0.confを使い、UPを試す。

# systemctl start wg-quick@wg0

サーバー再起動しても立ち上がるように設定する。

# systemctl enable wg-quick@wg0

※起動したり、エラーが出た場合、statusコマンドで確認する

# systemctl status wg-quick@wg0

クライアント側

クライアント側でも準備を行います。
今回はWindows11をクライアントとして設定します。

https://www.wireguard.com/install/ からWindows用のパッケージを取得します。

ダウンロードしたファイル(wireguard-installer.exe)を起動し、インストールを行った後WireGuardのクライアントが起動します。

左下の「トンネルを作成」の「▼」から、「空のトンネルを追加」をクリックします。

トンネルの新規作成ウィンドウが開くので、以下のように設定していきます。

名前:わかりやすい名前を付けてください
公開鍵:後の手順でサーバー側に設定するので控えておいてください(後で確認もできます)
入力欄:以下の画像のように設定してください。
・[Interface]にAddressを追加。値はクライアントのトンネルIP。(ここでは、192.168.2.2/32とします)
・[Peer]セクションを追加
・[Peer]セクションにPublicKeyを追加し。値はWireGuardサーバーの/etc/wireguard/publickey の値を設定
・[Peer]セクションにAllowedIPsを追加。値はトンネルIPとクライアントのローカルIP CIDRを設定(例えば、PCからすべての通信をWireGuardサーバーを経由したい場合は、0.0.0.0/0を追加します)
・[Peer]セクションにEndpointを追加。値は、WireGuardサーバーのグローバルIPまたはホスト名とポート番号を割り当て
[Peer]セクションにPersistentKeepalivを追加。値はとりあえずデフォルトと同じ25秒を設定

公開鍵と秘密鍵がランダムで生成されるので保存を押してクライアントの設定を作成します。

クライアントで生成された公開鍵の値をコピーして後の手順でWireGuardサーバー側に設定をします。(6qEuNB3fIA/fHu06pA/vXWFnB07wWAqqRSODpcKuJXs=)。

WireGuardサーバー側

クライアントの公開鍵を/etc/wireguard/wg0.conf に追加設定します。
[Peer]セクションを追加し、PublicKeyにクライアント側の公開鍵を設定します。
AllowedIPsには、クライアントの接続IPアドレスを設定します。ここでは、クライアント側は「192.168.2.2」として割り当てることとします。

# vi /etc/wireguard/wg0.conf
[Peer]
PublicKey = 6qEuNB3fIA/fHu06pA/vXWFnB07wWAqqRSODpcKuJXs=
AllowedIPs = 192.168.2.2/32

設定を反映させます。

# systemctl restart wg-quick@wg0

次に、WireGuardサーバーでIPフォワーディング設定を入れます。

まず、firewalldのアクティブゾーンを取得。

# firewall-cmd --get-active-zone
public
  interfaces: eth0

ネットワークインターフェースを確認
eth0とwg0が起動していることがわかる。

# ip a
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: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000
    link/ether 06:1a:c4:54:f6:6f brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname ens5
    inet 172.31.0.184/20 brd 172.31.15.255 scope global dynamic noprefixroute eth0
       valid_lft 2859sec preferred_lft 2859sec
    inet6 2600:1f1c:d00:4400:bcf8:f5e8:42ea:3dde/128 scope global dynamic noprefixroute 
       valid_lft 433sec preferred_lft 123sec
    inet6 fe80::41a:c4ff:fe54:f66f/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
5: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 8921 qdisc noqueue state UNKNOWN group default qlen 1000
    link/none 
    inet 192.168.2.1/32 scope global wg0
       valid_lft forever preferred_lft forever

WireGuardサーバーの起動時と停止時に任意のコマンドを実行できるため、firewalldの設定を行うように設定します。
[interface]セクションの末尾に以下を追加します。

# vi /etc/wireguard/wg0.conf
PostUp = firewall-cmd --zone=public --add-masquerade; firewall-cmd --direct --add-rule ipv4 filter FORWARD 0 -i wg0 -o eth0 -j ACCEPT; firewall-cmd --direct --add-rule ipv4 nat POSTROUTING 0 -o eth0 -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 eth0 -j ACCEPT; firewall-cmd --direct --remove-rule ipv4 nat POSTROUTING 0 -o eth0 -j MASQUERADE; firewall-cmd --remove-port=51820/udp

サービスを再起動して反映します。

# systemctl restart wg-quick@wg0 

firewalldの設定が反映されていることを確認します。

# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources: 
  services: cockpit dhcpv6-client ssh
  ports: 51820/udp
  protocols: 
  forward: yes
  masquerade: yes
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules:
# firewall-cmd --direct --get-all-rules
ipv4 filter FORWARD 0 -i wg0 -o eth0 -j ACCEPT
ipv4 nat POSTROUTING 0 -o eth0 -j MASQUERADE