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 อยู่หรือไม่"
Patrick McMahon

ใช่ฉันเพิ่งตรวจสอบและเห็นการเขียนเช่นกัน แก้ไขคำตอบแล้ว
rocky

@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

มีข้อความ ICMP เพื่อส่งสัญญาณว่าปิดพอร์ตแม้แต่ UDP แม้แต่พอร์ตเดียว ดังนั้นหากโฮสต์ส่งข้อความนี้จะสามารถปิดพอร์ตได้

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.

จากนั้นคุณสามารถตรวจสอบว่าการเชื่อมต่อระหว่าง a และ b บนพอร์ต udp นั้นเป็นไปได้หรือไม่ หลังจากนั้นคุณสามารถตรวจสอบได้โดยใช้ tcpdump


1
อ่าใช่ฉันชอบสิ่งนี้ เป็นวิธีที่ดีในการทดสอบว่าคุณมีสิทธิ์เข้าถึงทั้งสองโหนดหรือไม่ ฉันเดาว่าเมื่อฉันถามคำถามที่ฉันมุ่งไปที่ "วิธีทดสอบกล่องดำ" หรือตรวจสอบโหนดภายนอก ผลของการทำเช่นนั้น netcat ไม่สามารถรับประกันได้
แพทริคแม็คมาฮอน

คุณช่วยขยายที่อยู่ IP ได้10.12.0.12ไหม เหตุใดจึงใช้กับคอมพิวเตอร์ทั้งสองเครื่อง
Sopalajo de Arrierez
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.