2 WireGuardを使用したVPNの構成
WireGuardはクロスプラットフォーム・テクノロジであり、最新の暗号化の実装により、シンプルで高速かつセキュアなVPN設定を作成できます。
ノート:
WireGuardは、Unbreakable Enterprise Kernelリリース6更新3以降でサポートされています。この章のステップに進む前に、システムがこのリリース以上にアップグレードされていることを確認します。詳細は、Unbreakable Enterprise Kernelリリース6更新3: リリース・ノート(5.4.17-2136)を参照してください。
WireGuardのインストール
WireGuardを使用してVPNを構成するには、次のコマンドを使用してパッケージをダウンロードします。
sudo dnf install -y wireguard-tools
サーバーとそのすべてのクライアントにWireGuardをインストールする必要があります。
WireGuardの構成
簡単にするために、次の各項では、例として2つのホストを使用してWireGuardをデプロイする方法について説明します。一方のホストはVPNサーバーとして機能し、もう一方はクライアントです。
WireGuardを使用するには、次の要件が必要です。
-
両方のホストのIPアドレス。この情報を取得するには、
ip addr sh
コマンドを使用します。後続の手順では、サーバーのIPアドレスは10.0.0.1で、クライアントのIPアドレスは10.0.0.2です。 -
両方のホストのWireGuardインタフェースに割り当てられるプライベートIPアドレス。後続の手順では、サーバーのプライベートIPアドレスは192.168.2.1で、クライアントのプライベートIPアドレスは192.168.2.2です。
-
WireGuardインタフェースの名前。後続の手順では、サーバーとクライアントの両方のWireguardインタフェース名は
wg0
です。 -
クライアントへのコンソール接続。
コンソール接続の設定手順は、このドキュメントの範囲外です。リモート接続にVNCサーバーを使用するには、https://docs.oracle.com/en/learn/install-vnc-oracle-linux/#introductionを参照してください。Oracle Cloud Infrastructureでインスタンスを使用している場合は、https://docs.oracle.com/iaas/Content/Compute/References/serialconsole.htm#Instance_Console_Connectionsを参照してください。
サーバー上
-
次の変更で
/etc/sysctl.conf
ファイルを編集します:net.ipv4.ip_forward = 1
-
sysctl
コマンドを実行して、/etc/sysctl.conf
ファイルを再度読み込みます。sudo sysctl -p
stat
を実行できないコマンドに関して表示されるエラー・メッセージは無視できます。 -
WireGuardキー・ペアを格納できるディレクトリを作成します。次に例を示します。
mkdir ~/.wireguard cd ~/.wireguard umask 077
-
作成したディレクトリで、WireGuard暗号化キー・ペアを生成します。
サーバーの秘密キーと公開キーを格納するファイルの任意の優先名を指定できます。
wg genkey | tee privatekey | wg pubkey > publickey
-
サーバーの秘密キーと公開キーを取得し、一時ストレージに格納します。
cat ~/.wireguard/privatekey cat ~/.wireguard/publickey
クライアント上
-
WireGuardキー・ペアを格納できるディレクトリを作成します。次に例を示します。
mkdir ~/.wireguard cd ~/.wireguard umask 077
-
作成したディレクトリで、WireGuard暗号化キー・ペアを生成します。
クライアントの秘密キーと公開キーを含めるファイルには任意の優先名を指定できます。
wg genkey | tee privatekey | wg pubkey > publickey
-
クライアントの秘密キーと公開キーを取得し、一時ストレージに格納します。
cat ~/.wireguard/privatekey cat ~/.wireguard/publickey
-
/etc/wireguard/wg0.conf
ファイルを編集して、次のようにします:[Interface] Address = 192.168.2.2/24 SaveConfig = true ListenPort = 60477 PrivateKey = client's private key [Peer] PublicKey = server's public key AllowedIPs = 0.0.0.0/0, ::/0 Endpoint = 10.0.0.1:51820
サーバー上
-
/etc/wireguard/wg0.conf
ファイルを編集して、次のようにします:[Interface] Address = 192.168.2.1/24 SaveConfig = true PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eno1 -j MASQUERADE PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eno1 -j MASQUERADE ListenPort = 51820 PrivateKey = server's private key [Peer] PublicKey = client's public key AllowedIPs = 192.168.2.2/32 Endpoint = 10.0.0.2:60477
ノート:
例の
PostUp
およびPostDown
行で、サーバーのインタフェース名はeno1
です。同じ行にサーバーの正しいインタフェース名を指定してください。サーバーのIPインタフェースを表示するには、ip addr sh
コマンドを実行します。
WireGuardトンネルの有効化
-
サーバーでトンネルを起動します。
wg-quick up wg0
[#] ip link add wg0 type wireguard [#] wg setconf wg0 /dev/fd/63 [#] ip link set mtu 1420 up dev wg0 [#] ip -4 route add 192.168.2.2/32 dev wg0 [#] iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eno1 -j MASQUERADE; ip6tables -A FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -A POSTROUTING -o eno1 -j MASQUERADE
-
サーバー内のトンネルのステータスを確認します。
sudo wg
interface: wg0 public key: server's public key private key: (hidden) listening port: 51820 peer: client public's key endpoint: 10.0.0.2:60477 allowed ips: 192.168.2.2/32
-
別の端末ウィンドウで、コンソール接続を使用してクライアントにログインします。
この時点から、すべてのネットワーク・トラフィックがトンネルを介してルーティングされます。SSHを介してクライアントにログインし、コマンドを発行してトンネルを開始すると、その接続は失われます。クライアントに再接続できるのは、コンソール接続を介してのみです。
-
クライアントでトンネルを開始します。
wg-quick up wg0
[#] ip link add wg0 type wireguard [#] wg setconf wg0 /dev/fd/63 [#] ip -4 address add 192.168.2.2/24 dev wg0 [#] ip link set mtu 1420 up dev wg0 [#] 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 [#] ip6tables-restore -n [#] 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 [#] iptables-restore -n
-
クライアントのステータスを確認します。
sudo wg
interface: wg0 public key: client's public key private key: (hidden) listening port: 60477 fwmark: 0xca6c peer: server public's key endpoint: 10.0.0.1:51820 allowed ips: 0.0.0.0/0, ::/0
ip addr sh
やip link
など、他のコマンドを使用してトンネル情報を確認できます。次に例を示します。
ip addr sh
...
3: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 8920 qdisc noqueue state UNKNOWN group default
qlen 1000 link/none
inet 192.168.2.1/24 scope global wg0
valid_lft forever preferred_lft forever
ip link
...
3: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 8920 qdisc noqueue state UNKNOWN mode DEFAULT group
default qlen 1000 link/none
WireGuardトンネルのテスト
クライアントで、ping
コマンドを使用して、WireGuardサーバーとの通信を確認します。次に例を示します。
ping -c 3 192.168.2.1
ping -c 3 192.168.2.1
PING 192.168.2.1 (192.168.2.1) 56(84) bytes of data.
64 bytes from 192.168.2.1: icmp_seq=1 ttl=64 time=0.640 ms
64 bytes from 192.168.2.1: icmp_seq=2 ttl=64 time=0.707 ms
64 bytes from 192.168.2.1: icmp_seq=4 ttl=64 time=0.643 ms
--- 192.168.2.1 ping statistics ---
3 packets transmitted, 4 received, 0% packet loss, time 2088ms
rtt min/avg/max/mdev = 0.643/0.690/0.713/0.038 ms
同様に、wg
コマンドは、次の例に示されているように、WireGuardトンネルへの接続が確立されているかどうかを示します。
sudo wg
interface: wg0
public key: client's public key
private key: (hidden)
listening port: 60477
fwmark: 0xca6c
peer: server's public key
endpoint: 10.0.0.1:51820
allowed ips: 0.0.0.0/0, ::/0
latest handshake: 44 seconds ago
transfer: 28.22 KiB received, 48.64 KiB sent
handshake
およびtransfer
の出力は、トンネリングされた接続のトラフィックを示します。
サーバーとクライアント間の通信を確立できない場合は、WireGuardに設定されたポートへのアクセスをファイアウォールがブロックしていないか確認します。サーバーとクライアントの両方をリンクするポートを開く必要がある場合があります。たとえば、サーバー上で次のコマンドを入力します。
sudo firewall-cmd --add-port=51820/udp --permanent
sudo firewall-cmd --reload