Câu trả lời:
Bạn không thể ping cổng, vì Ping đang sử dụng ICMP không có khái niệm về cổng. Các cổng thuộc về các giao thức lớp vận chuyển như TCP và UDP. Tuy nhiên, bạn có thể sử dụng nmap để xem các cổng có mở hay không
nmap -p 80 example.com
Chỉnh sửa: Như flokra đã đề cập, nmap không chỉ là một ping-for-port-thingy. Đó là người bạn tốt nhất của kiểm toán viên và tin tặc và đi kèm với vô số lựa chọn thú vị. Kiểm tra tài liệu cho tất cả các cờ có thể.
-PN
để bỏ qua nmap khám phá máy chủ thường làm trước khi kiểm tra cổng đã cho.
nmap windows
), NHƯNG nó không hoạt động trên VPN. PaPing dường như không thể quét một loạt địa chỉ. Tôi đã đăng tập lệnh Python bên dưới sẽ hoạt động trên VPN để quét một loạt các cổng trên một loạt địa chỉ.
brew install nmap
hoặc MacPorts.
Mở một phiên telnet đến cổng cụ thể, ví dụ:
# telnet google.com 80
Trying 74.125.226.48...
Connected to google.com.
Escape character is '^]'.
Để đóng phiên của bạn, nhấn Ctrl+ ].
netcat
công trình cũng tuyệt vời và ít dài dòng.
netcat
hiện đã được tích hợp sẵn MacOS HighSierra, trong đó telnet có thể được cài đặt từ brew install telnet
$ nc -vz google.com 80
Connection to google.com 80 port [tcp/http] succeeded!
time
like trong time nc -vz www.example.com 80
và bạn cũng sẽ có một loại RTT.
Nếu bạn đang cài đặt windows với powershell v4 hoặc mới hơn, bạn có thể sử dụng mô-đun powershell kết nối mạng thử nghiệm:
Test-NetConnection <host> -port <port>
Ví dụ: Test-NetConnection example.com -port 80
Lệnh ghép này cũng có bí danh tnc
. Ví dụtnc example.com -port 80
Bạn có thể sử dụng PaPing:
http://code.google.com.vn/p/paping
C:\>paping.exe www.google.com -p 80 -c 4
paping v1.5.1 - Copyright (c) 2010 Mike Lovell
Connecting to www.l.google.com [209.85.225.147] on TCP 80:
Connected to 209.85.225.147: time=24.00ms protocol=TCP port=80
Connected to 209.85.225.147: time=25.00ms protocol=TCP port=80
Connected to 209.85.225.147: time=24.00ms protocol=TCP port=80
Connected to 209.85.225.147: time=24.00ms protocol=TCP port=80
Connection statistics:
Attempted = 4, Connected = 4, Failed = 0 (0.00%)
Approximate connection times:
Minimum = 24.00ms, Maximum = 25.00ms, Average = 24.25ms
-c *
để tạo hình liên tục (?).
Không, bạn không thể, bởi vì ping
sử dụng giao thức ICMP , thậm chí không có khái niệm về cổng.
Hãy thử curl
lệnh, như:
$ curl host:port
Ví dụ:
$ curl -s localhost:80 >/dev/null && echo Success. || echo Fail.
Success.
Lệnh trên sẽ trả về Fail trên mã trạng thái thoát khác không. Trong một số trường hợp cụ thể, chẳng hạn như phản hồi trống hoặc không đúng định dạng (xem man curl
), bạn có thể muốn xử lý các mã thoát cụ thể là thành công, vì vậy vui lòng kiểm tra bài đăng này để được giải thích chi tiết hơn.
curl
hiện diện theo mặc định trên CentOS, vì vậy tôi không phải cài đặt bất cứ thứ gì.
IP="<ip>" ; PORT="<port>" ; curl -s "$IP:$PORT" > /dev/null && echo "Success connecting to $IP on port $PORT." || echo "Failed to connect to $IP on port $PORT."
Tôi tìm thấy một giải pháp đơn giản hơn bằng cách sử dụng PsPing:
psping 192.168.2.2:5000
Đây là một phần của Windows Sysiternals .
PsPing thực hiện chức năng Ping, ping TCP, độ trễ và đo băng thông.
Trên Linux, bạn có thể sử dụng hping nhưng nó sử dụng TCP, thay vì ICMP.
hping example.com -S -V -p 80
flags=SA
(tức là SYN ACK) và nếu nó đóng, bạn sẽ nhận được flags=SR
(tức là SYN RST). Lưu ý rằng bạn có thể không cần -V
cờ ở đây, nhưng bạn cần sudo / root để chạy hping.
ping
và ping cho đến khi dừng lại.
Ping rất cụ thể nhưng nếu bạn muốn kiểm tra xem một cổng có mở hay không và đang chạy một hộp Windows thì PortQry là bạn của bạn.
Tôi chỉ sử dụng nó để kiểm tra Bộ kiểm soát miền cho các vấn đề kết nối, nhưng nó đã xử lý được vấn đề đó, vì vậy sẽ hiệu quả với bạn.
Đây là một ứng dụng bảng điều khiển .NET nhanh và bẩn:
static void Main(string[] args)
{
string addressArgument = null, portArgument = null;
System.Net.Sockets.TcpClient tcpClient = null;
try
{
addressArgument = args[0];
portArgument = args[1];
int portNumber;
portNumber = Int32.Parse(portArgument);
tcpClient = new System.Net.Sockets.TcpClient();
tcpClient.ReceiveTimeout = tcpClient.SendTimeout = 2000;
IPAddress address;
if (IPAddress.TryParse(args[0], out address))
{
var endPoint = new System.Net.IPEndPoint(address, portNumber);
tcpClient.Connect(endPoint);
}
else
{
tcpClient.Connect(addressArgument, portNumber);
}
Console.WriteLine("Port {0} is listening.", portArgument);
}
catch (Exception e)
{
if (e is SocketException || e is TimeoutException)
{
Console.WriteLine("Not listening on port {0}.", portArgument);
}
else
{
Console.WriteLine("Usage:");
Console.WriteLine(" portquery [host|ip] [port]");
}
}
finally
{
if (tcpClient != null)
tcpClient.Close();
}
}
Tôi khá chắc chắn rằng thăm dò Nag_t check_tcp làm những gì bạn muốn. Chúng có thể được tìm thấy ở đây và mặc dù được thiết kế để sử dụng trong bối cảnh Nagios, nhưng tất cả chúng đều là các chương trình độc lập.
$ ./check_tcp -H host -p 22
TCP OK - 0.010 second response time on port 22|time=0.009946s;0.000000;0.000000;0.000000;10.000000
Đây là giải pháp duy nhất hoạt động cho VPN với máy khách là Windows Vista hoặc Windows 7 , vì các câu trả lời được liệt kê khác đơn giản là không hoạt động. Câu trả lời này đã bị xóa trước đây và không nên có, vì đây là giải pháp duy nhất cho một trường hợp phổ biến trong thế giới thực. Vì không có kháng cáo có sẵn cho việc xóa, tôi đang đăng lại nó để cứu người khác sự thất vọng mà tôi đã có khi cố gắng sử dụng các câu trả lời khác.
Ví dụ dưới đây tìm thấy IP nào trên VPN có VNC / port 5900 mở với máy khách đang chạy trên Windows 7.
Tập lệnh Python ngắn (v2.6.6) để quét danh sách IP và Cổng đã cho:
from socket import *
fTimeOutSec = 5.0
sNetworkAddress = '192.168.1'
aiHostAddresses = range(1,255)
aiPorts = [5900]
setdefaulttimeout(fTimeOutSec)
print "Starting Scan..."
for h in aiHostAddresses:
for p in aiPorts:
s = socket(AF_INET, SOCK_STREAM)
address = ('%s.%d' % (sNetworkAddress, h))
result = s.connect_ex((address,p))
if ( 0 == result ):
print "%s:%d - OPEN" % (address,p)
elif ( 10035 == result ):
#do nothing, was a timeout, probably host doesn't exist
pass
else:
print "%s:%d - closed (%d)" % (address,p,result)
s.close()
print "Scan Completed."
Kết quả trông giống như:
Starting Scan...
192.168.1.1:5900 - closed (10061)
192.168.1.7:5900 - closed (10061)
192.168.1.170:5900 - OPEN
192.168.1.170:5900 - closed (10061)
Scan Completed.
Bốn biến ở trên cùng sẽ cần phải được thay đổi để phù hợp với bất kỳ thời gian chờ, mạng, máy chủ và cổng nào cần thiết. 5,0 giây trên VPN của tôi dường như đủ để hoạt động ổn định, ít (không) luôn cho kết quả chính xác. Trên mạng cục bộ của tôi, 0,5 là quá đủ.
Có một công cụ lightweigth cho nó, được gọi là tcping: http://www.linuxco.de/tcping/tcping.html
Trong shell Bash, bạn có thể sử dụng tệp giả thiết bị TCP , ví dụ:
</dev/tcp/serverfault.com/80 && echo Port open || echo Port closed
Đây là phiên bản thực hiện thời gian chờ là 1 giây:
timeout 1 bash -c "</dev/tcp/serverfault.com/81" && echo Port open || echo Port closed
Nếu bạn đang chạy hệ điều hành * nix, hãy thử cài đặt và sử dụng "zenmap", đó là GUI cho nmap và có một số cấu hình quét hữu ích giúp ích rất nhiều cho người dùng mới.