ユーザ用ツール

Wire Guard

概要

様々な実装のあるVPNのなかで比較的後発のもの。 実装サイズは小さく軽量高速であるとされている。 Ubuntuのパッケージもあり、デスクトップにも統合されるので、導入が簡単である。

クライアントとして、Windows, Android, iOSなどもサポートされている。

nanoKVMは、Tailscaleに対応しており、独自にVPNを用意せずとも、外部からアクセス可能だが、正直、とても遅い。 また頻繁に切断される。 何か、問題があった時用のラインだと思って納得していたが、WireGuardでVPNを構築した場合、外部からWindows11のデスクトップにアクセスしても十分に使えるレベルでありしかも安定している。 WireGuardは非常に強力なリモートアクセスツールとして利用可能である。

設定

サーバをLinux(Ubuntu)に乗せて、外部から、Windows, Android, Ubuntuで接続する想定で説明する。 家庭内のLANは 192.168.1.0/24で構成されており、VPNは 192.168.10.0/24で構成されるものとする。 LAN内のDNSは192.168.1.1に、Wire Guardのサーバは192.168.10.1を持ち、192.168.1.2で動作しているものとする。

サーバ

インストール

パッケージがあるのでそれをインストールすればよい。 パッケージにはサーバ、クライアントの別はなく、どちらであってもwireguardをインストールする。

$ sudo apt install -y wireguard

設定

最初に行うべきは鍵の生成である。 鍵はwgコマンドで生成する。 鍵は画面に表示されるだけだが、ファイルに保存しておいた方が後々便利なのでそのようにする。

$ sudo wg genkey | sudo tee /etc/wireguard/server.key
$ sudo cat /etc/wireguard/server.key | wg pubkey | sudo tee /etc/wireguard/server.pub
$ sudo chmod 600 /etc/wireguard/server.{key,pub}

別にどこに保存してもいいですが、ばらけるとめんどくさいのでとりあえず/etc/wireguard に置きます。 一応中身を見られないように600にしておきます。

VPNから別のネットワークにアクセスするにはIPフォワーディングを有効化する必要があります。 /etc/sysctl.conf の中にある net.ipv4.ip_forward=1の行のコメントマークを削除しておきます。

# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1

即座に有効化するには以下のコマンドを発行します。

$ sudo sysctl -p

次に、設定ファイルを作りますが、これはVPNのインターフェイスごとに作ります。 仮に wg0 がインターフェイスだとしたら、/etc/wireguard/wg0.conf というファイルになります。 これも600で作成します。

wg0.conf
[Interface]
Address = 192.168.10.1/24
SaveConfig = true
PostUp = iptables -A INPUT -i wg0 -j ACCEPT; iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D INPUT -i wg0 -j ACCEPT; iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
ListenPort = 51800
PrivateKey = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX=
 
[Peer]
PublicKey = YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY=
AllowedIPs = 192.168.10.2/32
 
[Peer]
PublicKey = ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ=
AllowedIPs = 192.168.10.3/32
 
[Peer]
PublicKey = UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU=
AllowedIPs = 192.168.10.4/32
 
[Peer]
PublicKey = WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW=
AllowedIPs = 192.168.10.5/32

Peerは接続してくるクライアントごとに持たせることができる。 DHCP機能はないので、IPはここで設定されたものが渡される。1) クライアント側で生成されたPublicKeyに従って割り当てが行われる。 -o eth0 の部分は実際に動かすサーバのネットワークインターフェイスと置き換える必要がある。

外部に対して、192.168.1.2:51800/UDP を公開して、サービスを起動すればVPN接続を待ち受ける。

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

注意

サーバ側の wg0.conf を書き換えるときは、必ず適切な方法で行うこと。 基本的には wg は設定ファイルを読み込んで動作を開始し、終了時点で自分が持っている設定を wg0.confに書き出して終わるので、ただ単純にファイルを書き換えても反映されないし、終了時に設定がすべて消えてしまいます。

一番確実なのは wg-quick down wg0 して、落としてから wg0.confを修正し、wg-quick up wg0することです。

ほかにもwg setconf や wg addconf などのコマンドでも可能(なはず)ですので、ゆめゆめ wg0.conf を直接書き換えて、終わった終わったと油断しないように。2)

きちんと設定が反映されてないと、クライアントは接続は確立するものの、LAN内に到達できない状態になるので、大体ネットワークがおかしな状態になって終了となるのですぐにわかるとは思いますが、外からテストして、つながらなかったりすると、修正するためにまた帰ってこないといけなくなるやもしれないので要注意です。

クライアント

Linux (Ubuntu)

サーバと同じく wireguard パッケージをインストールする。

$ sudo apt install -y wireguard

設定も鍵を作って、/etc/wireguard/wg0.confを作成するところまでは同じである。

$ sudo wg genkey | sudo tee /etc/wireguard/client.key
$ sudo cat /etc/wireguard/client.key | wg pubkey | sudo tee /etc/wireguard/client.pub
$ sudo chmod 600 /etc/wireguard/client.{key,pub}
wg0.conf
[Interface]
PrivateKey = yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy=
Address = 192.168.10.2/24
DNS = 192.168.1.1
 
[Peer]
PublicKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
EndPoint = vpn.example.com:51800
AllowedIPs = 192.168.10.0/24, 192.168.1.0/24

上の例では、LAN内へのトラフィックだけをVPNへ流すようにしていますが、AllowedIPs = 0.0.0.0/0 とすればすべてのトラフィックをVPN経由とします。

デスクトップ版を使っている場合はタスクバーに統合されているウィジェットから起動することもできますが、手動で起動する場合には、コマンドラインから以下のようにします。

$ sudo wg-quick up wg0

停止は次のようになります。

$ sudo wg-quick down wg0
自動起動

NetworkManagerの機能を利用して、自宅のSSID以外のものに接続したら自動的にVPNを起動させることが可能です。 /etc/NetworkManager/dispatcher.d/99-wg0-autostart というスクリプトを実行権限をつけて作成します。

99-wg0-autostart
#!/bin/bash
IFACE=$1
STATUS=$2
 
case "$STATUS" in
  up)
    SSID=$(nmcli -t -f active,ssid dev wifi|grep '^yes'|cut -d: -f2)
    case "$SSID" in
      myhomewifi*)
        # no need to start VPN
        wg-quick down wg0
        ;;
      *)
        wg-quick up wg0
        ;;
    esac
    ;;
  down)
    wg-quick down wg0
    ;;
esac

自宅のアクセスポイントが myhomewifi* であると仮定しています。 ここを実際の自宅のWiFiのSSIDに置き換えれば機能します。

Windows

クライアントを公式サイトからダウンロードしてインストールします。

Android

クライアントをGoogle Playからダウンロードしてインストールします。

メモ

鍵の転送

設定ファイルには、鍵を書込む必要があるが、当然鍵をネットワーク越しに渡すのは注意が必要である。 秘密鍵は外部に出さないように注意すること。 公開鍵だけがわかったところで簡単にはクラックされないが両方そろうとそれは問題である。

1)
とはいえ、DHCPで新しいデバイスをばかばかつなぐような性質のものではないので、これでいいと思われる。DHCPでアドレスを静的割り当てする設定と大差ないので実用上問題はないと思う。
2)
何度かそれでうまくつながらなくなってはまったらしい。

This website uses cookies. By using the website, you agree with storing cookies on your computer. Also, you acknowledge that you have read and understand our Privacy Policy. If you do not agree, please leave the website.

More information