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

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

インターネットから内部LAN上の一部のコンピュータを起動する必要があります。
設定方法がほとんどない、やや閉鎖的なルータがあります。
デーモンや同様のものは含まれていないので、netfilter(iptables)を使ってこれをやりたいのですが、他の解決策も動作します。

私の意見は次のとおりです。

  • 外部コンピュータは、内部的に正しいMACを含むパブリックIPアドレスにWOL(Wake on LAN)パケットを送信します。
  • データをLinuxボックスにリダイレクトするために、ルーター(たとえば1234)で正しいポートが開きます。
  • LinuxボックスはUDPユニキャストパケットをブロードキャストパケットに変換します(宛先アドレスが255.255.255.255または192.168.0.255に変更されることを除いて、内容はまったく同じです)。
  • マルチキャストパケットが各ネットワークカードに到着し、必要なコンピュータが目覚めます。

これに対する非常に単純な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を使う(どう?)

ベストアンサー1

socatキラーユーティリティです。初期化スクリプトのどこかにこれを置きなさい:

socat -u -T1 UDP-LISTEN:1234,fork,range=<ip address of source>/32 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秒に制限します。
  • rangesocatこのソースからのパケットのみを受信します。これが実行中のコンピュータ以外のコンピュータであると仮定すると、無限ループが発生する独自のブロードキャストパケットを受信しないことが役立ちsocatます。socat
  • 255.255.255.255192.168.0.255現在のネットワーク構造につ​​いて考える必要なくコピーして貼り付けるだけです。注:これにより、すべてのインターフェイスにブロードキャストパケットが送信される可能性があります。

あなたと同じように、私はWOLがすべてのポートで動作することを知っていました。これが信頼できるものかどうかはわかりません。多くのドキュメントでは、ポート0、7、9についてのみ説明しています。
これにより、権限のないポートを使用できるため、socatユーザーとして実行できますnobody

この答えに貢献してくれた@lgeorget @Hauke Lagingと@Gregory MOUSSATに感謝します。

おすすめ記事