Wire Guard
概要
様々な実装のあるVPNのなかで比較的後発のもの。 実装サイズは小さく軽量高速であるとされている。 Ubuntuのパッケージもあり、デスクトップにも統合されるので、導入が簡単である。
クライアントとして、Windows, Android, iOSなどもサポートされている。
設定
サーバを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で動作しているものとする。
サーバ
インストール
パッケージがあるのでそれをインストールすればよい。
$ 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
クライアント
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
Windows
クライアントを公式サイトからダウンロードしてインストールします。
Android
クライアントをGoogle Playからダウンロードしてインストールします。
メモ
鍵の転送
設定ファイルには、鍵を書込む必要があるが、当然鍵をネットワーク越しに渡すのは注意が必要である。 秘密鍵は外部に出さないように注意すること。 公開鍵だけがわかったところで簡単にはクラックされないが両方そろうとそれは問題である。
