it-swarm.com.de

Seltsames Verhalten von netcat mit UDP

Bei netcat und UDP habe ich ein merkwürdiges Verhalten festgestellt. Ich starte eine Instanz (Instanz 1) von netcat, die einen UDP-Port abhört:

nc -lu -p 10000

Also starte ich eine weitere Instanz von netcat (Instanz 2) und versuche, Datagramme an meinen Prozess zu senden:

nc -u 127.0.0.1 10000

Ich sehe die Datagramme. Aber wenn ich Instanz 2 schließe und netcat (Instanz 3) erneut starte:

nc -u 127.0.0.1 10000

ich kann keine Datagramme auf dem Terminal von Instanz 1 sehen. Das Betriebssystem weist der Instanz 3 offenbar einen anderen UDP-Quellport in Bezug auf Instanz 2 zu, und das Problem liegt vor: Wenn ich den gleichen Quellcode von Instanz'2 verwende (Beispiel 50000):

 nc -u -p 50000 127.0.0.1 10000

wieder empfängt die Instanz 1 von netcat die Datagramme. UDP ist ein Protokoll ohne Verbindung, also warum? Ist dies ein Standardverhalten der Netcat?

32
MirkoBanchi

Wenn nc einen UDP-Socket abhört, wird der Quellport und die Quell-IP des ersten empfangenen Pakets "gesperrt". Schauen Sie sich diese Spur an:

socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP) = 3
setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
bind(3, {sa_family=AF_INET, sin_port=htons(10000), sin_addr=inet_addr("127.0.0.1")}, 16) = 0
recvfrom(3, "f\n", 2048, MSG_PEEK, {sa_family=AF_INET, sin_port=htons(52832), sin_addr=inet_addr("127.0.0.1")}, [16]) = 2
connect(3, {sa_family=AF_INET, sin_port=htons(52832), sin_addr=inet_addr("127.0.0.1")}, 16) = 0

Hier können Sie sehen, dass ein UDP-Socket erstellt, für die Wiederverwendung von Adressen festgelegt und an Port 10.000 gebunden wurde. Sobald es sein erstes Datagramm (von Port 52,832) erhalten hat, gab es einen connect-Systemaufruf aus, der es mit dem 127.0.0.1:52,832 "verbindet". Für UDP lehnt eine connect alle Pakete ab, die nicht mit der IP und dem Port in der connect übereinstimmen.

40
David Schwartz

Verwenden Sie die Option-k:

nc -l -u -k 0.0.0.0 10000
  • -k bedeutet Keep-Alive, dass Netcat nach jeder Verbindung weiter hört
  • -u bedeutet UDP
  • -l lauscht auf Port 10000
5

Nachdem netcat auf meiner Betriebssystemversion aufgegeben wurde, ist dies ziemlich kurz und erledigt die Aufgabe:

#!/usr/bin/Ruby
# Receive UDP packets bound for a port and output them
require 'socket'
require 'yaml'

unless ARGV.count == 2
  puts "Usage: #{$0} listen_ip port_number"
  exit(1)
end
listen_ip = ARGV[0]
port = ARGV[1].to_i

u1 = UDPSocket.new
u1.bind(listen_ip, port)
while true
  mesg, addr = u1.recvfrom(100000)
  puts mesg
end
3
James Kay

Wie die akzeptierte Antwort erklärt, scheint ncat--keep-open nicht mit dem UDP-Protokoll zu unterstützen. Die Fehlermeldung, die es ausgibt, weist jedoch auf eine Problemumgehung hin:

Ncat: UDP mode does not support the -k or --keep-open options, except with --exec or --sh-exec. QUITTING.

Durch das Hinzufügen von --exec /bin/cat kann --keep-open verwendet werden. Sowohl Eingang als auch Ausgang werden mit /bin/cat verbunden, wodurch ein "Echo-Server" verwendet wird, da alles, was der Client sendet, zurück in ihn kopiert wird.

Um etwas nützlicher mit der Eingabe zu machen, können wir die Umleitungsoperatoren der Shell verwenden (daher --sh-exec anstelle von --exec). Um die Daten auf dem Terminal anzuzeigen, funktioniert dies:

ncat -k -l -u -p 12345 --sh-exec "cat > /proc/$$/fd/1"

Vorbehalt: Das obige Beispiel sendet Daten an die Standardausgabe von ncat parent Shell , was in Kombination mit zusätzlichen Weiterleitungen verwirrend sein kann. Alle Ausgaben einfach an eine Datei anzuhängen, ist einfacher: 

ncat -k -l -u -p 12345 --sh-exec "cat >> ncat.out"
0
Todd Owen