第2章 WireGuardを使用したVPNの構成
WireGuardは、シンプルで高速な、最新の暗号化の実装によってセキュアなVPN設定を作成できるクロス・プラットフォーム・テクノロジです。
WireGuardは、Unbreakable Enterprise Kernelリリース6更新3以降でサポートされています。 この章のステップに進む前に、使用しているシステムがこのリリースにアップグレードされていることを確認してください。 詳細は、「Unbreakable Enterprise Kernel: Unbreakable Enterprise Kernelリリース6更新3のリリース・ノート」を参照してください。
2.1 WireGuardのインストール
WireGuardを使用してVPNを構成するには、次のコマンドを使用してパッケージをダウンロードします:
sudo dnf install -y wireguard-tools
サーバーとそのすべてのクライアントにWireGuardをインストールする必要があります。
2.2 WireGuardの構成
簡略化のために、次のセクションでは、例として2つのホストを使用してWireGuardをデプロイする方法について説明します。 一方のホストはVPNサーバーとして機能し、もう一方のホストはクライアントです。
WireGuardを使用するには、次の要件が必要です:
-
両方のホストのIPアドレス。 この情報を取得するには、ip addr shコマンドを使用します。 後続の手順では、サーバーとクライアントのIPアドレスはそれぞれ10.0.0.1および10.0.0.2です
-
両方のホストのWireGuardインタフェースに割り当てられるプライベートIPアドレス。 後続の手順では、サーバーとクライアントのプライベートIPアドレスはそれぞれ192.168.2.1および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コマンドを実行します。
2.3 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
2.4 WireGuardトンネルのテスト
クライアントで、pingコマンドを使用してWireGuardサーバーとの通信を確認します。次に例を示します:
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
2.5 WireGuardトンネルの停止
WireGuardトンネルを停止するには、サーバーおよびクライアントの両方で次のコマンドを入力します。
wg-quick down wireguard-interface
停止後に、以前に提供されていたコマンドのいずれかを使用して、トンネルのステータスをオプションでチェックできます: wg、ip addrまたはip link。