Windowsでグローバルブロードキャストアドレス(255.255.255.255)の動作を変更する方法


10

望ましい行動

アプリケーションがグローバルブロードキャストIPアドレス255.255.255.255にパケットを送信するとき、ff:ff:ff:ff:ff:ffすべてのインターフェイスで、パケットをイーサネットグローバルブロードキャストアドレス()に送信したいと思います。

Linuxおよびおそらく他のOSでも、これは動作するようです。Windows XPとWindows 7はこれに関して異なる動作を示し、どちらの動作も私の状況には望ましくありません。

Windows XPの動作

パケットは最初のネットワークインターフェイスに正しく送信されます(インターフェイスの順序は「ネットワーク接続/詳細設定/詳細設定」で指定されています)。他のインターフェースにも送信されます。

これまでのところすべてが正常です。問題は、他のインターフェイスに送信する場合、ブロードキャストパケットの送信元アドレスが最初のインターフェイスのIPアドレスであることです。たとえば、次のネットワーク構成を想像してください(順序は重要です)。

  • アダプター1:IPアドレス 192.168.0.1
  • アダプター2:IPアドレス 10.0.0.1
  • アダプター3:IPアドレス 172.17.0.1

ブロードキャストパケットを送信すると、次のパケットが送信されます(送信元IPアドレスと宛先IPアドレスが含まれます)。

  • アダプター1:192.168.0.1=>255.255.255.255
  • アダプター2:192.168.0.1=>255.255.255.255
  • アダプター3:192.168.0.1=>255.255.255.255

    実際には、ブロードキャストパケットを使用するアプリケーションは、アダプター1以外のインターフェイスでは動作しません。私の意見では、これはWindows XPのTCP / IPスタックの明らかなバグです。

Windows 7の動作

ネットワークインターフェイスの順序を変更しても、Windows 7には影響がないようです。代わりに、ブロードキャストはIPルートテーブルによって制御されているようです。

IPv4 Route Table
===========================================================================
Active Routes:
Network Destination        Netmask          Gateway       Interface  Metric
          0.0.0.0          0.0.0.0   10.202.254.254       10.202.1.2    286
          0.0.0.0          0.0.0.0      192.168.0.1      192.168.0.3     10
       10.202.0.0      255.255.0.0         On-link        10.202.1.2    286
       10.202.1.2  255.255.255.255         On-link        10.202.1.2    286
   10.202.255.255  255.255.255.255         On-link        10.202.1.2    286
        127.0.0.0        255.0.0.0         On-link         127.0.0.1    306
        127.0.0.1  255.255.255.255         On-link         127.0.0.1    306
  127.255.255.255  255.255.255.255         On-link         127.0.0.1    306
      192.168.0.0    255.255.255.0         On-link       192.168.0.3    266
      192.168.0.3  255.255.255.255         On-link       192.168.0.3    266
    192.168.0.255  255.255.255.255         On-link       192.168.0.3    266
        224.0.0.0        240.0.0.0         On-link         127.0.0.1    306
        224.0.0.0        240.0.0.0         On-link       192.168.0.3    266
        224.0.0.0        240.0.0.0         On-link        10.202.1.2    286
  255.255.255.255  255.255.255.255         On-link         127.0.0.1    306
  255.255.255.255  255.255.255.255         On-link       192.168.0.3    266
  255.255.255.255  255.255.255.255         On-link        10.202.1.2    286
===========================================================================

参照255.255.255.255ルートを?うん、彼らはブロードキャストパケットを制御します。この状況192.168.0.3では、メトリックが低いため、ブロードキャストパケットはを介して送信されますが、他のインターフェイスには送信されません。

グローバルブロードキャストパケットが非常に簡単に送信されるインターフェイスを変更できます(255.255.255.255メトリックの低い永続的なルートを追加するだけです)。しかし、どんなに頑張っても、ブロードキャストパケットは1つのインターフェイスだけで送信され、私がやりたいようにすべてのインターフェイスで送信されるわけではありません。

結論

  • Windows 7は、ブロードキャストパケットを1つのインターフェイスにのみ送信します。どちらを選択してもかまいませんが、ここでは重要ではありません。
  • Windows XPはブロードキャストパケットをすべてのインターフェイスに送信しますが、期待どおりに1つのインターフェイスにのみ送信します。これは実際にはWindows 7の動作と同等です。

目標

Windows(できればWindows 7)でのこのグローバルIPブロードキャストサポートを一度に変更したいと思います。もちろん、サポートされている構成の変更(レジストリハックなど)を行うことをお勧めしますが、私はすべての提案を受け入れます。

何か案は?


これらのブロードキャストを生成するために何を使用していますか。XPスタックでダイレクトブロードキャスト以外のことを実行できません。つまり、あなたの場合は10.202.255.255です。
スコット・ランドバーグ、

記述した正しい動作を示すRFCまたはその他のドキュメントを参照できますか?私はそれが望ましい動作であることに同意しますが、それを正しい動作と呼ぶには、何が正しいかを定義する仕様を参照する必要があります。特定のルーティングの実装はプロバイダー(この場合はMicrosoft)に任されているのでしょうか?
Jason R. Coombs、

Scott Lundberg:多くのアプリケーション(特にゲーム)がグローバルブロードキャストを送信します。netcatを使用していくつか生成できます:たとえば、「nc -v -u 255.255.255.255 5000」。
Etienne Dechamps

ジェイソン・R・クームス:確かに、言​​葉の選択に問題があったのかもしれません。私は「望ましい行動」を使うべきでした。これに関するRFCはないと思いますが、私は間違っているかもしれません。
Etienne Dechamps

TCPまたはUDPパケットを送信していますか?これによると、重要なのはsocial.msdn.microsoft.com/Forums/en/peertopeer/thread/…です。
日産ファン

回答:


6

私がマイクロソフトを擁護しているわけではありませんが、ブロードキャストの動作を定義しようとする次のRFCを読んだ後、マイクロソフトが必ずしもRFCに違反しているとは思いません。IMO問題は、アプリケーションレベル(つまり、グローバルではなくダイレクトブロードキャスト)で修正する必要があります。ルーティングテーブルの適切なルートにヒットし、そのIPネットワークの正しいインターフェイスからのみ送信されます。

彼らは両方とも、放送のために定義された標準がないと述べています。また、919では、ブロードキャスト用に特定の物理インターフェイスを選択する必要があると述べています。ブロードキャストを生成するマルチホーム、マルチNICマシンの場合、何が起こるべきか明確に述べられているとは思いません。ブロードキャストは、ルーターによって1つのインターフェイスから別のインターフェイスに渡されることはありません。この場合、Windowsマシンはルーターなのか、そうでないのですか?ルーターとして機能している
場合、そのネットワーク(例ではアダプター2と3)の不正なIPアドレスでブロードキャストに応答するホストは、アダプターに応答してアダプター2と3のイーサネットアドレスにパケットを送り返す必要があります。 1のIPアドレスとWindowsホストは、適切なインターフェイスにルーティングする必要があります。
混乱するように聞こえますが、これを表現するより良い方法は考えられません。

そして最後に、RFC 919はRFC 919から具体的に言ってい ます

この問題はデータリンク層ですでに解決されていると想定している
ため、ローカルブロードキャストまたはダイレクトブロードキャストのいずれかを送信するIPホスト
は、適切な宛先アドレスを指定して、
通常どおりにデータグラムを送信するだけで済みます。高度なアルゴリズムは、ゲートウェイにのみ存在する必要があります。

ソースIPアドレスがブロードキャストに無関係であることを示唆することを読むでしょう。


アプリケーションごとにブロードキャストの処理が異なるように思われるので、ここに責任があると思います。例えば。 nbtstatゲームはグローバルブロードキャストを使用する可能性がありますが、マルチNICマシンでダイレクトブロードキャストを送信します。
つまり、この場合はOSではなく、アプリケーションを修正する必要があります...

編集:これは同じ状況のリンクですが、Linux上にあります。Linuxカーネルは、デフォルトのインターフェース(この例ではNIC A)から1つのパケットを送信するだけでそれを処理します。彼らは、アプリケーションがNICを列挙し、各NICにダイレクトブロードキャストを送信することを推奨しています。 リンク


2
RFC 919から引用している段落と送信元アドレスの関係が理解できません。パケットのブロードキャスト/ユニキャストの性質に関係なく、別のインターフェイスの送信元アドレスを持つインターフェイスでIPパケットを送信することは常に間違っていることは明らかです。つまり、「送信元IPアドレスはブロードキャストには無関係」とは言えませんが、もちろんそうです。他にどのようにアプリケーションは誰がブロードキャストを送信したかを知っているはずですか?
Etienne Dechamps、2009年

1
「それはまた、特定の物理インターフェースが放送のために選択されるべきであると919に言及します。」どこ?「アドレス255.255.255.255はローカルハードウェアネットワーク上のブロードキャストを示します」(RFC919 7.)?その場合、私は敬意を払いません。ネットワークレベルではなく、ホストレベルでのブロードキャストの処理方法について説明します。その上、ホストが「255.255.255.255を使用して、その直接のネイバーすべてにブロードキャストする」可能性があると、そのすぐ下で述べられています。そのすべての隣人。「特定のネットワークインターフェイス上のすべてのネイバー」ではありません。
Etienne Dechamps、2009年

1
「アプリケーションはどのインターフェースがブロードキャストを送信したかを気にしません。彼らはそれに応答する必要があるだけです。」ええと...彼らは、彼らに応答するだけでなく、放送も送る必要があります。LANゲームサーバーブラウザの場合を考えてみましょう。ブロードキャストパケットを送信して、ネットワーク上のゲームサーバーを検出します。ブロードキャストパケットがすべてのインターフェースに送信されない場合、ゲームサーバーブラウザーはこれらのインターフェースを介して到達可能なゲームサーバーを表示しません。つまり、叙事詩は失敗します。
エティエンヌデシャンプ2009年

1
「私にはわかりませんが、OSは255.255.255.255リクエストを見て、それをすべてのインターフェースで送信する必要があると(すべての隣接ノードを見つけるために)言っていると思いますが、特定のアプリケーションからリクエストされ、特定のIP(メトリックに基づいてデフォルトになる場合があります)。」同意する。それはそれが正しいことだという意味ではありません。私の意見では、すべてのインターフェースですべての人にパケットを送信することを期待しているアプリケーション開発者の観点からは、これは驚きを最小限に抑えるという原則に完全に違反しています。
Etienne Dechamps

4
重複とはどういう意味かわかりません。RFCは、ブロードキャストパケットの転送を明確に禁止しています。送信されるパケットは1つだけである必要があります。これは、私たちの議論の核心です。OSがあなたの言うとおりにする場合、IPレイヤーは別々のソースIPを持つ3つのパケット(レイヤー3のNICごとに1つ)を生成する必要があるため、実際には合計9つのパケット(インターフェイスごとに3つ)を生成する必要があります。各NICはそれらをイーサネット(レイヤー2)で送信する必要があります。ネットワーク間にルートがあった場合、3つの応答が返されます。どちらが正しいですか?
スコット・ランドバーグ、

4

最後に、プログラムで解決しました。私は、WinIPBroadcastと呼ばれる非常に小さなソフトウェアを作成しました。これは、ブロードキャストフレームをすべてのインターフェイスに中継する処理を行います。

これは興味深い事実を使用して機能します。ループバックアドレス(127.0.0.1)をリッスンしているときにローカルで生成されたグローバルブロードキャストパケットを受信することが可能です。WinIPBroadcastは、RAWソケットを使用してすべてのブロードキャストをローカルアドレスでリッスンし、ブロードキャストパケットごとに、優先パケットを除くすべてのインターフェイスに中継します。


WindowsスタックはBSDスタックのフォークなので、BSDが同じ動作をするかどうか知りたいです。
x0n

ソフトウェアが機能しません。The program can't start becuase api-ms-win-core-rtlsupport-l1-2-0.dll is missing from your computer..dllグーグルでそれを見つける幸運。
Alex G

@AlexG:それは変だ、私はgithub.com/dechamps/WinIPBroadcast/commit/…でその問題を修正したと思った。最新バージョン(1.6)を実行していますか?github.com/dechamps/WinIPBroadcast/issuesでバグを報告してください。
Etienne Dechamps 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.