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

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

所以我可以使用这个 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 端口是否打开?它是否要求回复或类似的东西?

答案1

事实上,事实并非如此。您可以通过执行以下操作来检查:

$ 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,您无法真正检查它,除非它会给您返回信息。

答案2

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 : "*");

UDP测试大约 3 次写入打开的套接字时出现问题。请注意,这不适用于 IPv6,并且在检查大约 100 个端口后会失败。

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

答案3

嗯,我有不同的看法:

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 检查。

答案4

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

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

相关内容