netcat与UDP的奇怪行为

Mir*_*chi 32 networking udp netcat

我注意到一个使用netcat和UDP的奇怪行为.我启动一个侦听UDP端口的netcat实例(实例1):

nc -lu -p 10000
Run Code Online (Sandbox Code Playgroud)

所以我启动另一个netcat实例(实例2)并尝试将数据报发送到我的进程:

nc -u 127.0.0.1 10000
Run Code Online (Sandbox Code Playgroud)

我看到了数据报.但是,如果我关闭实例2并重新启动netcat(实例3):

nc -u 127.0.0.1 10000
Run Code Online (Sandbox Code Playgroud)

我无法在实例1的终端上看到数据报.实际上,操作系统在实例3处为实例2分配了不同的UDP源端口,问题在于:如果我使用相同的instance2源端口(例如50000):

 nc -u -p 50000 127.0.0.1 10000
Run Code Online (Sandbox Code Playgroud)

再次,netcat的实例1接收数据报.UDP是一种连接较少的协议,为什么呢?这是标准的netcat行为吗?

Dav*_*rtz 40

nc侦听UDP套接字时,它会"锁定"到它接收的第一个数据包的源端口和源IP.查看此跟踪:

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
Run Code Online (Sandbox Code Playgroud)

在这里,您可以看到它创建了一个UDP套接字,将其设置为地址重用,并将其绑定到端口10,000.一旦收到第一个数据报(来自端口52,832),它就会发出connect系统调用"连接"它到127.0.0.1:52,832.对于UDP,a connect拒绝所有与IP中的IP和端口不匹配的数据包connect.

  • 相反,我建议使用socat.例如socat UDP-RECV:[port] STDOUT和socat STDIN UDP-DATAGRAM:[host]:[port] (16认同)
  • 糟糕,应该有一个选项来禁用这个IMO.那么,如何指定哪些主机从绑定的"监听"过程发送数据报? (2认同)
  • 添加 -w 0 似乎可以解决“锁定”问题。 (2认同)

Nas*_*ibi 5

使用-k选项:

nc -l -u -k 0.0.0.0 10000
Run Code Online (Sandbox Code Playgroud)
  • -k表示保持活动状态,netcat在每次连接后都会继续监听
  • -u表示UDP
  • -l侦听端口10000

  • Ncat:UDP模式不支持-k或--keep-open选项,除了--exec或--sh-exec.狭路相逢. (5认同)