したがって、この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ポートが開いていることをどのようにして知っているのでしょうか?返事を求めているのでしょうか?
特定の出力による判断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 : "*");
udptestは、開いているソケットへの書き込みを約3回発行します。これはIPv6では機能せず、約100個のポートをチェックした後に失敗するというメモがあります。
したがって、他の提案は有効である可能性がありますが、この特定のケースではそれが起こっているとは思いません。
実際、そうではありません。次のようにして確認できます。
$ 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では、情報が返されない限り、実際に確認できるものではありません。
まあ私は別の意見を持っています:
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を使用してチェックを続けることができます。
UDPであってもポートが閉じていることを通知するICMPメッセージがあります。したがって、ホストがこのメッセージを送信した場合、ポートは閉じていると見なすことができます。
https://en.wikipedia.org/wiki/Internet_Control_Message_Protocol#Destination_unreachable