UDPユニキャストパケットをブロードキャストに変換しますか?


8

内部LAN上の一部のコンピューターをインターネットからウェイクアップする必要があります。
ある程度閉じたルーターがあり、構成方法はほとんどありません。
デーモンなどを必要としないため、これを行うためにnetfilter(iptables)を使用したいのですが、他のソリューションでも問題ありません。

私が考えていること:

  • 外部コンピューターがWOL(Wake-On-LAN)パケットを(正しいMACが内部にある)パブリックIPアドレスに発行する
  • ルーターで正しいポートが開いており(たとえば1234)、データをLinuxボックスにリダイレクトします。
  • Linuxボックスは、UDPユニキャストパケットをブロードキャストパケットに変換します(まったく同じ内容、宛先アドレスのみが255.255.255.255または192.168.0.255に変更されます)
  • マルチキャストパケットがすべてのNICに到達し、目的のコンピューターが起動している

そのため、非常に単純なnetfilterルールは次のとおりです。
iptables --table nat --append PREROUTING --in-interface eth+ --protocol udp --destination-port 1234 --jump DNAT --to-destination 192.168.0.255

ああnetfilterはブロードキャストへの変換を無視しているようです。192.168.0.255と255.255.255.255は何も与えません。また、192.168.0.0と0.0.0.0でテストしました。tcpdump
を使用して何が起こるかを確認しました
tcpdump -n dst port 1234
13:54:28.583556 IP www.xxx.yyy.zzz.43852 > 192.168.0.100.1234: UDP, length 102
。次のような2行目が必要です。
13:54:28.xxxxxx IP www.xxx.yyy.zzz.43852 > 192.168.0.255.1234: UDP, length 102

非マルチキャストアドレスにリダイレクトする場合は、すべて問題ありません。予想される2つの行があります。しかし、明らかにこれはWOLでは機能しません。

ブロードキャストパケットを発行するようにnetfilterに指示する方法はありますか?

私が考える他の方法:

  • iptablesを使用して目的のパケットを照合し、ログに記録し、デーモンを使用してログファイルを監視し、ブロードキャストパケットを起動します
  • iptablesを使用して、目的のパケットをローカルデーモンにリダイレクトします。ローカルデーモンは、ブロードキャストパケットを起動します(より単純)。
  • socatを使用する(方法?)

ブロードキャストパケットは、ブロードキャストアドレスに送信されるパケットだけではありません。SO_BROADCASTと呼ばれるソケットのフラグがあります。私はiptablesがそれをどのように変更できるかを理解しようとしています。
lgeorget 2013年

@lgeorget:iptablesはsoソケットとは関係ありません。
Bertrand SCHITS 2013年

確かに。私は正しい場所を見ていません。iptablesがブロードキャストパケットを送信できるようにするには、どこかにオプションが必要です。
lgeorget 2013年

1
iptables --table nat --append PREROUTING --in-interface eth + --protocol udp --destination-port 1234 --jump DNAT --to-destination 192.168.0.0を試しましたか?
lgeorget 2013年

@lgeorget:アイデアをありがとう。しかし同じ結果。質問を更新します
Gregory MOUSSAT 2013年

回答:


12

socatキラーユーティリティです。initスクリプトのどこかに配置します。

socat -u -T1 UDP-LISTEN:1234,fork UDP-DATAGRAM:255.255.255.255:5678,broadcast

一部のユーザーはUDP-LISTENに問題があるため、UDP-RECVを使用する方が良いようです(警告:無限ループでブロードキャストパケットを送信する可能性があります)。

socat -u UDP-RECV:1234 UDP-DATAGRAM:255.255.255.255:5678,broadcast

forksocatが次のパケットをリッスンし続けることを許可します。
T1フォークされたサブプロセスの寿命を1秒に制限します。
255.255.255.255192.168.0.255よりも一般的です。現在のネットワーク構造を意識せずに、単にコピーして貼り付けることができます。注意:これはおそらく、ブロードキャストされたパケットをすべてのインターフェースに送信します。

お気づきのように、WOLはどのポートでも機能します。これは信頼できるのだろうか。多くのドキュメントでは、ポート
0、7、9 についてのみ説明しています。これにより、非侵害ポートを使用できるためsocat、userで実行できますnobody

この回答に感謝しlgeorget Hauke LagingGregory MOUSSAT参加していただきました。
詳細を自由に追加してください。


私はそれを試しましたが、問題は、フォークに関係なく、最初のパケットが到着した後にUDP-LISTENがソケットを閉じることです。代わりにUDP-RECVを使用してください。
lgeorget 2013年

ここで問題ありません。「フォーク」オプションを使用しましたか?UDP-RECVマージパケットが表示されます。どういう意味かわかりません。UDP-RECVFROMはこの動作を示しませんが、男性のエラーである可能性があります。
Bertrand SCHITS 2013年

はい、「フォーク」を使用しました。socatと2つのnetcatプロセス(1つはsocatにパケットを送信し、もう1つはブロードキャストパケットを受信する)を試してみました。UPD-LISTENを使用すると、socatは接続をシミュレートし、最後にソケットを閉じます。UDP-RECVでは、UDPのデフォルトのコネクションレス動作を使用します。socat manから:「通常、ソケット接続は、複数のプロセスで共有されている場合でも、ソケットを終了するshutdown(2)で終了します。」
lgeorget 2013年

2
socatはすべてのインターフェースでブロードキャストしますか?
Hauke Laging 2013年

1
@lgeorget: "echo 'dummy' | nc -u -q 0 127.0.0.1 1234"は-UDP-LISTENと完全に連携します。何度か実行できます。しかし、私は-UDP-RECVおよび-UDP-RECVFROMに問題があります。パケットはsocatが強制終了されるまで最大リンクレートでブロードキャストされます。tcpdumpでも同じ問題が発生しますか?
Bertrand SCHITS 2013年

3

ブロードキャストトラフィックの定義は、ローカルマシン宛です。これは、パケットが192.168.0.255にDNATされた後、カーネルがパケットを見て、それがルーター自体に宛てたものであると判断するため、INPUTチェーンにこのパケットが表示されることを意味します。ルーター(およびその他のデバイス)は、192.168.0.255パケットが自分宛てであると見なし、それ以上転送しません。ブロードキャストパケットは、設計上、ルーティング/転送されません。

前述のARPトリックには優れた回避策があります。1つのIPアドレスを「失う」ことになります。192.168.0.254この例ではダミーを使用192.168.0.254します。ネットワーク内のデバイスには決して割り当てないでください。

  1. どのマシンにも使用しないIPアドレスの静的ARPエントリをLANインターフェイスに作成します。

    arp -i ethLAN --set 192.168.0.254 FF:FF:FF:FF:FF:FF
    
  2. 次のダミーIPアドレスへのWANインターフェイス上のWake-On-Lan UDPタフィックをDNATします。

    iptables --table nat --append PREROUTING  --in-interface ethWAN --protocol udp --destination-port 1234 --jump DNAT --to-destination 192.168.0.254
    

これはWOLパケットに最適です。この回避策は、Mikrotikデバイスやopenwrtデバイスなど、Linuxカーネルに基づく製品でも機能します。私はMikrotikデバイスでこのトリックを使用して、携帯電話でリモートでマシンを起動します。


インターネットから受信したパケットはブロードキャストされません。これが「ユニキャストを放送に変換する」という質問の理由です
グレゴリー・マウスサット

2

この質問はServerfaultで見つかりました。

しかし、ルーターを介してそのようなブロードキャストトラフィックを取得することができませんでした。DNATされたパケットが私のFORWARDチェーンに到着しませんでした。たぶん、それを許可しない奇妙なカーネルオプションがあるかもしれません。

しかし、ARPのアイデアは興味深いものです。転送されたトラフィックのみで到達できるように、このアドレスへのパケットを禁止するOUTPUTのルールを伴う必要があると思います。


1

Socat OpenWRT

Socatはすでに回答として述べられていますが、述べられた回答は私のプラットフォームであるOpenWRTで動的WANアドレスを使用して動作しませんでした。

私の目標は、WANインターフェイスのUDPポート9から192.168.20.255のサブネットブロードキャストにユニキャストUDPウェイクオンランパケットを転送することです。

壊れた(iptables)

私もiptablesを試してみましたが、255で終わるルールを追加するたびに、次のように印刷すると、ルールは宛先アドレス0.0.0.0のマッシュに変わります。

iptables -t nat -L

ユニキャストからブロードキャストへの変換で必要とされるように、iptablesはトラフィックを多重化できないと思います。

悪い(偽のarpエントリ)

パケットがイーサネットセグメントのすべての人に届くため、arpエントリの偽装はそれほど悪くありませんが、次の欠点があります。

  • あなたはIPアドレスを「消費」します
  • MACアドレスがすべてFFFFであるため、WoLパケットの宛先IPが間違っています。
  • ネットワーク上の誰かがそのIPアドレスを使用すると、IPの誤動作が発生する可能性があります。
  • これはイーサネットブロードキャストであり、IPブロードキャストではありません。

注:これはarpコマンドまたはip neighコマンドで実行できます。

いいもの

前の回答で示されているように、socatはひどいです。ただし、前のsocatの回答では、いくつかの問題が発生しました。

  1. UDPブロードキャストの宛先が255.255.255.255の場合、socatはトラフィックを転送しませんでした。ブロードキャストサブネットを私が使用するものに制限することでこれを回避し、おそらく安全です。
  2. バインドアドレスを0.0.0.0に設定すると、トラフィックがLANからsocatに跳ね返ったため、ブロードキャストストームに遭遇しました。私は最初にパブリックddnsにバインドすることでこれを解決しましたが、ddnsが使用できず、動的に割り当てられたIPアドレスが変更されるため、これは理想的ではありません。

私は0.0.0.0(すべてのアドレス)にバインドし、LAN側から着信ブロードキャストがsocatに跳ね返るのをブロックするiptablesルールを追加することにより、ブロードキャストストームを回避することができました。このルールは、UDPポート9でトラフィックを受け入れるiptablesルールと、ログを記録するiptablesルールに加えて、socatコマンドに加えて、次の3つのルールを取得します。

iptables -I input_wan_rule -p udp --dport 9 -j ACCEPT -m comment --comment "firewall entry to allow udp port 9 to socat"
iptables -I input_wan_rule -p udp --dport 9 -j LOG --log-prefix 'Received MAGIC PACKET on udp/9'
iptables -I input_lan_rule -p udp --dport 9 -d 192.168.20.0/24 -j DROP -m comment --comment "block broadcast from bouncing back to socat to avoid storm"

killall socat 2>/dev/null
socat -u -T1 UDP-LISTEN:9,bind=0.0.0.0,fork UDP-DATAGRAM:192.168.20.255:9,broadcast &

OpenWRTerにとっては、これを貼り付けて/etc/firewall.user発行する/etc/init.d/firewall restartだけで十分です。

おめでとうございます。これで、Web上のどこからでもネットワークでWoLが機能するようになりました。


0

実際、netfilterはブロードキャストを実行できません。ルーティングメカニズムがこれを実行します。

ただし、デフォルトでは転送されたブロードキャストはすべて破棄されます。

最近のLinuxカーネル(バージョン5.0程度)でダイレクトUDPブロードキャストを転送できるようになりました

bc_forwardingブロードキャストネットワークインターフェースのパラメータを変更する必要があります:

sudo sysctl -w net.ipv4.conf.eth1.bc_forwarding=1

(注:オプションnet.ipv4.confのようです。すべての .bc_forwardingは機能しません)

だから今、カーネル約5.0 + iptablesで十分です

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.