web-dev-qa-db-ja.com

mDNSクエリをWSLサブネットからWindowsホストサブネットに再ルーティングする

Heya仲間のコーダー/開発者/ネットワーカー/開発者/ ...

WSL2(Windows 10 2004バージョン)のコンテキストでmDNS/DNS-SDの設定に問題があります

自宅にメインサーバーとRaspberry Piを備えた非常にシンプルなセットアップがあり、DNSサービス検出をアクティブにして、Raspberry Pi上のサーバーの自動検出を簡単に実行できるようにしたいと考えています。

dnssd のような単純なライブラリを使用するか、適切なデータを自分でブロードキャストすることで、WSL2を使用しない場合でも簡単に機能させることができます。ただし、WSL2で機能させる必要があるため、状況が複雑になります。

WSL2は独自のサブネットで実行されているため、ブロードキャストは機能しなくなります。サブネットでのmDNSの使用は、このサブネットでのみ機能します。ただし、WindowsはすでにホストとWSL間のブロードキャストトラフィックの一部を再ルーティングしています。

これは簡単にテストできます。サーバーから単純なPingを実行して、mDNSに依存するPiのAvahiアドレスを機能させます。

enter image description here

画面の左側には、Wiresharkによってキャプチャされたトラフィックがホストネットワークインターフェースで表示され、右側には、WiresharkによってキャプチャされたトラフィックがWSLネットワークインターフェースで表示されます。最初の3行は単純なpingです。これはWSLのコンテキストで実行されますが、ここに表示されるIPアドレス-172.28.192.1-はWSLクライアントのIPアドレスではなく、内部のIPアドレスですWSLのDNSサーバー。右側に表示されているように、WindowsホストのIPアドレスを使用して、ホスト上で完全に再ルーティングされます:192.168.0.39

ただし、スクリプトによって実行される2番目のクエリにはWSLソースIP(172.28.204.42)があり、これはホスト上で再ルーティングされません。

私のネットワークに関する知識は非常に限られており、これがどのように機能するか、またホスト上でWSLが自分のmDNSクエリをルーティングする方法を理解できません。ワイルドな推測は、それがiptablesに関係しているということですが、それは私が行っている限りです。

誰かがDNSサーバーの送信元アドレスで機能する理由の手がかりがあり、私が自分で実行するときではない場合、それは非常に役立ちます!

編集1:WSLルートテーブル enter image description here

4
Sisyphe

WSL2 Hyper-Vネットワークスイッチは、マルチキャストブリッジとして機能しません。デフォルトでは、スイッチは内部ネットワークを作成します。マルチキャストパケットは、内部ネットワークに接続されているシステムにのみ配信され、それ以外のシステムには配信されません。 Hyper-Vネットワークタイプの詳細については、 このNakivoブログ投稿 を参照してください。

最初のケースでは、pingは、リゾルバー(Windowsホスト)に送信される通常のDNSルックアップをトリガーします。次にWindowsホストは、外部ネットワークと内部ネットワークの両方でmDNSルックアップを実行します。パケットダンプには内部ルックアップが表示されますが、何も応答しないことに注意してください。応答は外部ネットワーク経由で送信され、pingは通常のDNS経由で応答を取得します。 2番目のケースでは、mDNSルックアップのみを実行します。その検索は内部ネットワークのみに送信されるため、応答はありません。 mDNSルックアップが内部ネットワークで機能することを証明するために、Windowsホストのローカルアドレス(MACHINE.local)をルックアップします。 Windowsホストが内部ネットワーク上にあり、応答できるため、これは機能します。

良いニュースは、WSLネットワークタイプを変更できることです。

  1. Windowsキーを押して、「Hyper-V Manager」と入力します
  2. アプリを右クリックして、「管理者として実行」を選択します
  3. マネージャーで、「Hyper-Vマネージャー」からマシンを見つけてクリックします
  4. [Actions]領域で、[Virtual Switch Manager ...]をクリックします。
  5. WSLスイッチを見つけてクリックします
  6. 接続タイプを「外部ネットワーク」に変更します
  7. OKをクリックします

Hyper-V Manager Screenshot

これを実行した後、WSLを再起動します。

> wsl --shutdown
> wsl -t <distribution-name>
> wsl --distribution <distribution-name>

再起動すると、ゲストのネットワークが切断されます。 IPアドレスを追加し、ip addr addおよびip routeまたは同様のものを使用して外部ネットワークからルーティングする必要があります。ディストリビューションは、起動するたびにデフォルトのWSLスイッチ用にネットワークをセットアップしようとするので、将来、この外部ネットワークアドレスを追加するための構成をセットアップする必要があるかもしれません。たとえば、Ubuntu 20.04は、スイッチの構成に関係なく、常に内部ネットワークに動的アドレスを追加します。

ネットワークスイッチのタイプを変更すると、同じ理由でWSL2(Docker Desktopなど)の他の使用が中断される可能性があります。 Windowsは再起動するたびにHyper-Vネットワークスイッチを再作成するため、システムが稼働している間だけ変更が持続します。

1
hrunting