netcat 与 UDP 的奇怪行为
我注意到使用 netcat 和 UDP 时出现了奇怪的行为。我启动了一个监听 UDP 端口的 netcat 实例(实例 1):
nc -lu -p 10000
因此,我启动了另一个 netcat 实例(实例 2)并尝试将数据报发送到我的进程:
nc -u 127.0.0.1 10000
我看到了数据报。但是,如果我关闭实例 2 并再次重新启动 netcat(实例 3):
nc -u 127.0.0.1 10000
我在实例 1 的终端上看不到数据报。显然,操作系统在实例 3 上相对于实例 2 分配了不同的 UDP 源端口,问题就在那里:如果我使用相同的实例 2 源端口(例如 50000):
nc -u -p 50000 127.0.0.1 10000
netcat 的实例 1 再次接收数据报。 UDP 是一种无连接协议,那么为什么呢?这是标准的 netcat 行为吗?
I noticed a strange behaviour working with netcat and UDP. I start an instance (instance 1) of netcat that listens on a UDP port:
nc -lu -p 10000
So i launch another instance of netcat (instance 2) and try to send datagrams to my process:
nc -u 127.0.0.1 10000
I see the datagrams. But if i close instance 2 and relaunch again netcat (instance 3):
nc -u 127.0.0.1 10000
i can't see datagrams on instance 1's terminal. Obsiously the operating system assigns a different UDP source port at the instance 3 respect to instance 2 and the problem is there: if i use the same instance'2 source port (example 50000):
nc -u -p 50000 127.0.0.1 10000
again the instance 1 of netcat receives the datagrams. UDP is a connection less protocol so, why? Is this a standard netcat behaviour?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
当 nc 正在侦听 UDP 套接字时,它会“锁定”其收到的第一个数据包的源端口和源 IP。查看此跟踪:
在这里您可以看到它创建了一个 UDP 套接字,将其设置为地址重用,并将其绑定到端口 10,000。一旦它收到第一个数据报(来自端口 52,832),它就会发出
connect
系统调用,将其“连接”到 127.0.0.1:52,832。对于 UDP,connect
会拒绝所有与connect
中的 IP 和端口不匹配的数据包。When
nc
is listening to a UDP socket, it 'locks on' to the source port and source IP of the first packet it receives. Check out this trace:Here you can see that it created a UDP socket, set it for address reuse, and bound it to port 10,000. As soon as it received its first datagram (from port 52,832), it issued a
connect
system call 'connecting' it to the 127.0.0.1:52,832. For UDP, aconnect
rejects all packets that don't match the IP and port in theconnect
.使用
-k
选项:Use the
-k
option:在我的操作系统版本上放弃了 netcat 之后,这很短并且完成了工作:
Having given up on netcat on my OS version this is pretty short and gets the job done:
正如已接受的答案所解释的,
ncat
似乎不支持 UDP 协议的--keep-open
。但是,它打印的错误消息暗示了解决方法:只需添加
--exec /bin/cat
即可使用--keep-open
。输入和输出都将连接到/bin/cat
,其效果是将其变成“回显服务器”,因为客户端发送的任何内容都将被复制回它。要对输入执行更有用的操作,我们可以使用 shell 的重定向运算符(因此需要
--sh-exec
而不是--exec
)。要查看终端上的数据,可以这样做:注意:上面的示例将数据发送到 ncat 的 父 shell 的标准输出,如果与其他重定向结合使用,这可能会造成混乱。将所有输出简单地附加到文件中更简单:
As the accepted answer explains,
ncat
appears not to support--keep-open
with the UDP protocol. However, the error message which it prints hints at a workaround:Simply adding
--exec /bin/cat
allows--keep-open
to be used. Both input and output will be connected to/bin/cat
, with the effect of turning it an "echo server" because whatever the client sends will be copied back to it.To do something more useful with the input, we can use the shell's redirection operators (thus requiring
--sh-exec
instead of--exec
). To see the data on the terminal, this works:Caveat: the above example sends data to the stdout of ncat's parent shell, which could be confusing if combined with additional redirections. To simply append all output to a file is more straightforward: