netcat如何知道UDP端口是否打开?


49

因此,我可以使用此netcat命令来检查UDP端口是否打开:

$  nc -vz -u 10.1.0.100 53
Connection to 10.1.0.100 53 port [udp/domain] succeeded!

与TCP不同,UDP是无连接的(即发即弃)。因此,从总体上讲,有人知道netcat如何知道UDP端口是打开的吗?它要求答复还是类似的东西?

Answers:


17

从特定的输出来看,Connection to Connection to 10.1.0.100 53 port [udp/domain] succeeded!您正在使用openbsd-netcat。

纵观该代码的测试是绑定到UDP套接字,也就是说,是一个开放的连接:

              if (vflag || zflag) {
                            /* For UDP, make sure we are connected. */
                            if (uflag) {
                                    if (udptest(s) == -1) {
                                            ret = 1;
                                            continue;
                                    }
                            }

                            /* Don't look up port if -n. */
                            if (nflag)
                                    sv = NULL;
                            else {
                                    sv = getservbyport(
                                        ntohs(atoi(portlist[i])),
                                        uflag ? "udp" : "tcp");
                            }

                            fprintf(stderr,
                                "Connection to %s %s port [%s/%s] "
                                "succeeded!\n", host, portlist[i],
                                uflag ? "udp" : "tcp",
                                sv ? sv->s_name : "*");

大约3次写入打开套接字的udptest问题。注意,这不适用于IPv6,并且在检查了大约100个端口后失败。

因此,尽管其他建议可能是有效的,但我认为在这种情况下不会发生这种情况。


udptest我正在寻找的功能也是如此,它回答了我的问题。从您提供的链接中“ * udptest()*做一些写操作以查看UDP端口是否存在”
Patrick McMahon

是的,我只是检查了一下,还看到了写入内容。修改后的答案。
2015年

@PatrickMcMahon-如果这回答了您的问题,请单击大的勾号将其接受。
cas 2015年

17

实际上,事实并非如此。您可以通过以下方式进行检查:

$ nc -vz -u 8.8.8.8 53 
Connection to 8.8.8.8 53 port [udp/domain] succeeded!
$ nc -vz -u 8.8.8.8 54
Connection to 8.8.8.8 54 port [udp/*] succeeded!
$ nc -vz -u 8.8.8.8 59
Connection to 8.8.8.8 59 port [udp/*] succeeded!
$ 

因此,使用UDP,您无法真正检查它,除非它将返回信息。


9

有一条ICMP消息来表明端口(甚至是UDP端口)已关闭。因此,如果主机发送此消息,则可以认为该端口已关闭。

https://zh.wikipedia.org/wiki/Internet_Control_Message_Protocol#Destination_unreachable


4
请注意,由于UDP是无连接的,因此无法可靠地将开放端口与防火墙端口与丢失的数据包区分开。
标记

非常真实 从理论上讲,您也有可能收到数据包而端口并未真正关闭。
phk 2015年

9

好吧,我有不同的看法:

a:~# nc -luk 10.12.0.12 667 // listen on UDP port 667
b:~# nc -uv 10.12.0.12 667  // check if port is open 
nc: 10.12.0.12 (10.12.0.12) 667 [667] open
I love stackexchange // send a message
a:~# nc -luk 10.12.0.12 667
I love stackexchange // receive the message.

因此,基于此,您可以检查该udp端口上a和b之间的连接是否可行。稍后,您可以继续使用tcpdump检查。


1
嗯,我喜欢这个。这是测试您是否可以访问两个节点的好方法。我猜想当我问这个问题时,我正在转向“如何测试黑匣子”或探测外部节点。这样做的结果,netcat无法保证。
Patrick McMahon

您能否扩展IP地址10.12.0.12?为什么在两台计算机上都使用它?
Sopalajo de Arrierez
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.