Cara menutup port TCP dan UDP melalui baris perintah windows

160

Apakah ada yang tahu cara menutup soket TCP atau UDP untuk satu koneksi melalui baris perintah windows?

Googling tentang ini, saya melihat beberapa orang menanyakan hal yang sama. Tetapi jawabannya tampak seperti halaman manual dari perintah netstat atau netsh yang berfokus pada bagaimana memonitor port. Saya tidak ingin jawaban tentang cara memonitor mereka (saya sudah melakukan ini). Saya ingin menutup / membunuh mereka.

EDIT, untuk klarifikasi: Katakanlah server saya mendengarkan port TCP 80. Seorang klien membuat koneksi dan port 56789 dialokasikan untuk itu. Kemudian, saya menemukan bahwa koneksi ini tidak diinginkan (misalnya pengguna ini melakukan hal-hal buruk, kami meminta mereka untuk berhenti tetapi koneksi tidak terjatuh di suatu tempat di sepanjang jalan). Biasanya, saya akan menambahkan firewall untuk melakukan pekerjaan itu, tetapi ini akan memakan waktu, dan saya berada dalam situasi darurat. Membunuh proses yang memiliki koneksi benar-benar ide yang buruk di sini karena ini akan menurunkan server (semua pengguna akan kehilangan fungsionalitas ketika kami hanya ingin secara selektif dan sementara menjatuhkan koneksi yang satu ini).

Victor Stafusa
sumber
1
Mengapa? Anda tidak dapat menutup port dari baris perintah, atau file. Anda harus menutup program yang memilikinya. Atau apakah Anda merujuk pada operasi firewall? Pertanyaan Anda tetap tidak jelas.
Marquis of Lorne
9
Saya bisa mengerti suara turun. Tapi mengapa suara dekat? Pertanyaan ini sah.
Victor Stafusa

Jawaban:

65

Ya, ini mungkin. Anda tidak harus menjadi proses saat ini yang memiliki soket untuk menutupnya. Pertimbangkan sejenak bahwa mesin jarak jauh, kartu jaringan, kabel jaringan, dan OS Anda semua dapat menyebabkan soket menutup.

Pertimbangkan juga bahwa perangkat lunak Fiddler dan Desktop VPN dapat memasukkan diri mereka ke dalam tumpukan jaringan dan menunjukkan kepada Anda semua lalu lintas atau mengalihkan semua lalu lintas Anda.

Jadi yang Anda butuhkan hanyalah Windows untuk menyediakan API yang memungkinkan ini secara langsung, atau bagi seseorang untuk menulis program yang beroperasi seperti VPN atau Fiddler dan memberi Anda cara untuk menutup soket yang melewatinya.

Setidaknya ada satu program ( CurrPorts ) yang melakukan hal ini dan saya menggunakannya hari ini untuk tujuan menutup soket spesifik pada proses yang dimulai sebelum CurrPorts dimulai. Untuk melakukan ini, Anda harus menjalankannya sebagai administrator, tentu saja.

Perhatikan bahwa mungkin tidak mudah untuk menyebabkan program tidak mendengarkan pada port (well, itu mungkin tetapi kemampuan itu disebut sebagai firewall ...), tapi saya tidak berpikir itu ditanyakan di sini. Saya percaya pertanyaannya adalah "bagaimana cara menutup secara selektif satu koneksi aktif (soket) ke port yang didengarkan program saya?". Kata-kata dari pertanyaan ini agak tidak jelas karena nomor port untuk koneksi klien masuk yang tidak diinginkan diberikan dan itu disebut sebagai "port" tetapi cukup jelas bahwa itu adalah referensi ke satu soket dan bukan port mendengarkan.

huntharo
sumber
3
Ya, CP adalah alat yang luar biasa: CurrPorts.exe / close <Local Address> <Local Port> <Remote Address> <Remote Port> {Nama Proses} Ini akan menjadi baris: CurrPorts.exe / close * 56789 * * server. exe
JasonXA
CurrPorts tampaknya tidak dapat menutup koneksi multicast UDP yang berasal dari suatu proses
george_h
143
  1. Buka cmd

    • ketik netstat -a -n -o

    • find TCP [the IP address]:[port number] .... #[target_PID]#(ditto for UDP)

    • (Btw, kill [target_PID]tidak bekerja untuk saya)

  2. CTRL + ALT + DELETE dan pilih "start task manager"

    • Klik pada tab "Proses"

    • Aktifkan kolom "PID" dengan masuk ke: Lihat> Pilih Kolom> Centang kotak untuk PID

    • Temukan PID yang menarik dan "AKHIR PROSES"

  3. Sekarang Anda dapat menjalankan ulang server di [alamat IP]: [nomor port] tanpa masalah

HaoQi Li
sumber
8
Apa yang Anda katakan hanyalah untuk mematikan proses server dan menjalankannya kembali, yang merupakan sesuatu yang ingin saya hindari, karena ini akan menjatuhkan setiap koneksi ke server, bukan hanya yang tidak diinginkan.
Victor Stafusa
7
Maaf saya tidak membantu menyelesaikan pertanyaan spesifik Anda. Saya baru saja memberikan jawaban saya ketika pertanyaan Anda muncul ketika saya googling tentang cara menutup port windows, dan berpikir itu mungkin bermanfaat bagi orang lain yang juga memiliki masalah saya. :)
HaoQi Li
2
@ HaiQiLi, Anda tidak bisa hanya mengakhiri semuanya dan apa saja. Misalnya Systemproses yang menangani koneksi jaringan windows.
Pacerier
2
@HaoQiLi saya pikir untuk menutup kita dapat menggunakan taskkill /pid 6168 /f6168 adalah pid
Madhawa Priyashantha
9
konyol jawaban ini memiliki begitu banyak upvotes ketika pertanyaan dengan jelas menyatakan SINGLE CONNECTION tidak seluruh proses !!!
Mike
59

Misalnya Anda ingin membebaskan port 8080 Kemudian, ikuti perintah ini.

 netstat -ano
 taskkill /f /im [PID of the port 8080 got from previous command]

Selesai!

Rahul
sumber
5
Terima kasih. Hanya solusi Anda yang membantu saya.
vvator
1
Benar, membantu untuk benar-benar mencetak PID ketika mencoba mencari PID. (Siapakah orang-orang ini?).
Adrian M.
3
ini juga mematikan proses pid yang disebutkan & tidak hanya menutup port.
NDestiny
1
Ini sangat membantu.
Tural Asgar
Saya menguji pada Windows 10 dan tidak membunuh Koneksi TCP saja tetapi seluruh Proses atau Thread menggunakannya. Seperti yang dikatakan Victor, itu bukan tujuannya.
Sebastian
54

Jika Anda tahu port yang ingin Anda bebaskan, Anda dapat mengurutkan daftar netstat Anda dengan mencari port spesifik seperti ini:

netstat -ano | findstr :8080

Kemudian pid akan muncul di rigth yang bisa Anda bunuh dengan taskkill.

masukkan deskripsi gambar di sini

taskkill/pid 11704 /F

Anda juga mungkin ingin melihat pertanyaan ini yang khusus untuk localhost, tapi saya pikir ini relevan:

Felipe Centeno
sumber
Saya menguji pada Windows 10 dan tidak membunuh Koneksi TCP saja tetapi seluruh Proses atau Thread menggunakannya. Seperti yang dikatakan Victor, itu bukan tujuannya.
Sebastian
27

Gunakan TCPView: http://technet.microsoft.com/en-us/sysinternals/bb897437.aspx
atau CurrPorts: https://www.nirsoft.net/utils/cports.html

Atau, jika Anda tidak ingin menggunakan PERANGKAT LUNAK EKSTERNAL (alat ini tidak memerlukan instalasi dengan cara), Anda dapat PERTAMA menjalankan perintah netstat (lebih disukai netstat -b) & kemudian mengatur Kebijakan Keamanan Lokal untuk memblokir IP. alamat mesin pengguna yang dimaksud, itulah yang telah saya lakukan dengan koneksi yang tidak diinginkan atau bahkan tidak dikenal - yang memungkinkan Anda melakukan segalanya TANPA PERANGKAT LUNAK EKSTERNAL (semuanya dilengkapi dengan Windows) ...

Vman
sumber
2
Ini adalah jawaban yang tepat, dan didukung penuh oleh Microsoft.
Dan Bonachea
Bekerja untuk saya juga. Saya menggunakan Kebijakan Keamanan Lokal -> Kebijakan IPSecurity di Komputer Lokal. UI cukup intuitif.
Puterdo Borato
1
Mencoba ini, koneksi dekat diklik untuk ipv6, apa alternatif untuk menutup ipv6 jika ada?
jjxtra
7

Anda tidak dapat menutup soket tanpa mematikan proses yang memiliki soket itu. Soket dimiliki oleh proses yang membukanya. Jadi untuk mengetahui ID proses (PID) untuk Unix / Linux. Gunakan netstat seperti ini:

netstat -a -n -p -l

Itu akan mencetak sesuatu seperti:

Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State     PID/Program name   
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN     1879/sendmail: acce 
tcp        0      0 0.0.0.0:21                  0.0.0.0:*                   LISTEN     1860/xinetd         

Di mana -a mencetak semua soket, -n menunjukkan nomor port, -p menunjukkan PID, -l hanya menunjukkan apa yang mendengarkan (ini opsional tergantung pada apa yang Anda cari).

Info sebenarnya yang Anda inginkan adalah PID. Sekarang kita dapat mematikan proses itu dengan melakukan:

kill 1879

Jika Anda mematikan layanan, lebih baik menggunakan:

service sendmail stop

Membunuh secara harfiah membunuh proses itu saja dan setiap anak yang dimilikinya. Menggunakan perintah layanan jalankan skrip shutdown yang terdaftar di direktori init.d. Jika Anda menggunakan kill pada layanan, itu mungkin tidak benar memulai kembali karena Anda tidak mematikannya dengan benar. Itu hanya tergantung pada layanan.

Sayangnya, Mac berbeda dari Linux / Unix dalam hal ini. Anda tidak dapat menggunakan netstat. Baca tutorial ini jika Anda tertarik pada Mac:

http://www.tech-recipes.com/rx/227/find-out-which-process-is-holding-which-socket-open/

Dan jika Anda menggunakan Windows gunakan TaskManager untuk mematikan proses, dan layanan UI untuk mematikan layanan. Anda dapat menggunakan netstat di Windows seperti Linux / Unix untuk mengidentifikasi PID.

http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/netstat.mspx?mfr=true

chubbsondubs
sumber
Dia membuat klarifikasi tentang pertanyaannya yaitu soket klien jarak jauh yang dapat ditutup dengan alat lain seperti yang telah ditunjukkan orang lain. Jawaban ini sebagian besar terfokus pada soket server yang tidak bisa (tanpa mengotak-atik OS). Ini adalah cara membersihkan proses yang memiliki soket server yang ingin Anda lakukan jika itu adalah port. Tetapi, jika Anda memiliki banyak koneksi masuk ke server Anda, itu adalah situasi yang berbeda dan Anda pasti dapat mematikannya. Itu tidak salah hanya tidak cukup apa yang diminta OP.
chubbsondubs
Anda harus menghapus bagian "bunuh proses", karena itu bukan jawaban untuk pertanyaan itu. Anda juga dapat menghentikan Network-Adapter untuk menghentikan Traffic tetapi tetap saja tidak membunuh Socket!
Sebastian
Jawabannya benar hanya untuk ipv6, untuk ipv4 Anda dapat memanggil SetTcpEntry
jjxtra
5

Gunakan CurrPorts (gratis dan tanpa instalasi): http://www.nirsoft.net/utils/cports.html

/close <Local Address> <Local Port> <Remote Address> <Remote Port> {Process Name}

Contoh:

# Close all connections with remote port 80 and remote address 192.168.1.10: 
/close * * 192.168.1.10 80
# Close all connections with remote port 80 (for all remote addresses): 
/close * * * 80
# Close all connections to remote address 192.168.20.30: 
/close * * 192.168.20.30 *
# Close all connections with local port 80: 
/close * 80 * *
# Close all connections of Firefox with remote port 80: 
/close * * * 80 firefox.exe

Ini juga memiliki GUI yang bagus dengan fitur pencarian dan filter.

Catatan: Jawaban ini adalah jawaban dan komentar huntharo dan JasonXA disatukan dan disederhanakan untuk memudahkan pembaca. Contohnya berasal dari halaman web CurrPorts.

qwertzguy
sumber
3

Anda tidak dapat menutup soket di server Anda tanpa memiliki soket itu sehingga Anda tidak dapat benar-benar menutup soket tanpa kode berjalan dalam proses yang memiliki soket server.

Namun, ada opsi lain yang memberitahu klien untuk menutup soketnya. Mengirimkan paket RST TCP ke port yang disambungkan klien akan menyebabkan klien memutuskan koneksi mereka. Anda dapat melakukannya dengan pemindaian RST menggunakan nmap.

http://nmap.org/

chubbsondubs
sumber
Itu jawaban yang jauh lebih baik daripada jawaban Anda sebelumnya! Terima kasih!
Sebastian
2

wkillcx adalah alat baris perintah windows yang dapat diandalkan untuk membunuh koneksi tcp dari baris perintah yang belum disebutkan. Itu memang memiliki masalah dengan server dengan sejumlah besar koneksi terkadang. Saya terkadang menggunakan tcpview untuk membunuh interaktif tetapi wkillcx dapat digunakan dalam skrip.

pengguna3310805
sumber
1

Untuk menutup port, Anda dapat mengidentifikasi proses yang mendengarkan pada port ini dan mematikan proses ini.

Darin Dimitrov
sumber
2
@ Viktor, saya melihatnya tetapi tidak ada cara untuk menutup port secara paksa tanpa menurunkan prosesnya. Kemungkinan lain adalah menulis program server sedemikian rupa sehingga Anda memiliki semacam panel kontrol ketika Anda dapat memantau dan mengelola klien.
Darin Dimitrov
1
Juga, jika antarmuka tempat soket mendengarkan diturunkan, soket akan menutup.
rustyx
Saya percaya dia meminta contoh.
EyoelD
1

Anda dapat menggunakan program seperti tcpview dari sysinternal. Saya kira ini dapat banyak membantu Anda dalam memonitor dan membunuh koneksi yang tidak diinginkan.

Mochan
sumber
1

CurrPorts tidak bekerja untuk kami dan kami hanya bisa mengakses server melalui ssh, jadi tidak ada TCPView juga. Kami juga tidak dapat mematikan proses, karena tidak menjatuhkan koneksi lain. Apa yang akhirnya kami lakukan dan belum disarankan adalah memblokir koneksi pada Firewall Windows. Ya, ini akan memblokir semua koneksi yang sesuai dengan aturan, tetapi dalam kasus kami ada satu koneksi (yang kami tertarik):

netsh advfirewall firewall add rule name="Conn hotfix" dir=out action=block protocol=T
CP remoteip=192.168.38.13

Ganti IP dengan yang Anda butuhkan dan tambahkan aturan lain jika diperlukan.

afarah
sumber
0

instan / layak / jawaban parsial : https://stackoverflow.com/a/20130959/2584794

tidak seperti dari jawaban sebelumnya di mana netstat -a -o -n digunakan daftar yang sangat panjang harus dilihat tanpa nama aplikasi menggunakan mereka port

Anup
sumber
5
Ini hampir sama dengan jawaban HaoQi Li. Ini akan membunuh proses server menjatuhkan setiap koneksi, dan bukan hanya yang tidak diinginkan. Tantangannya adalah untuk menjatuhkan hanya yang tidak diinginkan dan tidak lebih.
Victor Stafusa
Saya setuju dengan Victor. Itu bukan jawaban untuk pertanyaan itu. Jadi, Anda juga dapat menonaktifkan Network-Adapter ...
Sebastian
-3

Ya ada kemungkinan untuk menutup port TCP atau UDP ada perintah di DOS

TASKKILL /f /pid 1234 

Saya harap ini akan berhasil untuk Anda

Bijay Budhathoki
sumber
Saya menguji pada Windows 10 dan tidak membunuh Koneksi TCP saja tetapi seluruh Proses atau Thread menggunakannya. Seperti yang dikatakan Victor, itu bukan tujuannya.
Sebastian
-3

Jika Anda menjalankan Windows 8, `Windows Server 2012 atau lebih baru dengan PowerShell v4 yang diinstal di atas, Anda dapat menggunakan skrip di bawah ini. Ini menemukan proses yang terkait dengan port & menghentikannya.

Kode

#which port do you want to kill
[int]$portOfInterest = 80

#fetch the process ids related to this port
[int[]]$processId = Get-NetTCPConnection -LocalPort $portOfInterest | 
    Select-Object -ExpandProperty OwningProcess -Unique | 
    Where-Object {$_ -gt 0} 

#kill those processes
Stop-Process -Id $processId 

Dokumentasi:

JohnLBevan
sumber
Saya menguji pada Windows 10 dan tidak membunuh Koneksi TCP saja tetapi seluruh Proses atau Thread menggunakannya. Seperti yang dikatakan Victor, itu bukan tujuannya.
Sebastian