web-dev-qa-db-ja.com

マシンにネットワークがない場合、ifconfigを使用してos / xの下のループバックインターフェイスにブロードキャストIPを追加するにはどうすればよいですか?

私は高度なネットワーク管理に不慣れで、UDPブロードキャストでテストを行いたいので、ループバックインターフェイスのブロードキャストアドレスが必要です。マシンはオフラインです。つまり、ネットワークがありません。

提案されたコメントで1人のユーザーとしてスイッチを購入することなく、ifconfigを介してそれを達成するにはどうすればよいですか。 Linuxでは、127.255.255.255を使用するだけで、ネットワークやスイッチがなくてもブロードキャストは正常に機能します。ネットワークがある場合は、明らかに255.255.255.255を使用できます。


Linuxでは動作するがos/xでは動作しないことを自分で確認する方法は次のとおりです。

  1. 2つの端子を開き、両方に入力します。

    nc -u -l 55555

  2. 3番目のターミナルを開き、必要に応じてsocatをインストールし、次のように入力します。(netcatがブロードキャストをサポートしていない場合

    echo -n "TEST" | socat - udp-datagram:127.255.255.255:55555,broadcast

  3. 両方の端末メッセージを受信して​​いることがわかります。

127.0.0.1で同じ実験を試みた場合、1つの端末だけが期待どおりにメッセージを受け取ります。

OS Xで同じテストを実行しても、同じ動作は見られません。

私が探しているのは、可能であればブロードキャストのソフトウェア回避策です。
マルチキャストを使用できず(ブロードキャストする必要があります)、ネットワーク経由でテストできません(マシンがオフラインです)。

2
bandodeotarios

ブロードキャストアドレスを「追加」しません。あなたはトラフィックをネットワークのブロードキャストアドレスに転送します
ブロードキャストアドレスは完全に仮想的な概念であり、通常の方法でホストに「追加」または割り当てるべきではありません

上記の規則の例外は、ブロードキャストアドレスが非標準である可能性がある場合に行われるブロードキャストアドレスの指定ifconfig broadcastを使用)です。一般に、ifconfigにbroadcastオプションを使用する必要がある場合は、何か奇妙なことをしていて、おそらく間違っている...

ブロードキャストを127.0.0.0/8(ローカル/ループバック)ネットワークに送信する場合、理論的には単にトラフィックを127.255.255.255に転送しますが、それを実行しようとすると、ループバックデバイスが原因で機能しないことがわかります。 BROADCASTトラフィックをサポートしていません。

Macでifconfig lo0を実行すると、次のような出力が生成されます。

lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
    options=3<RXCSUM,TXCSUM>
    inet6 ::1 prefixlen 128 
    inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1 
    inet 127.0.0.1 netmask 0xff000000 
    nd6 options=1<PERFORMNUD>

フラグフィールドにBROADCASTがないことに注意してください。
ブロードキャストオプション(アドレス)を指定してデバイスを構成すると、アドレスが無視されます。 BSDまたはLinux(Debian)ボックスも同様に動作し、他のプラットフォームでも同様に動作すると思いますが、十分に検索すると、ループバックデバイスでBROADCASTフラグを設定できる奇妙なアヒルが見つかる場合があります。

この背後にあるロジックについて説明します このFreeBSDメーリングリストの投稿で 。ブロードキャストを許可しない別の理由については、 このサーバー障害の回答 に関するコメントでも説明されています。これは、MULTICASTが通常サポートされている)を使用する代替案を提案しています。ループバックインターフェイスによる)。


特にテストケースに関して:あなたが見ているものは予期された振る舞いではありません。私はあなたの行動を再現することができましたが、それは非常に限られた状況でのみでした。

Linuxではループバックデバイスでのブロードキャストが実際には機能しないことを示す、より堅牢なテストについては、便利なLinuxマシンで次のテストケースを試してください(私のテストケース:Ubuntu 13.04) :

  • ループバックインターフェイスで2番目のアドレス(3番目、4番目、5番目-必要な数)を構成します。

  • 各ループバックアドレスでリッスンしているnetcatインスタンスを開始します。 -
    nc -u -l 127.0.0.1 5555
    nc -u -l 127.0.0.2 5555
    nc -u -l 127.0.0.3 5555
    ...等

  • socatを使用してブロードキャストテストコマンドを実行します
    echo TEST | socat - udp-datagram:127.255.255.255:5555,broadcast

ループバックインターフェイスがBROADCASTのサポートをアドバタイズしないため、netcatウィンドウのnoneがメッセージ(Expected Behaviorを受信することに注意してください。そのフラグフィールド)、ただし、直接アドレス指定すると(たとえば、echo TEST2 | socat - udp-datagram:127.0.0.2:5555)、問題なくメッセージを受信します。

ループバックインターフェイスがBROADCAST(のflagsフィールドで決定できる)をサポートしていない限り、要求している「ソリューション」はどのプラットフォームにも存在しません(または少なくとも機能しないはずです) ifconfig)-あなたが話しているプラ​​ットフォームはループバックインターフェースでのブロードキャストのサポートをアドバタイズしないので、あなたはあなたが求めていることをすることができません。

10
voretaq7