Jawaban:
Anda tidak dapat melakukan ping port, karena Ping menggunakan ICMP yang tidak memiliki konsep port. Port milik protokol transport layer seperti TCP dan UDP. Namun, Anda bisa menggunakan nmap untuk melihat apakah port terbuka atau tidak
nmap -p 80 example.com
Sunting: Seperti yang disebutkan flokra, nmap lebih dari sekadar ping-for-ports-thingy. Ini adalah pengawas keamanan dan peretas sahabat terbaik dan dilengkapi dengan banyak opsi keren. Periksa dokumen untuk semua kemungkinan bendera.
-PN
untuk melewati penemuan host yang biasanya dilakukan nmap sebelum menguji port yang diberikan.
nmap windows
), TETAPI itu tidak berfungsi pada VPN. PaPing tampaknya tidak dapat memindai berbagai alamat. Saya telah memposting skrip Python di bawah ini yang akan berfungsi melalui VPN untuk memindai berbagai port pada berbagai alamat.
brew install nmap
atau MacPorts.
Buka sesi telnet ke port tertentu, misalnya:
# telnet google.com 80
Trying 74.125.226.48...
Connected to google.com.
Escape character is '^]'.
Untuk menutup sesi Anda, tekan Ctrl+ ].
netcat
bekerja juga bagus dan kurang verbose.
netcat
sekarang built-in MacOS HighSierra, di mana telnet dapat diinstal dari HomeBrewbrew install telnet
$ nc -vz google.com 80
Connection to google.com 80 port [tcp/http] succeeded!
time
suka di time nc -vz www.example.com 80
dan Anda akan memiliki semacam RTT juga.
Jika Anda berada di instalasi windows dengan powershell v4 atau yang lebih baru, Anda dapat menggunakan modul powershell test-netconnection:
Test-NetConnection <host> -port <port>
Contoh: Test-NetConnection example.com -port 80
Cmdlet ini juga memiliki alias tnc
. Misalnyatnc example.com -port 80
Anda dapat menggunakan 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 *
untuk paping konstan (?).
Tidak, Anda tidak bisa, karena ping
menggunakan protokol ICMP , yang bahkan tidak memiliki konsep port.
Coba curl
perintah, seperti:
$ curl host:port
Sebagai contoh:
$ curl -s localhost:80 >/dev/null && echo Success. || echo Fail.
Success.
Perintah di atas akan mengembalikan Gagal pada kode status keluar non-nol. Dalam beberapa kasus tertentu, seperti respons kosong atau cacat (lihat man curl
), Anda mungkin ingin menangani kode keluar tertentu sebagai berhasil, jadi silakan periksa posting ini untuk penjelasan lebih rinci.
curl
hadir secara default pada CentOS, jadi saya tidak perlu menginstal apa pun.
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."
Saya menemukan solusi yang lebih sederhana menggunakan PsPing:
psping 192.168.2.2:5000
Itu bagian dari Windows Sysinternals .
PsPing mengimplementasikan fungsionalitas Ping, ping TCP, latensi dan pengukuran bandwidth.
Di Linux Anda dapat menggunakan hping tetapi menggunakan TCP, bukan ICMP.
hping example.com -S -V -p 80
flags=SA
(yaitu SYN ACK), dan jika ditutup Anda dapatkan flags=SR
(yaitu SYN RST). Perhatikan bahwa Anda mungkin tidak perlu -V
bendera di sini, tetapi Anda perlu sudo / root untuk menjalankan hping.
ping
dan ping sampai berhenti.
Ping sangat spesifik tetapi jika Anda ingin memeriksa apakah port terbuka atau tidak, dan menjalankan kotak Windows maka PortQry adalah teman Anda.
Saya hanya menggunakannya untuk menguji Pengontrol Domain untuk masalah konektivitas, tapi itu berhasil untuk itu, jadi seharusnya bekerja untuk Anda.
Berikut adalah aplikasi konsol .NET yang cepat dan kotor:
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();
}
}
Tidak.
Tidak ada jaminan bahwa layanan yang berjalan di port memahami ping. Ini juga membuka pertanyaan tentang "rasa" port apa yang ingin Anda ping, TCP atau UDP? Karena ping "protokol" tidak menggunakan keduanya (ping diimplementasikan menggunakan ICMP ), itu tidak masuk akal.
Saya cukup yakin bahwa pemeriksaan Nagios check_tcp melakukan apa yang Anda inginkan. Mereka dapat ditemukan di sini dan meskipun dirancang untuk digunakan dalam konteks Nagios, mereka semua adalah program mandiri.
$ ./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
Ini adalah satu - satunya solusi yang berfungsi untuk VPN dengan mesin klien menjadi Windows Vista atau Windows 7 , karena jawaban yang terdaftar lainnya tidak berfungsi. Jawaban ini sebelumnya dihapus dan seharusnya tidak, karena ini adalah satu-satunya solusi untuk kasus umum dunia nyata. Karena tidak ada banding yang tersedia untuk penghapusan, saya mengepos ulang untuk menyelamatkan orang lain dari frustrasi yang saya miliki ketika mencoba menggunakan jawaban lain.
Contoh di bawah ini menemukan IP mana pada VPN yang memiliki VNC / port 5900 terbuka dengan klien yang berjalan pada Windows 7.
Skrip Python (v2.6.6) pendek untuk memindai daftar IP dan Port yang diberikan:
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."
Hasilnya tampak seperti:
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.
Keempat variabel di atas perlu diubah agar sesuai dengan batas waktu, jaringan, host, dan port apa pun yang diperlukan. 5,0 detik pada VPN saya sepertinya cukup untuk bekerja dengan baik secara konsisten, sedikit yang tidak (selalu) memberikan hasil yang akurat. Di jaringan lokal saya, 0,5 lebih dari cukup.
Ada alat ringan untuk itu, yang disebut tcping: http://www.linuxco.de/tcping/tcping.html
Di Bash shell, Anda dapat menggunakan file perangkat TCP pseudo , misalnya:
</dev/tcp/serverfault.com/80 && echo Port open || echo Port closed
Ini adalah versi yang menerapkan batas waktu 1 detik:
timeout 1 bash -c "</dev/tcp/serverfault.com/81" && echo Port open || echo Port closed
Jika Anda menjalankan sistem operasi * nix, coba instal dan gunakan "zenmap", ini adalah GUI untuk nmap dan memiliki beberapa profil pemindaian yang berguna yang sangat membantu pengguna baru.