拠点間通信としてのWireguardを有効化するとインターネットに繋がらなくなるときの対処法(デフォルトルートが上書きされる)

Posted on Oct 13, 2022

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なり何なりで再起動して変更を適用しましょう。