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ポートが開いていることをどのように知っているのか誰も知っていますか?返信などを求めますか?

回答:


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

udptestは、開いているソケットへの3回の書き込みの問題を引き起こします。これはIPv6では機能せず、約100個のポートをチェックした後に失敗するという注意があります。

したがって、他の提案は有効かもしれませんが、この特定のケースではそれが起こっているとは思いません。


udptest私が探している機能もそうであり、私の質問に答えます。リンクからは提供された「* udptest()* UDPポートがあるかどうかを確認するために、いくつかの書き込みを行います」
パトリック・マクマホン

はい、私はちょうどそれをチェックし、同様に書き込みを見ました。修正された回答。
ロッキー

@PatrickMcMahon-これが質問に答えたら、大きな目盛りをクリックして受け入れます。
cas

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

UDPポートであってもポートが閉じていることを知らせるICMPメッセージがあります。したがって、ホストがこのメッセージを送信した場合、ポートは閉じられていると見なすことができます。

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


4
UDPはコネクションレスであるため、開いているポートとファイアウォールで保護されたポートを紛失したパケットから確実に区別できないことに注意してください。
マーク

本当です。また、理論的には、パケットを取得し、ポートが実際に閉じられていない可能性もあります。
phk

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は保証できません。
パトリックマクマホン

IPアドレスを拡張してください10.12.0.12。なぜ両方のコンピューターで使用されるのですか?
ソパラホデアリエレス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.