Các lựa chọn thay thế để kiểm tra các cổng mở, bên cạnh telnet là gì?


24

Chúng tôi có thể sử dụng như sau để kiểm tra cổng VIA telnet; trong ví dụ sau, chúng tôi kiểm tra cổng 6667:

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

Vì trên một số máy, chúng tôi không thể sử dụng telnet (vì lý do nội bộ) các lựa chọn thay thế để kiểm tra cổng là telnet là gì?


Perl là một lựa chọn?
Jeff Schaller

5
Những "lý do nội bộ" đó có thể ngăn bạn sử dụng phần mềm quét cổng khác. Tôi biết một anh chàng làm việc tại một ngân hàng và đã chấm dứt hợp đồng vì anh ta có một bản sao của nmap trên PC. Anh ta đang sử dụng nó cho các mục đích liên quan đến công việc, nhưng nó nằm trong danh sách bị cấm, vì vậy anh ta được hộ tống ra khỏi tòa nhà.
Roger Lipscombe

2
Perl là một lựa chọn? - CÓ
yael

2
Lưu ý rằng telnet là một giao thức tinh vi. Các telnettiện ích tắt hành vi giao thức nếu một cổng được đưa ra tại dòng lệnh. Sau đó, nó hoạt động giống như netcat, chỉ với phát hiện kết thúc dòng.
rexkogitans

Một câu hỏi bất khả tri của hệ điều hành hơn, thậm chí không gợi ý về việc quét cổng, là unix.stackexchange.com/questions/499694 .
JdeBP

Câu trả lời:


23

Nếu sử dụng Bash Shell, thì bạn có thể sử dụng tính năng của nó để kiểm tra xem một cổng đang mở hay đóng:

(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

Lưu ý rằng nếu máy chủ không phản hồi sau 1 giây thì hết thời gian chờ, các lệnh giữa 'bị gián đoạn và do đó không có gì được in.


5
Có lẽ bạn nên sử dụng tên máy chủ từ câu hỏi (kafka02) thay vì 127.0.0.1điều này làm cho nó trông giống như nó chỉ hoạt động với loopback.
Dmitry Grigoryev

1
(timeout 1 bash -c '</dev/tcp/www.google.com/444 && echo PORT OPEN || echo PORT CLOSED') 2>/dev/nullkhông in gì cho tôi (timeout 1 bash -c '</dev/tcp/www.google.com/444' && echo PORT OPEN || echo PORT CLOSED) 2>/dev/nulllàm việc như mong đợi (in PORT ĐÓNG). Lưu ý vị trí của '.
thecarpy

những gì bạn nhận được trên bash -c '</ dev / tcp / kafka01 / 6667'
yael

sau đó lặp lại $? (nếu 0 thì cổng được mở,)
yael

IIRC tính năng bash này đã từng bị vô hiệu hóa trong Debian một thời gian trước đây. Đó là một mẹo gọn gàng nhưng không phải lúc nào cũng hoạt động.
AnonymousLurker

32

netcat là một lựa chọn.

nc -zv kafka02 6667
  • -z = đặt nc chỉ đơn giản là quét tìm daemon, mà không thực sự gửi bất kỳ dữ liệu nào cho chúng
  • -v = cho phép chế độ dài dòng

Có thể có được đầu ra tiêu chuẩn từ nc? bởi vì tôi muốn viết bằng kịch bản bash của mình
yael

2
Đọc tài liệu! Không có tùy chọn nchành xử rất nhiều như thế telnet.
Henrik - ngừng làm tổn thương Monica

vâng tôi đã đọc các tài liệu nhưng -w cờ không hoạt động như thời gian chờ
yael

ví dụ - c -v -w 1 kafka01 6667 (chúng tôi không có thời gian chờ)
yael

nc -v -w 3 kafka01 6667 Ncat: Phiên bản 6.40 ( nmap.org/ncat ) Ncat: Đã kết nối với 10.164.235,85:6667. (cái này vẫn bị treo)
yael

23

Tiêu chuẩn vàng chắc chắn là nmap( nmap.org ), nhưng nó thường yêu cầu root để có kết quả tốt nhất. Tuy nhiên, nhị phân độc lập có sẵn và có thể chạy nó như một người dùng không có quyền, chỉ với khả năng bị suy giảm. Ví dụ: thay vì synquét lén lút ( -sS), nó lại quay trở lại quét kết nối TCP tiêu chuẩn (-sT ) . Đây là chức năng tương đương với netcat, nhưng với khả năng đa máy chủ tốt, khả năng tăng tốc mà nó có.

Một ví dụ:

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
trong hầu hết các tổ chức, nmap được coi là một công cụ quét và người ta không thể sử dụng nmap nếu không có sự cho phép thích hợp. Ngoài ra nếu đó là một phiên bản EC2, ủy quyền cũng được yêu cầu từ AWS.
al mamun

4

Nếu Perl là một tùy chọn, bạn có thể sử dụng IO::Socketmô-đun của nó để kiểm tra kết nối đến một máy chủ và cổng cụ thể; tập lệnh bên dưới mã cứng TCP là giao thức (đó là những gì telnet sẽ sử dụng):

#!/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"

Đầu ra mẫu từ một cổng đóng:

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

Đầu ra mẫu từ một cổng mở:

$ ./above-script kafka02 4200
Success!

2

Có thể sử dụng tệp thiết bị / dev / tcp và / dev / udp thay cho telnet. Ví dụ: echo 0> /dev/tcp/103.64.35.86/6667. Sau đó kiểm tra trạng thái thoát bằng cách sử dụng #echo $? . Nếu trạng thái thoát là 0 thì cổng được mở. Nếu trạng thái thoát là khác không thì cổng bị đóng. Để kiểm tra các gói udp, sử dụng echo 0> /dev/udp/103.64.35.86/6667.


trong phần 7 của tôi dưới / dev /, chúng tôi không có tcp
yael

ls / dev / tcp / ls: không thể truy cập / dev / tcp /: Không có tệp hoặc thư mục như vậy
yael

Bạn kiểm tra nó trên hệ điều hành nào?
yael

@yael, bạn sẽ không nhận được / dev / tcp hoặc / dev / udp trong khi ls. thử chính xác cùng một lệnh trên shell của bạn và bạn sẽ nhận được kết quả. Nhân tiện, tôi thường xuyên sử dụng nó trên RHEL6,7
al mamun 7/11/18

0
ss -lt 

đây là một lệnh khác mà bạn có thể sử dụng


Nó chỉ hoạt động cho máy cục bộ, tôi tin rằng câu hỏi đó là về việc kiểm tra các cổng mở của máy chủ từ xa.
Alex Baranowski
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.