Làm thế nào để netcat biết nếu một cổng UDP được mở?


49

Vì vậy, tôi có thể sử dụng lệnh netcat này để kiểm tra xem cổng UDP có mở không:

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

Không giống như TCP, UDP là không kết nối (cháy và quên). Vậy ở cấp độ cao có ai biết làm thế nào netcat biết cổng UDP đang mở không? Nó yêu cầu trả lời hoặc một cái gì đó như thế?

Câu trả lời:


17

Đánh giá theo đầu ra cụ thể Connection to Connection to 10.1.0.100 53 port [udp/domain] succeeded!mà bạn đang sử dụng openbsd-netcat.

Nhìn vào mã để kiểm tra là liên kết với ổ cắm UDP, tức là có một kết nối mở:

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

vấn đề udptest khoảng 3 ghi vào ổ cắm mở. Có một lưu ý rằng điều này không hoạt động đối với IPv6 và đã thất bại sau khoảng 100 cổng được kiểm tra.

Vì vậy, trong khi đề xuất khác có thể hợp lệ, tôi không nghĩ điều đó xảy ra trong trường hợp cụ thể này.


nên udptestlà hàm Tôi đang tìm kiếm và nó trả lời câu hỏi của tôi. Từ liên kết bạn đã cung cấp "* udptest () * Thực hiện một vài lần ghi để xem cổng UDP có ở đó không"
Patrick McMahon

Vâng, tôi chỉ kiểm tra điều đó và thấy các bài viết là tốt. Sửa lại câu trả lời.
đá

@PatrickMcMahon - nếu điều này trả lời câu hỏi của bạn, thì hãy chấp nhận nó bằng cách nhấp vào đánh dấu lớn.
cas

17

Trong thực tế, nó không. Bạn có thể kiểm tra bằng cách thực hiện:

$ 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!
$ 

Vì vậy, với UDP, đó không phải là thứ bạn thực sự có thể kiểm tra trừ khi nó sẽ cung cấp lại cho bạn thông tin.


9

Có một thông báo ICMP để báo hiệu rằng một cổng, thậm chí là một UDP, đã bị đóng. Vì vậy, nếu một máy chủ gửi tin nhắn này thì cổng có thể được coi là bị đóng.

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


4
Lưu ý rằng vì UDP không có kết nối, bạn không thể phân biệt một cách đáng tin cậy một cổng mở với một cổng được tường lửa với một gói bị mất.
Đánh dấu

Rất đúng. Và về mặt lý thuyết cũng có thể là bạn nhận được gói và cổng không thực sự đóng.
phk

9

Vâng, tôi có ý kiến ​​khác:

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.

Vì vậy, dựa vào đó, bạn có thể kiểm tra xem kết nối giữa a và b trên cổng udp đó có khả thi hay không. Sau này bạn có thể tiếp tục kiểm tra bằng tcpdump.


1
À vâng tôi thích điều này. Đây là một cách tốt để kiểm tra nếu bạn có quyền truy cập vào cả hai nút. Tôi đoán khi tôi hỏi câu hỏi tôi đang hướng tới "cách kiểm tra hộp đen" hoặc thăm dò một nút bên ngoài. Kết quả của việc đó, netcat không thể đảm bảo.
Patrick McMahon

Bạn có thể vui lòng mở rộng địa chỉ IP 10.12.0.12không? Tại sao nó được sử dụng trên cả hai máy tính?
Sopalajo de Arrierez
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.