Ответы:
Вы не можете пинговать порты, так как Ping использует ICMP, который не имеет понятия портов. Порты принадлежат протоколам транспортного уровня, таким как TCP и UDP. Тем не менее, вы можете использовать nmap, чтобы увидеть, открыты порты или нет
nmap -p 80 example.com
Редактировать: как уже упоминалось flokra, nmap - это больше, чем просто ping-for-ports-thingy. Это лучший друг аудиторов и хакеров безопасности, и он предлагает множество интересных вариантов. Проверьте документ на все возможные флаги.
-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 с powershell v4 или новее, вы можете использовать модуль powershell test-netconnection:
Test-NetConnection <host> -port <port>
Пример: Test-NetConnection example.com -port 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 *
для постоянного papinging (?).
Нет, вы не можете, потому что 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 ping, задержку и измерение пропускной способности.
В Linux вы можете использовать hping, но он использует TCP, а не ICMP.
hping example.com -S -V -p 80
flags=SA
(т.е. SYN ACK), а если он закрыт, вы получаете flags=SR
(т.е. SYN RST). Обратите внимание, что вам, вероятно, здесь не нужен -V
флаг, но вам нужен sudo / root для запуска hping.
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();
}
}
Нет.
Там нет никакой гарантии, что служба, работающая на порту, понимает пинг. Это также открывает вопрос о том, какой «вкус» порта вы хотите пинговать, TCP или UDP? Поскольку пинг «протокол» не использует ни один (пинг реализован с использованием ICMP ), это не имеет большого смысла.
Я совершенно уверен, что 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 было более чем достаточно.
Для этого есть облегченный инструмент, который называется 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 и несколько полезных профилей сканирования, которые очень помогут новому пользователю.