Відповіді:
Ви не можете пінг-портів, оскільки Ping використовує ICMP, який не має поняття портів. Порти належать до протоколів транспортного рівня, таких як TCP і UDP. Однак ви можете використовувати nmap, щоб побачити, чи відкриті порти чи ні
nmap -p 80 example.com
Редагувати: Як згадувала флокра, nmap - це більше, ніж просто вміст ping-for-ports. Це ревізори безпеки та хакери - найкращий друг і постачається з великою кількістю класних варіантів. Перевірте документ на всі можливі прапори.
-PN
щоб пропустити відкриття хоста nmap, як правило, перед тестуванням заданого порту.
nmap windows
), АЛЕ це не працює над VPN. Здається, PaPing не міг сканувати діапазон адрес. Нижче я опублікував скрипт Python, який буде працювати над VPN, щоб сканувати діапазон портів для діапазону адрес.
brew install nmap
або MacPorts.
Відкрийте сеанс telnet для конкретного порту, наприклад:
# telnet google.com 80
Trying 74.125.226.48...
Connected to google.com.
Escape character is '^]'.
Щоб закрити сеанс, натисніть Ctrl+ ].
netcat
також чудово працює і є менш багатослівним.
netcat
зараз вбудована MacOS HighSierra, де telnet можна встановити з HomeBrewbrew install telnet
$ nc -vz google.com 80
Connection to google.com 80 port [tcp/http] succeeded!
time
як у, time nc -vz www.example.com 80
і ви також матимете своєрідну RTT.
Якщо ви перебуваєте у встановленні Windows з поглибленням v4 або новішою версією, ви можете використовувати модуль тестової підключення powerhell:
Test-NetConnection <host> -port <port>
Приклад: Test-NetConnection example.com -порт 80
Цей командлет також має псевдонім tnc
. Напрtnc example.com -port 80
Ви можете використовувати PaPing:
http://code.google.com/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 *
для постійного папірування (?).
Ні, ви не можете, тому що ping
використовує протокол ICMP , який навіть не має поняття портів.
Спробуйте curl
команду, наприклад:
$ curl host:port
Наприклад:
$ curl -s localhost:80 >/dev/null && echo Success. || echo Fail.
Success.
Наведена вище команда поверне Fail у ненульових кодах статусу виходу. У деяких окремих випадках, наприклад, порожній або некоректний відповідь (див man curl
), ви можете обробляти спеціальні коди виходу успішних, тому , будь ласка , перевірте цей пост для більш докладного пояснення.
curl
він за замовчуванням присутній у CentOS, тому мені нічого не потрібно встановлювати.
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."
Я знайшов більш просте рішення за допомогою PsPing:
psping 192.168.2.2:5000
Це частина Windows Sysinternals .
PsPing реалізує функціональність Ping, вимірювання затримки та пропускну здатність TCP.
У Linux ви можете використовувати hping, але він використовує TCP, а не ICMP.
hping example.com -S -V -p 80
flags=SA
(тобто SYN ACK), а якщо він закритий, ви отримуєте flags=SR
(тобто SYN RST). Зауважте, що вам, напевно, тут не потрібен -V
прапор, але для запуску hping вам потрібен sudo / root.
ping
і пінг до зупинки.
Ping дуже специфічний, але якщо ви хочете перевірити, чи відкритий порт чи ні, чи працює у вас вікно Windows, то PortQry - ваш друг.
Я використовував його лише для тестування контролерів домену на проблеми з підключенням, але він працював для цього, тому він повинен працювати для вас.
Ось швидкий і брудний додаток .NET консолі:
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();
}
}
Я повністю впевнений, що зонд Nagios check_tcp робить те, що ви хочете. Їх можна знайти тут, і хоча вони розроблені для використання в контексті Nagios, всі вони є окремими програмами.
$ ./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
Це єдине рішення, яке працює для VPN з клієнтською машиною Windows Vista або Windows 7 , оскільки інші перелічені відповіді просто не функціонують. Ця відповідь раніше була видалена і не повинна була бути, оскільки це єдине рішення для спільної справи в реальному світі. Оскільки для видалення немає жодної апеляції, я репостую, щоб врятувати інших розчарування, намагаючись використати інші відповіді.
У наведеному нижче прикладі встановлено, які IP-адреси в VPN, у яких VNC / порт 5900 відкритий разом із клієнтом, що працює в Windows 7.
Короткий сценарій Python (v2.6.6) для сканування заданого списку IP-адрес та портів:
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."
Результати виглядали так:
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.
Чотири змінних у верхній частині потрібно змінити, щоб відповідати будь-якому потрібному часу, мережі, хостам і портам. 5,0 секунди на моєму VPN здавалося достатньою для належної роботи, менше не завжди (завжди) давала точні результати. У моїй локальній мережі 0,5 було більш ніж достатньо.
Для цього є lightweigth інструмент, який називається tcping: http://www.linuxco.de/tcping/tcping.html
У оболонці Bash можна використовувати файл псевдо-пристрою TCP , наприклад:
</dev/tcp/serverfault.com/80 && echo Port open || echo Port closed
Ось версія, що реалізує тайм-аут 1 секунду:
timeout 1 bash -c "</dev/tcp/serverfault.com/81" && echo Port open || echo Port closed
Якщо ви використовуєте операційну систему * nix, спробуйте встановити та використовувати «zenmap», це графічний інтерфейс для nmap і має кілька корисних профілів сканування, які є чудовою допомогою новому користувачеві.