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)として動作させるためには、以下の設定を忘れないように。