Wireguardは素晴らしいソフトウェアですが一つだけ初見殺しな仕様があります。
前提条件
VPN経由でインターネットに接続したいのではなくあくまでもサーバー間の通信としてVPNを使用したい。
eth0 (インターネット ) eth0 (インターネット)
↕ ↕
サーバーA ← wg0 (vpn) wg0 → サーバーB
症状
- Wireguardを有効にするとインターネットに繋がらなくなる
- 無効化すると戻る
- ip routeでデフォルトルートを調べてもちゃんとeth0など本来のインターフェイスが設定されている
対処法
まずip route get 1.1.1.1を実行してみる。すると驚くべきことにip routeではeth0がデフォルトになっているのにwg0経由になっている。
suser@localhost:~> ip route
default via 192.168.0.1 dev eth0 proto dhcp [←ちゃんとeth0がデフォルトルートなのに]
10.0.0.0/24 dev wg0 proto kernel scope link src 10.0.0.2
192.168.0.0/24 dev eth0 proto kernel scope link src 192.168.0.200
suser@localhost:~> ip route get 1.1.1.1
1.1.1.1 dev wg0 table 51820 src 10.0.0.2 uid 1000 [←何故かwg0経由になっている]
cache
しかし対処法は簡単なのでご安心ください。
とりあえず簡単な対処方法
/etc/wireguard/wg0.conf
等の設定ファイルに Table = off
を追加するだけです。
[Interface]
Address = 10.0.0.2/24
ListenPort = ポート
PrivateKey = 秘密鍵
Table = off [←これを追加する]
[Peer]
PublicKey = 公開鍵
PresharedKey = 事前共有鍵(任意)
AllowedIPs = 0.0.0.0/0, ::/0
Endpoint = サーバーのIP:ポート
PersistentKeepAlive = 30
ちゃんとした対処方法
/etc/wireguard/wg0.conf
などの設定ファイルに何も考えずにAllowedIPs = 0.0.0.0/0, ::/0
と書いていることが根本的な原因です。AllowedIPs
で指定したCIDRの通信は自動的にwg0経由で行われます。
つまり拠点間通信として(この例では10.0.0.0/24
)Wireguardを使いたい場合はこうすれば解決します。
[Interface]
Address = 10.0.0.2/24
ListenPort = ポート
PrivateKey = 秘密鍵
[Peer]
PublicKey = 公開鍵
PresharedKey = 事前共有鍵(任意)
AllowedIPs = 10.0.0.0/24 [←これを修正する]
Endpoint = サーバーのIP:ポート
PersistentKeepAlive = 30
後はsudo systemctl restart wg-quick@wg0
なり何なりで再起動して変更を適用しましょう。