WireGuard 10.0.0.1/24から10.6.0.1/24に変えた理由

数年前にWireguardのアドレス帯を10.0.0.1/24から10.6.0.1/24に変えた理由をご紹介します。特に天地を揺るがすような理由があったというわけではなく、「ただ単に競合した」という話です。しかしながら当時右も左も分からなかった自分にとっては難しかったのです。

状況

当時は、Dockerでいくつかのサービスをコンテナ運用できるようになった頃で、次はWireGuardを使って開放ポートだらけの自宅とサーバーをWireGuardで繋ぎサーバーを受付け役になってもらい、家のポートは閉じてしまおうと考えていました。

早速構築が完了し、クライアントから接続すると接続は完了している(ようにも見える)にもかかわらず、どうも通信ができない。PINGが通らない..。もちろんSSHも通りません。よく分からないのが一番嫌なやつです。

疑ったことと原因

色々疑いました。

サーバーがVPS非対応?
ポートが空いていない?
設定ファイルの書き方ミス?
(UDPだから)何かよからぬ力で通信のほとんどが経路に抜け落ち?

答えはもっと単純でした。「別ソフトとの競合」でした。

ip aをしたところ、10.0.0.xが二つあるではありませんか。1つはWireguard、もう1つは習得したばかりのDocker。
Docker側のアドレスを変えても良かったのですが、なんとなく面倒だったのでWireguardの方を変えることにしました。

[Interface]
Address = 10.0.0.1/24 →Address = 10.6.0.1/24 
ListenPort = <WG_PORT>
PrivateKey = <SERVER_PRIVATE_KEY>

[Peer]
PublicKey = <PEER_PUBLIC_KEY>
AllowedIPs = <PEER_WG_IP>/32

クライアント側・サーバー側それぞれの設定で、[Interface] の Address には 10.6.0.0/24 のサブネット内に属するホストアドレスを指定します。
具体的には、サーバーは 10.6.0.1/24、クライアントは 10.6.0.2/24 のように、同一サブネット内で重複しないアドレスを割り当てます。


差し替えが完了したらサーバ側でwg-quick down && wg-quick upを実行し、Wireguardの再起動をかけます。
これで、WireGuard が利用するVPN内のアドレス帯(サブネット)を 10.0.0.1/24 から 10.6.0.1/24 へ移せます。

考察

WireGuard のハンドシェイクは UDPで接続なので相手(エンドポイント)に到達できるかが主眼です。
一方、ping 10.x.x.xssh 10.x.x.x は トンネル内(wg0 に載せる)L3 ルーティングが正しく成立している必要があります。
つまり UDP到達性がOKでも、ローカルOSのルーティングが壊れていれば通信が混線することで詰まってしまうという現象が起きると考えられます。

まとめ

「とりあえず10.0.0.0/24でいいだろう」と決めたのが今回の遠回りの原因でした。WireGuardは正しく動いていたのに、ネットワーク設計でつまずいていたわけです。
この一件で、ネットワーク上での「競合」という言葉を覚えました。レベルアップです。

最近はwireguardでマスクをかけたり、拠点間繋いだり上手に扱えるようになってきています。高速でセキュアなWireguard、上手に使っていきたいと思います。