Ubuntu 20.04 を Wireguard サーバー(ゲートウェイ)にする

Ubuntu 20.04をWireguard サーバーにし、さらにGWとして使えるように設定する。IPv6は設定しない。

OSの設定をする

ルーティングしてもらうために /etc/sysctl.conf の以下の行のコメントを外す。

net.ipv4.ip_forward=1

Wireguardをインストールする

$ sudo apt update
$ sudo apt install -y wiregaurd
$ sudo reboot

Wireguardを設定する

Wireguardの設定は、wg-quickでOS起動/停止時に有効化/無効化する方針で。

鍵ペアを作る (/etc/wireguard/{privatekey,publickey})。

$ sudo sh -c 'cd /etc/wireguard; wg genkey | tee privatekey | wg pubkey > publickey'
$ sudo chmod 600 /etc/wireguard/privatekey

wg-quick 用の設定ファイルを作成する。 xxx.conf の xxx がWireguardのインターフェース名として使われる。ここでは wg0 を使う。PrivateKeyには作成した privatekey の内容を転記する。IPアドレスやポート番号は適当に。PostUp/PreDownの第1引数 %i はWireguardのインターフェース名に置換される。第2引数は listen port、第3引数は wireguard用のセグメントを指定する。PeerにIPを手動で割り当てるのちょっとめんどい。

$ sudo vi /etc/wireguard/wg0.conf
[Interface]
SaveConfig = false
Address = 10.0.1.1/24
ListenPort = 47474
PrivateKey = xxxxxx
PostUp = /etc/wireguard/postup.sh %i 47474 10.0.1.0/24
PreDown = /etc/wireguard/predown.sh %i 47474 10.0.1.0/24

[Peer] # hogehoge PC
PublicKey = abcabc
AllowedIPs = 10.0.1.2/32

[Peer] # fugafuga PC
PublicKey = xyzxyz
AllowedIPs = 10.0.1.3/32

下はPeer側の設定例。PeerのPeerはサーバー。AllowedIPsを 0.0.0.0/0 としデフォルトゲートウェイをWireguardサーバーに向ける。ロケーションによってDNSレスポンスが変わる事もあるらしいので、Wireguardサーバーに近いDNSサーバーを使いたい場合は指定する。

[Interface]
PrivateKey = zzzzzz
Address = 10.0.1.2/32
DNS = xx.xx.xx.xx

[Peer]
PublicKey = abcabc
AllowedIPs = 0.0.0.0/0
Endpoint = xx.xx.xx.xx:47474

$ sudo chmod 600 /etc/wireguard/wg0.conf

wireguardを有効/無効にするときにfirewallの設定を追加/削除したいので、 postup.sh/predown.sh に書いておく。ポートを開く他に、FORWARDチェインの設定(ufw route allow ...) とIPマスカレードの設定(iptables -t nat ...)が必須。

[/etc/wireguard/postup.sh]
WG_IF=$1
PORT=$2
TUN_SEG=$3
GW_IF=$(ip -j route list default | python3 -c 'import sys,json; print(json.load(sys.stdin)[0]["dev"])')

ufw allow in on $GW_IF to any port $PORT proto udp
ufw allow in on $WG_IF
ufw route allow in on $WG_IF -s $TUN_SEG out on $GW_IF
iptables -t nat -I POSTROUTING -o $GW_IF -s $TUN_SEG -j MASQUERADE
ufw status verbose
[/etc/wireguard/predown.sh]
WG_IF=$1
PORT=$2
TUN_SEG=$3
GW_IF=$(ip -j route list default | python3 -c 'import sys,json; print(json.load(sys.stdin)[0]["dev"])')

ufw delete allow in on $GW_IF to any port $PORT proto udp
ufw delete allow in on $WG_IF
ufw route delete allow in on $WG_IF -s $TUN_SEG out on $GW_IF
iptables -t nat -D POSTROUTING -o $GW_IF -s $TUN_SEG -j MASQUERADE
ufw status verbose
$ sudo chmod 755 /etc/wireguard/post{up,down}.sh

Wireguardを有効化する

$ sudo systemctl enable --now wg-quick@wg0.service

Wireguard、他の状態を確認する

$ systemctl status wg-quick@wg0.service
$ journalctl -u wg-quick@wg0.service
$ sudo wg show wg0

ついでに他の設定も確認する

$ sudo ufw status verbose
$ sudo iptables -t nat -nvL
$ sudo sysctl -a | grep ip_forward

補足

上では混ぜて書いているが、Wireguardの設定の他に、Linuxルーター(GW)として動作させるためには、以下の設定を忘れないように。