상상하다
socat
UDP 데이터그램 메시지를 브로드캐스트 주소로 보내려고 합니다 .
수신측에서는 다음과 같이 실행합니다 socat
(루트 권한 사용).
socat UDP-LISTEN:1011 -
다음 코드를 사용하여 루트 권한으로 메시지를 보내려고 합니다.
echo -n "test" | socat - UDP-DATAGRAM:255.255.255.255:1011,broadcast
관찰된 행동
1025보다 낮은 포트(특권 포트 등)를 사용할 때 브로드캐스트 데이터그램 메시지가 삭제되는 것으로 나타납니다. 1024 이상의 포트를 사용하면 정상적으로 작동합니다.
또한 로컬 네트워크를 기반으로 브로드캐스트 주소를 시도했지만 동일한 동작을 관찰했는데 1024 이상의 포트만 데이터그램을 수신했습니다.
iptables
수신자가 UDP 메시지를 수신하지 못하게 하는 항목이 없습니다. 마찬가지로 송신측에도 항목이 없습니다. 실제로 iptables -L
실행 후 예상되는 항목 외에는 항목이 포함되지 않습니다 iptables -F
.
질문
이것이 표준적인 행동입니까? 단순히 1024보다 큰 포트를 사용해야 합니까, 아니면 이 문제를 해결할 수 있습니까? 제 경우에는 1025보다 낮은 포트를 사용하고 싶습니다.
답변1
여기에 있는 모든 예제는 하나 이상의 포트 <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
이 답변의 나머지 명령은 다른 시스템, 즉 수신 클라이언트(제 경우에는 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 예제는 루트 또는 권한이 없는 일반 사용자로 실행될 수 있습니다. 포트 1011 예에는 루트(또는 적절한 기능)가 필요합니다.