質問: mdns.getresources('_dp_fujitsu._tcp.local.', Resolv::DNS::Resource::IN::PTR) pp list ``` ### 試したこと Windowsのファイアウォールの受信ルールでWin10上およびWSL上のRubyはプログラム指定で任意の通信を許可しています。送信はブロックしないに設定しています。指定しているプログラムを除けば、メーカー製の正式アプリ(mDNSで検索して接続している)と同じルールです。 ファイアウォールを完全無効にしたとき、一度だけ取得できたときがありましたが、その後再現はしませんでした。なぜ、一度だけ成功できたのか理由はわかりません。 ### 補足情報(FW/ツールのバージョンなど) 【問題が起きる環境】 OS: Windows 10 Pro 1809 Ruby: ruby 2.5.3p105 (2018-10-18 revision 65156) [x64-mingw32] (Ruby Installer) OS: Ubuntu 18.04LTS (Windows Subsystem for Linux、上記のWin10上) Ruby: ruby 2.6.0p0 (2018-12-25 revision 66547) [x86_64-linux] (rbenv installより) ファイアウォールはWindows標準のファイアウォールです。他にセキュリティソフトウェアはインストールしていません。 【正常な環境】 OS: CentOS 7 (Vagrant + Hyper-V) Ruby: ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-linux] (SCL rh-ruby25パッケージ) ※ ネットワークは直接LANと通信できるように「外部」仮想スイッチを作成し、紐付けています。
回答: 【2019年2月10日更新】 現象が再発したので、再度調査したところ、原因と回避策がわかりました。 原因: 複数のネットワークへの接続により複数のIPアドレスを持つ状態だと、mDNSのマルチキャストパケットが飛ばない。 回避策: ターゲットがあるネットワークに接続するNIC以外は無効にし、ネットワークを一つにする。 私の環境ではHyper-Vをインストールしていたため、仮想マシンNAT用の"vEthernet (Default Switch)"が常に有効であり、実質二つのネットワークに常に接続されている状態でした。"vEthernet (Default Switch)"を無効にしたところ、mDNSのマルチキャストパケットが流れて、無事名前解決が出来ました。 駄目なときは`dig @224.0.0.251 _dp_fujitsu._tcp.local. ptr -p 5353`でも駄目なのですが、元々の管理アプリはmDNSでの検索が出来ており、違いを調べたところ、次のようになっていました。 * Rubyのresolvおよびdig: 受け取りポートを"0.0.0.0"および"[::]"でバインド => 複数ネットでNG * 管理アプリ: 受け取りポートをインターフェースのIPアドレスでバインド => 複数ネットでもOK "0.0.0.0"と"[::]"は全てのインターフェースのIPアドレスを表しますが、候補になるIPアドレスが複数ある場合は、マルチキャストをどのインターフェースから送れば良いのかわからなくなるのか、パケット送信がされません(Wiresharkでパケットキャプチャして確認)。この動作は、Windows 10のバグなのか、仕様なのかまではわかりませんが、避けた方が良いと思われます。 通常の環境ではネットワークは一つだけなので問題ないことが多いでしょうが、開発環境は仮想環境用にHyper-VやVirtualBoxを入れている場合が多く、仮想マシンNAT用ネットワークが常に有効というのも多いと思います。そのような環境の方は気をつけていただければと思います。 (下記は最初の古い内容です) 本日、再度試して見たところ、問題なく取得できました。問題が発生していたときから、ファイアウォール等に大きな変更はしていません。もしかしたら、ファイアーウォール周りに何らかのバグがあって、Windows Updateでなおったのでは無いのかと思っています。 ひとまず、正常に動作するようになったので、クローズしたいと思います。もし、同じような現象が発生している方は、一度Windows Updateしてみることをお勧めしておきます。