มีทางเลือกอะไรบ้างในการตรวจสอบพอร์ตที่เปิดอยู่นอกเหนือจาก telnet


24

เราสามารถใช้สิ่งต่อไปนี้เพื่อทดสอบ telnet VIA port; ในตัวอย่างต่อไปนี้เราทดสอบพอร์ต 6667:

[root@kafka03 ~]# telnet kafka02 6667
Trying 103.64.35.86...
Connected to kafka02.
Escape character is '^]'.
^CConnection closed by foreign host

เนื่องจากในเครื่องบางเครื่องเราไม่สามารถใช้ telnet (ด้วยเหตุผลภายใน) ทางเลือกอื่นในการตรวจสอบพอร์ตเป็น telnet คืออะไร


เป็นตัวเลือก?
Jeff Schaller

5
"เหตุผลภายใน" เหล่านั้นอาจขัดขวางไม่ให้คุณใช้ซอฟต์แวร์สแกนพอร์ตอื่น ๆ ฉันรู้ว่าผู้ชายคนหนึ่งทำงานที่ธนาคารและสัญญาของเขาถูกยกเลิกเพราะเขามีสำเนา nmap บนพีซีของเขา เขาใช้มันเพื่อวัตถุประสงค์ที่เกี่ยวข้องกับงาน แต่มันอยู่ในรายการที่ถูกสั่งซื้อดังนั้นเขาจึงถูกพาออกจากอาคาร
Roger Lipscombe

2
เป็นตัวเลือก? - ใช่
yael

2
โปรดทราบว่า telnet เป็นโปรโตคอลที่ซับซ้อน telnetผลัดยูทิลิตี้ปิดพฤติกรรมโปรโตคอลถ้าพอร์ตจะได้รับที่บรรทัดคำสั่ง จากนั้นมันจะทำงานคล้ายกันมากnetcatกับการตรวจจับการสิ้นสุดบรรทัด
rexkogitans

ขึ้นระบบปฏิบัติการคำถามไม่เชื่อเรื่องพระเจ้าที่ไม่ได้แบะท่าสแกนพอร์ตเป็นunix.stackexchange.com/questions/499694
JdeBP

คำตอบ:


23

หากใช้ Bash Shell คุณสามารถใช้คุณสมบัติเพื่อตรวจสอบว่าพอร์ตเปิดหรือปิด:

(timeout 1 bash -c '</dev/tcp/127.0.0.1/17500 && echo PORT OPEN || echo PORT CLOSED') 2>/dev/null
PORT OPEN

(timeout 1 bash -c '</dev/tcp/127.0.0.1/7500 && echo PORT OPEN || echo PORT CLOSED') 2>/dev/null
PORT CLOSED

โปรดทราบว่าหากเซิร์ฟเวอร์ไม่ตอบสนองหลังจาก 1 วินาทีถึงการหมดเวลาคำสั่งระหว่างการ'ขัดจังหวะและทำให้ไม่มีการพิมพ์


5
บางทีคุณควรใช้ชื่อโฮสต์จากคำถาม (kafka02) แทน127.0.0.1ซึ่งทำให้ดูเหมือนว่าใช้ได้กับลูปแบ็คเท่านั้น
Dmitry Grigoryev

1
(timeout 1 bash -c '</dev/tcp/www.google.com/444 && echo PORT OPEN || echo PORT CLOSED') 2>/dev/nullพิมพ์อะไรเลยสำหรับฉัน (timeout 1 bash -c '</dev/tcp/www.google.com/444' && echo PORT OPEN || echo PORT CLOSED) 2>/dev/nullทำงานได้ตามที่คาดไว้ (พิมพ์ PORT CLOSED) 'หมายเหตุสถานที่ตั้งของ
thecarpy

สิ่งที่คุณจะได้รับจาก bash -c '</ dev / tcp / kafka01 / 6667'
yael

แล้วสะท้อน $? (ถ้า 0 ดังนั้นพอร์ตจะเปิด)
yael

IIRC คุณลักษณะทุบตีนี้เคยถูกปิดการใช้งานใน Debian มาก่อน มันเป็นกลลวง แต่ไม่ได้ผลเสมอไป
AnonymousLurker

32

netcat เป็นตัวเลือกหนึ่ง

nc -zv kafka02 6667
  • -z = ตั้งค่า nc ให้สแกนเพื่อฟัง daemons โดยไม่ต้องส่งข้อมูลใด ๆ ไปยังพวกเขา
  • -v = เปิดใช้งานโหมด verbose

เป็นไปได้หรือไม่ที่จะได้รับเอาต์พุตมาตรฐานจาก nc? เพราะฉันต้องการเขียนในสคริปต์ทุบตีของฉัน
yael

2
อ่านเอกสาร! โดยไม่มีตัวเลือกทำงานมากเช่นnc telnet
Henrik - หยุดทำร้ายโมนิก้า

ใช่ฉันอ่านเอกสารแล้ว แต่แฟ
ล็ก

ตัวอย่าง - c -v -w 1 kafka01 6667 (เราไม่ได้หยุดพัก)
yael

nc -v -w 3 kafka01 6667 Ncat: เวอร์ชัน 6.40 ( nmap.org/ncat ) Ncat: เชื่อมต่อกับ 10.164.235.85:6667 (สิ่งนี้ยังคงแขวนอยู่)
yael

23

มาตรฐานทองคำคือไม่ต้องสงสัยnmap( nmap.org ) แต่โดยทั่วไปจะต้องใช้รากเพื่อ "ผลลัพธ์ที่ดีที่สุด" อย่างไรก็ตามไบนารีแบบสแตนด์อโลนพร้อมใช้งานและเป็นไปได้ที่จะเรียกใช้ในฐานะผู้ใช้ที่ไม่มีสิทธิพิเศษเพียงแค่มีความสามารถที่ลดลง ตัวอย่างเช่นแทนที่จะsynสแกนแบบไม่ลงรอยกัน( -sS) จะกลับไปใช้การสแกนการเชื่อมต่อ TCP แบบมาตรฐาน ( -sT) สิ่งนี้เทียบเท่ากับ netcat แต่มีความสามารถในการเร่งความเร็วหลายโฮสต์ที่ดี

ตัวอย่าง:

not-root$ nmap -sT google.com
Starting Nmap 7.70 ( https://nmap.org ) at 2018-11-04 21:01 GMT
Nmap scan report for google.com (172.217.23.14)
Host is up (0.12s latency).
rDNS record for 172.217.23.14: lhr35s01-in-f14.1e100.net
Not shown: 998 filtered ports
PORT    STATE SERVICE
80/tcp  open  http
443/tcp open  https

1
ในองค์กรส่วนใหญ่ nmap ถือเป็นเครื่องมือสแกนและไม่สามารถใช้ nmap โดยไม่ได้รับการอนุญาตที่เหมาะสม นอกจากนี้หากเป็นอินสแตนซ์ EC2 ต้องได้รับอนุญาตจาก AWS ด้วย
al mamun

4

หาก Perl เป็นตัวเลือกคุณสามารถใช้IO::Socketโมดูลเพื่อทดสอบการเชื่อมต่อกับโฮสต์และพอร์ตเฉพาะ สคริปต์ด้านล่างฮาร์ดโค้ด TCP เป็นโปรโตคอล (ซึ่งเป็นสิ่งที่ telnet จะใช้):

#!/usr/bin/perl -w

# tries to connect to the given IP and port (tcp)

use strict;
use IO::Socket;

my $desthost = shift or die "Usage: $0 host port\n";
my $destport = shift or die "Usage: $0 host port\n";

gethostbyname($desthost) || die "Invalid host given\n";

my $handle = IO::Socket::INET->new(
        PeerAddr => $desthost,
        PeerPort => $destport,
        Proto    => 'tcp')
    or die "can't connect to $desthost:$destport: $!\n";
close $handle;
print "Success!\n"

เอาต์พุตตัวอย่างจากพอร์ตปิด:

$ ./above-script kafka02 6667
can't connect to kafka02:6667: Connection refused

เอาต์พุตตัวอย่างจากพอร์ตที่เปิด:

$ ./above-script kafka02 4200
Success!

2

ไฟล์อุปกรณ์ / dev / tcp และ / dev / udp สามารถใช้แทน telnet ตัวอย่าง: echo 0> /dev/tcp/103.64.35.86/6667 จากนั้นตรวจสอบสถานะการออกโดยใช้ #echo $? . หากสถานะออกเป็น 0 พอร์ตจะเปิดขึ้น หากสถานะการออกไม่เป็นศูนย์จะปิดพอร์ต สำหรับการตรวจสอบแพ็กเก็ต udp ให้ใช้ echo 0> /dev/udp/103.64.35.86/6667


ใน redhat 7 ของฉันภายใต้ / dev /, เราไม่มี tcp
yael

ls / dev / tcp / ls: ไม่สามารถเข้าถึง / dev / tcp /: ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว
yael

คุณทดสอบระบบปฏิบัติการใด
yael

@ Yael คุณจะไม่ได้รับ / dev / tcp หรือ / dev / udp ในขณะที่ ls ลองใช้คำสั่งเดียวกันบนเชลล์ของคุณและคุณจะได้ผลลัพธ์ โดยวิธีการฉันใช้บ่อยใน RHEL6
al mamun

0
ss -lt 

นี่เป็นอีกคำสั่งที่คุณสามารถใช้ได้


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