インターネットへルーティングするWireGuardの設定(サーバ)

ALL
スポンサーリンク

VPNサーバWireGuardの設定です。
空港やカフェなどの公衆WiFiを使用する際に、セキュアに接続できるVPNサービスとして利用できるように、VPN接続でインターネットへルーティングする設定を説明します。
あまりインターネット側へルーティングする説明がネット上に無いので、本記事で説明します。
なお、クライアントの設定にも注意が必要ですが、クライアントの設定については、次回以降に説明します。

スポンサーリンク

ここで構築するVPN

・VPNサーバのVPN側アドレスは 10.8.0.1
・VPNクライアントのアドレスは 10.8.0.0/24(各クライアント側でアドレスを指定します)
・VPN接続後、クライアントの全ての通信は VPNサーバ経由で行われます。

必要パッケージのインストール

CentOS

yum install elrepo-release epel-release
yum install kmod-wireguard wireguard-tools

Ubuntu

apt install wireguard-tools

設定

鍵の作成

サーバ用秘密鍵、サーバ用公開鍵、クライアント用秘密鍵、クライアント用公開鍵を作成します。
次のコマンドを実行します。各コマンド実行で表示されるものが秘密鍵、公開鍵です。

なお、Ubuntuでは先だって umask 077 と実行します。これをしておかないと、以下の実行で、
Warning: writing to world accessible file.
Consider setting the umask to 077 and trying again.
と出ます。

  • サーバ用公開鍵
  • $ wg genkey | tee /etc/wireguard/server.key
    kLGJYDGzAnIzh8HvX9+K26IaFMcc9KZoLrZyVhkwuW4=
  • サーバ用公開鍵
  • $ cat /etc/wireguard/server.key | wg pubkey | tee /etc/wireguard/server.pub
    8QMumFHOxRtgIvW3aqgjcGT7fhdJkcpJMLGnih9+7gc=
  • クライアント用秘密鍵
  • $ wg genkey | tee /etc/wireguard/client.key
    yIODA7puoGq/qIAjfCXJsuL59EPhoPOhFbwqBjWqnkg=
  • クライアント用公開鍵
  • $ cat /etc/wireguard/client.key | wg pubkey | tee /etc/wireguard/client.pub
    zz2npxDRWAoN+8Y+OpQaWmKNp6qX5ZsjGIyhDR+QR2o=

    作成した秘密鍵は、所有者のみアクセスできるようにアクセス権を設定しておきます。

    chmod 600 /etc/wireguard/*.key

    設定ファイル wg0.conf の設定

    /etc/wireguard/wg0.conf を作成します。このファイル名 wg0 がVPNのネットワークデバイス名になります。
    別の名前にした場合は、以降のwg0の箇所を置き換えてください。
    サーバ用秘密鍵、クライアント用公開鍵は先の手順「鍵の作成」で表示された内容を記述します。

    [Interface]
    # サーバ用秘密鍵
    PrivateKey = kLGJYDGzAnIzh8HvX9+K26IaFMcc9KZoLrZyVhkwuW4=
    # サーバで使用するVPNアドレス
    Address = 10.8.0.1
    ListenPort = 51820
    
    # WireGuard起動・終了時に実行される内容
    # VPN外へルーティングするためのフォワーディングの設定。eth0は各環境に合わせる。
    PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;iptables -A FORWARD -o wg0 -j ACCEPT
    PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE;iptables -D FORWARD -o wg0 -j ACCEPT
    
    [Peer]
    # クライアント用公開鍵
    PublicKey = zz2npxDRWAoN+8Y+OpQaWmKNp6qX5ZsjGIyhDR+QR2o=
    # サーバと通信可能なVPNアドレス
    AllowedIPs = 10.8.0.0/24

    上記でeth0の箇所は、各環境に合わせて記述します。
    次のコマンドを実行すると、結果で一番右側にインタフェース名が表示されますので、これを記述します。
    例えば下記のようになった場合は、eth0の箇所は enp0s25 を記述します。

    $ route | grep default
    default         gateway         0.0.0.0         UG    100    0        0 enp0s25

    PostUp、PostDownの内容は、ここに書かずに別途iptablesの設定として書いてもいいのですが、Ubuntu(ufw)の場合はufwの設定と別ファイルの編集が必要で面倒です。
    なので、このように PostUp、PostDown の箇所に記述しています。

    ファイアウォール・パケットフォワーディング有効化の設定

    システムでパケットのフォワーディングを有効にします。
    /etc/sysctl.conf に次の行を追加します。

    net.ipv4.ip_forward=1

    設定を反映させます。

    sysctl -p

    ファイアウォールのルールを追加します。

    iptablesの場合。

    iptables -I INPUT -p udp --dport 51820 -j ACCEPT
    iptables -I INPUT -i wg0 -j ACCEPT
    iptables-save

    ufwの場合。

    ufw allow to any port 51820
    ufw allow in on wg0

    WireGuard自動機能の設定・確認

    WireGuard がサーバ起動時に自動起動するようにし、続けて WireGuard を起動させます。

    systemctl enable wg-quick@wg0
    systemctl start wg-quick@wg0

    動作確認します。
    次のように ip a と実行します。
    実行結果に、wg0 の内容があれば、動作OKです。

    # ip a
            :
            :
    3: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
        link/none
        inet 10.8.0.1/32 scope global wg0
           valid_lft forever preferred_lft forever

    注意

    wg0.conf の PostUp、PostDownに書いたiptablesのルールは、WireGuardの起動・終了時に実行されます。
    WireGuard起動後に iptablesサービスを再起動すると、 wg0.conf の PostUp で設定していたルールは消えてしまいます。
    この場合は、 PostUp の内容を手動で実行するか、systemctl restart wg-quick@wg0 実行で WireGuard を再起動してください。

    参考

    WireGuard サーバー Ubuntu Server 20.04 LTS へのインストールおよび設定方法 – インフラエンジニアのメモ帳
    Ubuntu 20.04 LTS : WireGuard : サーバーの設定 : Server World
    第614回 WireGuardでVPNサーバーを構築する:Ubuntu Weekly Recipe|gihyo.jp … 技術評論社

    コメント