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を参照してください。

サーバー上

  1. 次の変更で/etc/sysctl.confファイルを編集します:

    net.ipv4.ip_forward = 1
  2. sysctlコマンドを実行して、/etc/sysctl.confファイルを再度読み込みます。

    sudo sysctl -p

    statを実行できないコマンドに関して表示されるエラー・メッセージは無視できます。

  3. WireGuardキー・ペアを格納できるディレクトリを作成します。次に例を示します。

    mkdir ~/.wireguard
    cd ~/.wireguard
    umask 077
  4. 作成したディレクトリで、WireGuard暗号化キー・ペアを生成します。

    サーバーの秘密キーと公開キーを格納するファイルの任意の優先名を指定できます。

    wg genkey | tee privatekey | wg pubkey > publickey
  5. サーバーの秘密キーと公開キーを取得し、一時ストレージに格納します。

    cat ~/.wireguard/privatekey
    cat ~/.wireguard/publickey

クライアント上

  1. WireGuardキー・ペアを格納できるディレクトリを作成します。次に例を示します。

    mkdir ~/.wireguard
    cd ~/.wireguard
    umask 077
  2. 作成したディレクトリで、WireGuard暗号化キー・ペアを生成します。

    クライアントの秘密キーと公開キーを含めるファイルには任意の優先名を指定できます。

    wg genkey | tee privatekey | wg pubkey > publickey
  3. クライアントの秘密キーと公開キーを取得し、一時ストレージに格納します。

    cat ~/.wireguard/privatekey
    cat ~/.wireguard/publickey
  4. /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

サーバー上

  1. /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トンネルの有効化

  1. サーバーでトンネルを起動します。

    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
  2. サーバー内のトンネルのステータスを確認します。

    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
  3. 別の端末ウィンドウで、コンソール接続を使用してクライアントにログインします。

    この時点から、すべてのネットワーク・トラフィックがトンネルを介してルーティングされます。SSHを介してクライアントにログインし、コマンドを発行してトンネルを開始すると、その接続は失われます。クライアントに再接続できるのは、コンソール接続を介してのみです。

  4. クライアントでトンネルを開始します。

    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
  5. クライアントのステータスを確認します。

    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 ship 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

WireGuardトンネルの停止

WireGuardトンネルを停止するには、サーバーとクライアントの両方で次のコマンドを入力します。

wg-quick down wireguard-interface

停止後、必要に応じてwgip addrip linkなど、このドキュメントの他の場所で提供されているコマンドのいずれかを使用して、トンネル・ステータスを確認できます。