自宅のNASやWebサーバーを外部に公開したくてネットワーク変更したらパケットが溢れて通信できなくなってましたが、なんとか解決しました。
前回の記事
目次
そもそも何をしようとしたのか
やりたかったのは自宅のNAS(Synology DS923+)とWebサーバーとして使っているRaspberry Pi 5を外部からアクセスできるようにすることです。
以前使っていたNURO光の回線ではルーターにポート転送などの設定をして、特定の通信をNASに飛ぶようにすれば普通に使えていたのですが、現在、私が使っている楽天ひかりはIPv4 over IPv6の方式に「Ds-Lite(Dual-Stack Lite)」というものが使われており、仕組み上そもそもポート開放が出来ません(プロバイダ側でポート制御されていて手が出せない)。
この場合、自宅のルーターの設定を変更してPPPoEというレガシーな接続設定に変えるとポート開放も出来るのですが、インターネットの通信速度が低下してしまいます(IPv4 over IPv6の方が速い!)。
そこで外部からアクセスする機器はPPPoEを、他の機器はIPv4 over IPv6(IPoE)をそれぞれ併用できる環境を作ろう!というのが、そもそもの発端です。
IPoEとPPPoEを併用する
環境はこちらの記事を元に構築しました(ありがとうございます!)。
疲労コンパイル: v6プラスとIPv4(PPPoE)を併用する(その1) (dotsukareta.blogspot.com)
簡単に言うと、自宅のネットワークにルーターを追加してそこからPPPoEで接続する経路を作って、外部からアクセスしたい機器のデフォルトゲートウェイ(ネットワーク外に出て行く出口)に追加したルーターを指定する…という感じです。
元々はこんなネットワークだったのを…

こんな風にしました。

新しくTP-LinkのAX1800というルーターを購入してNew Router
のところにはそれが配置されています。
Router
のLAN側のポートと New Router
のWAN側のポートをLANケーブルで繋いでいます。さらに New Router
のLAN側と Router
のLAN側のポートもLANケーブルで繋いでいます。
Router
にPPPoEパススルーの設定をし、New Router
はPPPoEでインターネットに接続する設定をした。
New Router
はIP固定で192.168.1.100のようにし、NASやRaspberry PiはDHCP使わずにIP固定にしてデフォルトゲートウェイにNew Router
のIPを指定して、これらの機器がインターネット側と通信するときは New Router
経由になるようにしました。
前述の記事にあるようにNew Router
のDHCPはオフにしIPv6パススルーは無効にしないとネットワーク繋がらなくなるのでこれも設定。
TP-LinkのルーターにはRaspberry Piに向けてのポート転送も設定しました。SynologyのNASはUPnPで自動的にルーターのポート開放するので設定不要でした。

そしてネットワークが死んだ
これで外からNASやうちのサイトにもアクセスできたのでオッケーと思っていたのも束の間、しばらくすると自宅のSwitchBotがアクセス不能になり、アレクサも、そしてRaspberry PiもNASも全部不通に。さらにはTCLのテレビまで突然再起動したりしはじめました、やべえ。
スイッチングハブをみると猛烈な勢いで通信ランプが点滅。これはおかしい。
試しに新しく追加したルーターの電源を切ったり、LANケーブルを抜くと点滅が落ち着く。
デスクトップPCにWireSharkというソフトを入れて通信の状況を見てみました(通常は問題のある箇所に挟み込むような形でPCを接続しないとわからないが、今回は自宅のネットワーク全体怪しかったので、そのままやってみた)。
するとSSDPという通信が大量に発生していることがわかった。
↓こんなのが大量に流れている。
643175 354.891449 192.168.1.10 239.255.255.250 SSDP 143 M-SEARCH * HTTP/1.1
詳しく見てみるとIPはEcho Show(アレクサ)でMACアドレスは今回追加したTP-Linkのルーターになっていた。
IGMPプロキシを止めたら解決
SSDPというのは実態はUDPのパケットで、UDPは動画配信なんかでも使われている技術。一斉にいろんなクライアントにデータ送るときなんかに使われる。
UDPはIGMPという仕組みを使ってデータの送り先を決めようになっている。ルーターからクエリというのがPC等に届いて、PCからはこの通信は受け取りたいんで俺にも送ってというのをルーターに返す。ルーターはその情報を元にどのUDPパケットをどの機器に送るか管理してるわけです。
で、通常はUDPはルーターを超えて通信を送らないのだけど、IGMPプロキシを使うと親のルーターからのクエリを受け取って転送されるようになります。
転送…怪しいと言うことでNew Router
のIGMPプロキシ
をオフ。

すると、UDPパケットの氾濫は収まりネットワークも正常に!
(IGMPスヌーピングはむしろ無駄な通信を減らしてくれそうなので現在はオンにして使っている)
原因の推測
ここからは予想交えてなんだけど…

Router
からLANに繋がっている各機器に対してクエリを送ってるはずで、New Router
にも送られているはず。IGMPプロキシがONだとLAN側に再度New Routerがクエリを投げ直すと思われる。
そうするとそれを受け取ったRouter
はNew Router
のWAN側にまたクエリを送ってしまって、それを受けたNew Router
がクエリをLAN側に投げて…みたいなのを繰り返して無限増殖してしまっているのではなかろうかと推測した。
一応、IGMPプロキシをオフにして問題は解決したけど、最終的にはこのような構成にしています。

ONUの後にスイッチをおいて外からのPPPoEの通信は Router
を通過しないようにした(PPPoEパススルーの設定も外した)。
試してないけど、この構成だとIGMPプロキシをオンにしていても問題にならないかもしれない。これだとIGMPのクエリはRouter
止まりでNew Router
のWAN側に来ないはずなので、ループは起きないと思われる。
NASだけ外に見せたい場合はもっとシンプルにできる
ちなみにNASだけを外に見せたい場合は、こんなルーター追加は不要ということもお伝えしておきます。
NASの機能によるけどNAS自体にPPPoEの設定が出来る機種があります。私が使っているSynology DS932+も設定ありました。そうするとNAS自身が直接インターネットに晒された状態になるので外部からNASにアクセスできるようになります。
ネットワークは難しい
結局、一週間ぐらいこの件でハマってた気がします。
ゴールデンウィーク中、結局こればかりやってた(汗)
おかげでなんとか問題は解決できたし、ノウハウも得られたし、目的であったNASを外からアクセスするというのが出来たので良かったですけどね。