質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

1回答

807閲覧

Windows 10上のRubyでmDNSのレコードが取得できない。

raccy

総合スコア21735

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

1グッド

0クリップ

投稿2018/12/31 14:10

前提・実現したいこと

富士通製電子ペーパーFMV-DPP02を管理するライブラリを作成しています。ネットワーク上で機器を探索するにはmDNSでtcp/dp_fujitsuサービスを検索する必要があり、そのコードをRubyで書いています。

mDNS検索にRuby標準添付のresolvライブラリにあるResolv::MDNSを使っているのですが、Windows 10(以下、Win10)およびWin10のWindows Subsystem for Linux(以下、WSL)上ではうまく検索できません。対して、仮想上のCentOSでは同じコードでレコードを取得可能であり、なぜ、Win10上では動作しないのかがわかりません。

発生している問題・エラーメッセージ

Win10上では、タイムアウトまで何も検索できず、結果は空になります。CentOS上ではレコードが取得できています。

該当のソースコード

Ruby

1# frozen_string_literal: true 2 3require 'resolv' 4require 'pp' 5 6mdns = Resolv::MDNS.new 7mdns.timeouts = 60 8list = mdns.getresources('_dp_fujitsu._tcp.local.', 9 Resolv::DNS::Resource::IN::PTR) 10pp 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と通信できるように「外部」仮想スイッチを作成し、紐付けています。

obabachan👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

【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してみることをお勧めしておきます。

投稿2019/02/02 21:35

編集2019/02/09 23:51
raccy

総合スコア21735

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問