RockyLinux9にWireGuardを導入する
- 2024.01.18
- ツール
- RockyLinux9, VPN, 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
-
前の記事
PHP7.4で「Uncaught Error: Class ‘ZipArchive’ not found」を対処した話 2023.10.16
-
次の記事
RaspberryPiにRaspberryPi OSをインストールする 2024.02.23