Odpowiedzi:
Nie możesz pingować portów, ponieważ Ping używa ICMP, który nie ma pojęcia portów. Porty należą do protokołów warstwy transportowej, takich jak TCP i UDP. Można jednak użyć nmap, aby sprawdzić, czy porty są otwarte, czy nie
nmap -p 80 example.com
Edycja: Jak wspomniano o flokrze, nmap jest czymś więcej niż tylko pingowaniem dla portów. Jest najlepszym przyjacielem audytorów bezpieczeństwa i hakerów i oferuje mnóstwo ciekawych opcji. Sprawdź w dokumencie wszystkie możliwe flagi.
-PN
aby pominąć wykrywanie hosta nmap zwykle robi przed przetestowaniem danego portu.
nmap windows
), ALE to nie działa w sieci VPN. Wydawało się, że PaPing nie był w stanie zeskanować zakresu adresów. Poniżej zamieściłem skrypt Pythona, który będzie działał przez VPN, aby skanować zakres portów na różnych adresach.
brew install nmap
lub MacPorts.
Otwórz sesję telnet na określonym porcie, na przykład:
# telnet google.com 80
Trying 74.125.226.48...
Connected to google.com.
Escape character is '^]'.
Aby zamknąć sesję, naciśnij Ctrl+ ].
netcat
działa również świetnie i jest mniej gadatliwy.
netcat
jest teraz wbudowany w MacOS HighSierra, w którym telnet można zainstalować z HomeBrewbrew install telnet
$ nc -vz google.com 80
Connection to google.com 80 port [tcp/http] succeeded!
time
podobnymi, time nc -vz www.example.com 80
a będziesz mieć też rodzaj RTT.
Jeśli korzystasz z instalacji systemu Windows z PowerShell v4 lub nowszą wersją, możesz użyć modułu PowerShell połączenia test-netconnection:
Test-NetConnection <host> -port <port>
Przykład: Test-NetConnection example.com -port 80
To polecenie cmdlet ma również alias tnc
. Na przykładtnc example.com -port 80
Możesz użyć 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 *
do ciągłego tapetowania (?).
Nie, nie możesz, ponieważ ping
używa protokołu ICMP , który nawet nie ma pojęcia portów.
Wypróbuj curl
polecenie, takie jak:
$ curl host:port
Na przykład:
$ curl -s localhost:80 >/dev/null && echo Success. || echo Fail.
Success.
Powyższe polecenie zwróci Fail na niezerową kodów stanu wyjść. W niektórych szczególnych przypadkach, takich jak pusta lub źle sformułowana odpowiedź (patrz man curl
), możesz chcieć obsłużyć określone kody wyjścia jako udane, więc sprawdź ten post, aby uzyskać bardziej szczegółowe wyjaśnienia.
curl
jest domyślnie obecny w CentOS, więc nie muszę niczego instalować.
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."
Znalazłem prostsze rozwiązanie za pomocą PsPing:
psping 192.168.2.2:5000
Jest częścią Windows Sysinternals .
PsPing implementuje funkcjonalność Ping, ping ping, pomiar opóźnienia i przepustowości.
W systemie Linux możesz użyć hping, ale używa on TCP, a nie ICMP.
hping example.com -S -V -p 80
flags=SA
(tj. SYN ACK), a jeśli jest zamknięty, otrzymasz flags=SR
(tj. SYN RST). Zauważ, że prawdopodobnie nie potrzebujesz -V
tutaj flagi, ale potrzebujesz sudo / root, aby uruchomić hping.
ping
ping i ping, aż do zatrzymania.
Ping jest bardzo specyficzny, ale jeśli chcesz sprawdzić, czy port jest otwarty, czy nie i używasz systemu Windows, PortQry jest twoim przyjacielem.
Użyłem go tylko do testowania kontrolerów domeny pod kątem problemów z łącznością, ale działało to na szczęście, więc powinno działać dla ciebie.
Oto szybka i brudna aplikacja konsoli .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();
}
}
Jestem pewien, że sonda Nagios check_tcp robi to, co chcesz. Można je znaleźć tutaj i chociaż zostały zaprojektowane do użycia w kontekście Nagios, wszystkie są samodzielnymi programami.
$ ./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
Jest to jedyne rozwiązanie, które działa w przypadku sieci VPN z komputerem klienckim z systemem Windows Vista lub Windows 7 , ponieważ inne wymienione odpowiedzi po prostu nie działają. Ta odpowiedź została wcześniej usunięta i nie powinna była być, ponieważ jest to jedyne rozwiązanie w typowym przypadku w świecie rzeczywistym. Ponieważ nie ma odwołania do usunięcia, odkładam go ponownie, aby zaoszczędzić innym frustracji związanej z próbą użycia innych odpowiedzi.
Poniższy przykład pokazuje, które adresy IP w sieci VPN, które mają VNC / port 5900, otwierają się przy kliencie z systemem Windows 7.
Krótki skrypt Pythona (v2.6.6) do skanowania danej listy adresów IP i portów:
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."
Wyniki wyglądały następująco:
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.
Cztery zmienne u góry powinny zostać zmienione, aby były odpowiednie dla potrzebnego limitu czasu, sieci, hostów i portów. Wydawało się, że 5,0 sekund w mojej sieci VPN wystarcza do prawidłowego działania, mniej (nie zawsze) daje dokładne wyniki. W mojej sieci lokalnej 0,5 było więcej niż wystarczające.
Jest do tego lekkie narzędzie o nazwie tcping: http://www.linuxco.de/tcping/tcping.html
W powłoce Bash możesz użyć pliku pseudo-urządzenia TCP , na przykład:
</dev/tcp/serverfault.com/80 && echo Port open || echo Port closed
Oto wersja implementująca limit czasu 1 sekundy:
timeout 1 bash -c "</dev/tcp/serverfault.com/81" && echo Port open || echo Port closed
Jeśli używasz systemu operacyjnego * nix, spróbuj zainstalować i używać „zenmap”, jest to GUI dla nmap i ma kilka przydatnych profili skanowania, które są wielką pomocą dla nowego użytkownika.