WireGuard でRasberry Pi 4B にVPN の環境を構築してみました。
OpenVPN よりもシンプルらしいです。
今後、管理用のGUIツールが充実していくと良いですね。

環境

VPN サーバ

  • Raspberry Pi 4B
  • Ubuntu Server Focal 20.04 aarch64
  • wireguard 1.0.20200121
  • qrencode 4.0.2-2

ネットワーク

ホスト WireGuard LAN
VPN サーバ 10.0.0.1/24 192.168.11.107/24
VPN クライアント1 10.0.0.2/24
VPN クライアント2 10.0.0.3/24
LAN ホスト 192.128.11.2/24
LAN ホスト 192.128.11.106/24

構築

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

$ sudo apt install wireguard qrencode

秘密鍵と公開鍵の生成

  1. VPN サーバ用
    $ mkdir wgkeys; cd wgkeys
    $ wg genkey | tee server_privatekey | wg pubkey > server_publickey
  2. VPN クライアント1用
    $ wg genkey | tee client1_privatekey | wg pubkey > client1_publickey
  3. VPN クライアント2用 (オプション)
    $ wg genkey | tee client2_privatekey | wg pubkey > client2_publickey

設定ファイル

  1. VPN サーバ設定ファイル
    /etc/wireguard/wg0.conf
    [Interface]
    Address = 10.0.0.1/24
    SaveConfig = true
    ListenPort = 51820
    PrivateKey = <サーバの秘密鍵>

    PostUp = iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE; ip6tables -A FORWARD -o %i -j ACCEPT; ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
    PostDown = iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE; ip6tables -D FORWARD -o %i -j ACCEPT; ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

    [Peer]
    PublicKey = <クライアント1の公開鍵>
    AllowedIPs = 10.0.0.2/32

    [Peer]
    PublicKey = <クライアント2の公開鍵>
    AllowedIPs = 10.0.0.3/32
  2. VPN Client1 の設定ファイル
    wg0_client1.conf
    [Interface]
    Address = 10.0.0.2/24
    PrivateKey = <クライアント1の秘密鍵>
    DNS = 10.0.0.1

    [Peer]
    PublicKey = <サーバの公開鍵>
    AllowedIPs = 0.0.0.0/0
    Endpoint = <サーバのFQDNまたはIPアドレス>:51820
  3. VPN Client2 の設定ファイル (オプション)
    wg0_client2.conf
    [Interface]
    Address = 10.0.0.3/24
    PrivateKey = <クライアント2の秘密鍵>
    DNS = 10.0.0.1

    [Peer]
    PublicKey = <サーバの公開鍵>
    AllowedIPs = 0.0.0.0/0
    Endpoint = <サーバのFQDNまたはIPアドレス>:51820

IPv4 ポートフォワーディングの設定

$ sudo sysctl net.ipv4.ip_forward=1

ファイアウォールの設定

$ sudo ufw allow 51820/udp

ルータの設定

  • インターネットからサーバへの通信 51820/udp をサーバへ通過させます

VPN クライアント設定ファイルをクライアントへ転送

以下のどちらかで転送します。

  • ファイルを転送する方法
  • QRコードをカメラから撮影する方法
    $ qrencode -t ansiutf8 < wg0_client1.conf

実行

  • 起動

    $ sudo wg-quick up wg0
  • 状態の確認

    $ sudo wg
  • 停止

    $ sudo wg-quick down wg0
  • 自動起動

    $ sudo systemctl enable wg-quick@wg0

利用

  • アンドロイドからの利用
    wireguard アプリで接続する。
  • 接続状態の表示
    $ sudo wg
    interface: wg0
    public key: <サーバの公開鍵>
    private key: (hidden)
    listening port: 51820

    peer: <クライアント1の公開鍵>
    endpoint: <接続元IP:ポート番号>
    allowed ips: 10.0.0.2/32
    latest handshake: 24 seconds ago
    transfer: 2.50 KiB received, 2.84 KiB sent

    peer: <クライアント2の公開鍵>
    allowed ips: 10.0.0.3/32