设想

设想

设想

我正在尝试将 UDP 数据报消息发送socat到广播地址。

在接收端,这就是我的运行方式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

这里所有示例都必须以 root 身份运行,因为我们正在考虑至少一个 <1024 的端口。

首先,我在发送服务器上设置了重复广播实用程序:

#!/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

该答案中的其余命令在不同的系统上运行,即接收客户端(在我的例子中是两个)。

文档 ( 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 示例需要 root(或适当的能力)。

相关内容