想像する
socat
UDPデータグラムメッセージをブロードキャストアドレスに送信しようとしています。
受信側では、次のように実行しますsocat
(root権限を使用)。
socat UDP-LISTEN:1011 -
次のコードを使用してroot権限でメッセージを送信しようとしています。
echo -n "test" | socat - UDP-DATAGRAM:255.255.255.255:1011,broadcast
観察された行動
1025より低いポート(特権ポートなど)を使用すると、ブロードキャストデータグラムメッセージが破棄されるように見えます。 1024以上のポートを使用すると正常に動作します。
また、ローカルネットワークに基づいてブロードキャストアドレスを試しましたが、同じ動作を観察しましたが、1024を超えるポートのみがデータグラムを受信しました。
iptables
受信者がUDPメッセージを受信できないようにするエントリはありません。同様に送信側にも項目がありません。実際にiptables -L
実行後に予想されるもの以外は含まれませんiptables -F
。
質問
これは標準的な行動ですか?単に1024より大きいポートを使用する必要がありますか、それともこの問題を解決できますか?私の場合は、1025未満のポートを使用したいと思います。
答え1
ここにあるすべての例は、1つ以上のポート<1024を考慮しているため、rootとして実行する必要があります。
まず、送信サーバーに繰り返しブロードキャストユーティリティを設定しました。
#!/bin/bash
while sleep 5
do
clear
date
echo
text="$((n++)): $(date)"
echo "Sending: $text"
for port in 1011 2022
do
socat - UDP-DATAGRAM:255.255.255.255:$port,broadcast <<<"$text on port $port"
echo "Sent on port $port"
done
done
この答えの残りのコマンドは、他のシステム、つまり受信クライアント(私の場合は2つ)で実行されます。
ドキュメント(man socat
)にはUDP-LISTEN
これが記載されています。待つ[つまり、一つ]UDP / IPパケットが到着し、再び「接続」されます。[これ]送信者ここでは、鍵はパケットを受け入れることです。その後、応答を待ちます(標準入力)、送信者に返却しようとします。次の例では、これを実際に確認できます。
socat UDP-LISTEN:1011 - </dev/null # Succeeds as nothing sent
socat UDP-LISTEN:1011 - <<<'response' # Fails to send as sender not listening
socat UDP-LISTEN:2022 - </dev/null # Succeeds as nothing sent
socat UDP-LISTEN:2022 - <<<'response' # Fails to send as sender not listening
UDP-RECVFROM
私の考えでは、パケットを受け取り、次に転送する次のいずれかをしたいと思います。標準出力終了する前またはUDP-RECV
継続的にパケットを受け入れて中継します。標準出力:
socat UDP-RECVFROM:1011 - # Receives one packet and exits
socat UDP-RECV:1011 - # Continuously relays packets to stdout
socat UDP-RECVFROM:2022 - # Receives one packet and exits
socat UDP-RECV:2022 - # Continuously relays packets to stdout
ポート2022の例は、rootまたは権限のない一般ユーザーとして実行できます。ポート1011の例では、ルート(または適切な機能)が必要です。