想像する

想像する

想像する

socatUDPデータグラムメッセージをブロードキャストアドレスに送信しようとしています。

受信側では、次のように実行します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の例では、ルート(または適切な機能)が必要です。

関連情報