Ping Port Tertentu

671

Cek saja kewarasan cepat di sini.

Bisakah Anda melakukan ping port tertentu dari mesin, dan jika demikian, dapatkah Anda memberikan contoh?

Saya mencari sesuatu seperti ping ip address portNum.

Davie
sumber
1
untuk windows pertanyaan ini dapat diperiksa
npocmaka

Jawaban:

720

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.

sfussenegger
sumber
15
Anda mungkin ingin menambahkan -PNuntuk melewati penemuan host yang biasanya dilakukan nmap sebelum menguji port yang diberikan.
flokra
27
Untuk menyelamatkan beberapa orang dari beberapa masalah: nmap / can / diinstal pada windows dari tautan (atau google 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.
23
Untuk yang lain: nmap tidak ada di Mac OS X, Anda dapat menginstal nmap melalui homebrew brew install nmapatau MacPorts.
Highway of Life
17
nping lebih cocok untuk tugas ini daripada nmap. nping adalah bagian dari distribusi nmap.
CMCDragonkai
6
Mac OSX memiliki 'Network Utility' yang memiliki tab port scanner
Shanimal
192

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+ ].

Ajay
sumber
23
netcatbekerja juga bagus dan kurang verbose.
petrus
3
Telnet berfungsi dengan baik untuk ini jika port adalah port TCP.
Falcon Momot
6
netcat juga bekerja dengan UDP (nc -u)
Tsvetomir Dimitrov
1
Untuk pengguna Mac - netcatsekarang built-in MacOS HighSierra, di mana telnet dapat diinstal dari HomeBrewbrew install telnet
sandiejat
98
$ nc -vz google.com 80
Connection to google.com 80 port [tcp/http] succeeded!
Rahul Patil
sumber
10
Gunakan dengan timesuka di time nc -vz www.example.com 80dan Anda akan memiliki semacam RTT juga.
xebeche
3
Solusi tunggal yang berfungsi di Amazon EC2 tanpa instalasi apa pun.
Masadow
apa -z? ncat 6.40 pada rhel7 memberikan opsi yang tidak diketahui
Tagar
@Tagar sesuai dengan bantuan dalam versi Ubuntu, -z adalah mode Zero-I / O, yang digunakan untuk memindai.
Ben Mordecai
88

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

Kjetil Limkjær
sumber
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

sumber
1
Atau alih-alih menggunakan kertas, Anda bisa menggunakan cryping yang sudah ada jauh lebih lama dan mendukung ping beberapa layanan serta porta.
Apakah ini dapat digunakan untuk melakukan ping port apa saja atau hanya 80?
Luke Puplett
@LukePuplett baru saja mengubah angka 80 pada contoh. Jalankan dengan mengetikkan paping.exe <hostname / IP> -p <portnumber> -c <jumlah upaya>
David Costa
Ini sangat bagus. gunakan -c *untuk paping konstan (?).
user2924019
26

Tidak, Anda tidak bisa, karena pingmenggunakan protokol ICMP , yang bahkan tidak memiliki konsep port.

Balthazar
sumber
47
Saya cukup yakin penggunaan "ping" bersifat metaforis.
Luke Puplett
26

Coba curlperintah, 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.

kenorb
sumber
3
Saya suka ini karena curlhadir secara default pada CentOS, jadi saya tidak perlu menginstal apa pun.
bdemarest
curl bekerja pada Raspberry Pi (distro Raspian)
John M
1
Sejauh ini, ini adalah solusi paling elegan dan universal. Saya men-tweak sedikit untuk membuatnya oneliner rapi: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."
Lefty G Balogh
21

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.

Ayan Mullick
sumber
1
Juga PsPing berasal dari tim Microsoft SysInternal sehingga mungkin dianggap sedikit lebih sah ketika berhadapan dengan orang-orang yang berorientasi Microsoft lainnya. (Dan memiliki fungsionalitas yang lebih baik daripada PortQry yang sangat lama)
martyvis
PSPing memiliki keuntungan menyediakan pengukuran latensi saat menggunakan port khusus, sesuatu yang tidak dapat dilakukan Test-NetConnection (hanya melaporkan waktu respons ICMP).
Jeff Miles
14

Di Linux Anda dapat menggunakan hping tetapi menggunakan TCP, bukan ICMP.

hping example.com -S -V -p 80
c4f4t0r
sumber
1
hping (hping3 di ubuntu saya) sangat bagus. Ini mengulangi pemeriksaan seperti ping secara berkala, dan tidak seperti banyak alat yang disarankan di sini. Ini juga menguji apakah paket melewati, dan apakah port terbuka. Jika terbuka Anda dapatkan flags=SA(yaitu SYN ACK), dan jika ditutup Anda dapatkan flags=SR(yaitu SYN RST). Perhatikan bahwa Anda mungkin tidak perlu -Vbendera di sini, tetapi Anda perlu sudo / root untuk menjalankan hping.
mc0e
Luar biasa! Tidak seperti banyak jawaban lain, ini melaporkan RTT suka latensi suka pingdan ping sampai berhenti.
Edward Anderson
11

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.

rampok
sumber
1
PortQry awalnya dirilis pada tahun 1999/2000 oleh tim MS Exchange tetapi versi MS terbaru tampaknya menghambatnya dengan menghilangkan kemampuan untuk menanyakan port jarak jauh (kesehatan & keselamatan).
Luke Puplett
8

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();
        }
    }
Luke Puplett
sumber
5

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.

beristirahat
sumber
4

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
fvu
sumber
4

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.

Mark Ribau
sumber
2
Bekerja dengan baik pada Win 7 XP Pro client / Win Server 2008 R2 untuk mendiagnosis port tertutup. (Saya harus menggunakan ambang batas waktu 30 detik tetapi itu mungkin menjadi masalah dengan lingkungan server tertentu bukan masalah dengan kode ini)
David Zemens
1

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
kenorb
sumber
0

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.


sumber
Zenmap juga tersedia untuk windows.
Nick Young