TCP ve UDP bağlantı noktalarını windows komut satırı üzerinden kapatma


160

Windows komut satırı üzerinden tek bir bağlantı için TCP veya UDP soketinin nasıl kapatılacağını biliyor mu?

Buna bakarken, bazı insanların aynı şeyi sorduğunu gördüm. Ancak cevaplar, bağlantı noktalarının nasıl izleneceğine odaklanan manuel bir netstat veya netsh komutları sayfasına benziyordu. Onları nasıl izleyeceğime dair cevaplar istemiyorum (bunu zaten yapıyorum). Onları kapatmak / öldürmek istiyorum.

DÜZENLEME, açıklama için: Diyelim ki sunucum 80 numaralı TCP bağlantı noktasını dinliyor. İstemci bağlantı kurar ve 56789 numaralı bağlantı noktası bunun için ayrılır. Sonra, bu bağlantının istenmeyen olduğunu keşfediyorum (örneğin, bu kullanıcı kötü şeyler yapıyor, durmalarını istedik ama bağlantı yol boyunca bir yere düşmedi). Normalde, işi yapmak için bir güvenlik duvarı eklerdim, ama bu biraz zaman alacaktı ve acil bir durumdaydım. Bağlantının sahibi olan işlemi öldürmek burada gerçekten kötü bir fikir çünkü bu sunucuyu devirir (sadece bir bağlantıyı seçici ve geçici olarak bırakmak istediğimizde tüm kullanıcılar işlevselliğini kaybeder).


1
Neden? Bağlantı noktalarını komut satırından veya dosyalardan da kapatamazsınız. Onlara sahip olan programları kapatmalısınız. Yoksa güvenlik duvarı işlemlerinden mi bahsediyorsunuz? Sorunuz belirsizliğini koruyor.
Lorne Marquis

9
Aşağı oyu anlayabiliyorum. Ama neden yakın oylar? Bu soru meşrudur.
Victor Stafusa

Yanıtlar:


65

Evet, bu mümkün. Kapatmak için soketin sahibi olan geçerli işlem olmanız gerekmez. Bir an için uzak makinenin, ağ kartının, ağ kablosunun ve işletim sisteminizin soketin kapanmasına neden olabileceğini düşünün.

Ayrıca Fiddler ve Desktop VPN yazılımının kendilerini ağ yığınına ekleyebileceğini ve tüm trafiğinizi gösterebileceğini veya tüm trafiğinizi yeniden yönlendirebileceğini düşünün.

Yani gerçekten ihtiyacınız olan şey, Windows'un buna doğrudan izin veren bir API sağlaması veya birisinin bir VPN veya Fiddler gibi çalışan bir program yazmış olması ve size içinden geçen soketleri kapatmanın bir yolunu vermesidir.

Tam olarak bunu yapan en az bir program ( CurrPorts ) var ve bugün CurrPorts başlamadan önce başlatılan bir işlemde belirli soketleri kapatmak için kullandım. Bunu yapmak için elbette yönetici olarak çalıştırmalısınız.

Bir programın bir bağlantı noktasını dinlememesine yol açmanın muhtemelen mümkün olmadığını unutmayın (iyi, ancak bu yetenek bir güvenlik duvarı olarak adlandırılır ...), ancak burada sorulduğunu sanmıyorum. "Programımın dinlediği bağlantı noktasına bir aktif bağlantıyı (soket) nasıl seçerek kapatırım?" Sorusuna inanıyorum. İstenmeyen gelen istemci bağlantısı için bir bağlantı noktası numarası verildiğinden ve buna "bağlantı noktası" olarak atıfta bulunulduğu için sorunun ifadesi biraz kapalıdır, ancak dinleme bağlantı noktasına değil, bu sokete bir referans olduğu oldukça açıktır.


3
Evet, CP harika bir araçtır: CurrPorts.exe / close <Yerel Adres> <Yerel Bağlantı Noktası> <Uzak Adres> <Uzak Bağlantı Noktası> {İşlem Adı} Bu satır: CurrPorts.exe / close * 56789 * * sunucusu olacaktır. exe
JasonXA

CurrPorts, bir işlemden gelen UDP çok noktaya yayın bağlantılarını
kapatamıyor

143
  1. açık cmd

    • yazın netstat -a -n -o

    • find TCP [the IP address]:[port number] .... #[target_PID]#(UDP için aynen)

    • (Btw, kill [target_PID]benim için çalışmadı)

  2. CTRL + ALT + DELETE ve "görev yöneticisini başlat" ı seçin

    • "İşlemler" sekmesini tıklayın

    • "PID" sütununu şuraya giderek etkinleştirin: Görünüm> Sütunları Seç> PID kutusunu işaretleyin

    • İlgilenilen PID'yi ve "END PROCESS" i bulun

  3. Artık sunucuyu [IP adresi] 'nde tekrar çalıştırabilirsiniz: [port numarası] sorunsuz


8
Söylediğiniz şey sadece sunucu işlemini öldürmek ve yeniden çalıştırmaktır, bu kaçınılması gereken bir şeydir, çünkü bu sadece istenmeyen olanı değil, sunucuya her bağlantıyı düşecektir.
Victor Stafusa

7
Üzgünüm, özel sorunuzu çözmede yardımcı olmadı. Sadece bir windows portunu nasıl kapatacağımı araştırırken sorunuzun ortaya çıkması gibi cevabımı sağlıyordum ve bunun da sorunumu yaşayanlara da yararlı olabileceğini düşündüm. :)
HaoQi Li

2
@HaoQiLi, Sadece her şeyi ve her şeyi sonlandıramazsın. Örneğin SystemWindows ağ bağlantılarını işleyen süreç.
Pacerier

2
@HaoQiLi taskkill /pid 6168 /f6168 kullanabilirsiniz pid kapatmak düşünüyorum
Madhawa Priyashantha

9
saçma bu cevabın bu kadar çok oyu var.
Mike

59

Örneğin, 8080 numaralı bağlantı noktasını boşaltmak istiyorsunuz. Ardından, bu komutları izleyin.

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

Bitti!


5
Teşekkürler. Bana sadece çözümün yardımcı oldu.
vvator

1
Doğru, PID'yi bulmaya çalışırken aslında PID'yi yazdırmaya yardımcı olur. (Bu insanlar kim?).
Adrian

3
bu aynı zamanda sadece kapanan limanı değil, belirtilen pid sürecini de öldürüyor.
NDestiny

1
Bu yardımcı olur.
Tural Asgar

Windows 10'da test ettim ve sadece TCP Bağlantısını değil, tüm İşlem veya İş parçacığını kullanarak öldürmez. Victor'un belirttiği gibi bu onun amacı değil.
Sebastian

54

Serbest bırakmak istediğiniz bağlantı noktasını biliyorsanız, netstat listenizi aşağıdaki gibi belirli bağlantı noktasını arayarak sıralayabilirsiniz:

netstat -ano | findstr :8080

Sonra pid, taskkill ile öldürebileceğiniz rijitlikte görünecektir.

resim açıklamasını buraya girin

taskkill/pid 11704 /F

Ayrıca özellikle localhost için olan bu soruya bakmak isteyebilirsiniz , ancak bunun alakalı olduğunu düşünüyorum:


Windows 10'da test ettim ve sadece TCP Bağlantısını değil, tüm İşlem veya İş parçacığını kullanarak öldürmez. Victor'un belirttiği gibi bu onun amacı değil.
Sebastian

27

TCPView kullanın: http://technet.microsoft.com/en-us/sysinternals/bb897437.aspx
veya CurrPorts: https://www.nirsoft.net/utils/cports.html

Alternatif olarak, HARİCİ YAZILIMI kullanmak istemiyorsanız (bu araçlar arada bir kurulum gerektirmez), netstat komutunu (tercihen netstat -b) İLK çalıştırıp ardından IP'yi engellemek için Yerel Güvenlik İlkesi'ni ayarlayabilirsiniz. söz konusu kullanıcının makinesinin adresi, istenmeyen veya hatta bilinmeyen bağlantılarla yaptığım şey budur - HERHANGİ BİR YAZILIM OLMADAN her şeyi yapmanızı sağlar (her şey Windows ile birlikte gelir) ...


2
Bu doğru cevap ve tamamen Microsoft destekli.
Dan Bonachea

Benim için de çalıştı. Yerel Bilgisayarda Yerel Güvenlik İlkesi -> IPSecurity İlkeleri'ni kullandım. Kullanıcı arayüzü oldukça sezgisel.
Puterdo Borato

1
Bunu denedim, yakın bağlantı ipv6 için gri renkte, varsa ipv6'yı kapatmanın alternatifi nedir?
jjxtra


7

Bu soketlerin sahibi olan işlemi kapatmadan soketleri kapatamazsınız. Soketler, onları açan sürece aittir. Yani Unix / Linux için işlem kimliğini (PID) bulmak için. Netstat'ı şu şekilde kullanın:

netstat -a -n -p -l

Bu şöyle bir şey basacaktır:

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         

-A tüm soketleri yazdırdığında, -n port numarasını gösterir, -p PID'yi gösterir, -l sadece ne dinlediğini gösterir (sonra ne dinlediğinize bağlı olarak isteğe bağlıdır).

İstediğiniz gerçek bilgi PID'dir. Şimdi bu işlemi şu şekilde kapatabiliriz:

kill 1879

Bir hizmeti kapatıyorsanız, kullanmak daha iyidir:

service sendmail stop

Kill tam anlamıyla bu süreci ve sahip olduğu çocukları öldürür. Service komutunu kullanarak init.d dizininde kayıtlı kapatma komut dosyasını çalıştırır. Bir hizmette kill kullanırsanız, düzgün bir şekilde kapatmayabileceğiniz için düzgün bir şekilde çalışmaya başlamayabilir. Sadece hizmete bağlı.

Ne yazık ki, Mac bu açıdan Linux / Unix'ten farklı. Netstat kullanamazsınız. Mac ile ilgileniyorsanız bu eğiticiyi okuyun:

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

Windows kullanıyorsanız, işlemleri sonlandırmak için TaskManager'ı ve hizmetleri kapatmak için kullanıcı arayüzünü kullanın. PID'yi tanımlamak için Windows'ta netstat'ı Linux / Unix gibi kullanabilirsiniz.

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


Başkalarının işaret ettiği gibi diğer araçlarla kapatılabilen uzak istemci soketleri olan sorusu hakkında bir açıklama yaptı. Bu cevap çoğunlukla (işletim sistemi içinde uğraşmadan) sunucu soketlerine odaklanır. Bu, bir sunucu soketi sahibi olan bir işlemi temiz bir şekilde nasıl indireceğinizdir, bu bağlantı noktasıysa ne yapmak istediğinizdir. Ancak, sunucunuza gelen çok sayıda bağlantınız varsa, bu farklı bir durumdur ve bunları kesinlikle öldürebilirsiniz. OP'nin ne istediğini tam olarak yanlış değil.
chubbsondubs

"Süreci öldür" bölümünü kaldırmalısınız, çünkü bu sorunun cevabı değildir. Trafiği durdurmak için Ağ Adaptörünü de durdurabilirsiniz, ancak yine de sadece Soketi öldürmez!
Sebastian

Cevap sadece ipv6 için doğrudur, ipv4 için SetTcpEntry'yi arayabilirsiniz
jjxtra

5

CurrPorts kullanın (ücretsiz ve yüklenmesiz): http://www.nirsoft.net/utils/cports.html

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

Örnekler:

# 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

Ayrıca güzel bir GUI var arama ve filtre özellikleri ile vardır.

Not: Bu cevap huntharo ve JasonXA'nın cevapları ve yorumları bir araya getirildi ve okuyucular için kolaylaştırmak için basitleştirildi. Örnekler CurrPorts'un web sayfasından gelir.


3

Sunucunuzdaki soketleri bu soketlere sahip olmadan kapatamazsınız, bu nedenle sunucu soketinin sahibi olan işlemde kod çalıştırılmadan soketi kapatamazsınız.

Ancak, istemciye soketini kapatmasını söyleyen başka bir seçenek daha vardır. İstemcinin bağlandığı bağlantı noktasına bir RST TCP paketi göndermek istemcinin bağlantılarını kesmesine neden olur. Bunu nmap kullanarak RST taramasıyla yapabilirsiniz.

http://nmap.org/


Bu, önceki cevabınızdan çok daha iyi bir cevap! Teşekkür ederim!
Sebastian


2

wkillcx , tcp bağlantılarını belirtilmemiş komut satırından öldürmek için güvenilir bir windows komut satırı aracıdır. Ancak bazen çok sayıda bağlantıya sahip sunucularla ilgili sorunları var. Bazen etkileşimli öldürmeler için tcpview kullanıyorum ancak wkillcx komut dosyalarında kullanılabilir.



1

İçin bağlantı noktasını kapatmak bu bağlantı noktasında dinleme sürecini tanımlamak ve bu süreci öldürebilir.


2
@Victor, gördüm ama süreci düşürmeden bir limanı zorla kapatmanın bir yolu yok. Başka bir olasılık, sunucu programını, istemcileri izleyebildiğiniz ve yönetebildiğinizde bir tür kontrol paneline sahip olacak şekilde yazmaktır.
Darin Dimitrov

1
Ayrıca, soketin dinlediği arabirim indirilirse, soket kapanır.
rustyx

Bir örnek istediğine inanıyorum.
EyoelD

1

sysinternal'dan tcpview gibi bir program kullanabilirsiniz. Sanırım istenmeyen bağlantıyı izlemede ve öldürmede çok yardımcı olabilir.


1

CurrPorts bizim için çalışmadı ve sunucuya sadece ssh üzerinden erişebiliyorduk, bu yüzden TCPView de yok. Diğer bağlantıları düşürmemek için de süreci öldüremedik. Yaptığımız ve henüz önerilmediğimiz şey, Windows Güvenlik Duvarı üzerindeki bağlantıyı engellemekti. Evet, bu kurala uyan tüm bağlantıları engeller , ancak bizim durumumuzda tek bir bağlantı vardı (ilgilendiğimiz bağlantı):

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

IP'yi ihtiyacınız olanla değiştirin ve gerekirse başka kurallar ekleyin.


0

anlık / uygulanabilir / kısmi cevap : https://stackoverflow.com/a/20130959/2584794

netstat -a -o -n'nin kullanıldığı son cevaptan farklı olarak, inanılmaz uzun bir liste kullanıldı. bağlantı noktaları


5
Bu neredeyse HaoQi Li'nin cevabı ile aynı şey. Bu, sunucu işlemini sadece istenmeyen bağlantıyı değil, her bağlantıyı bırakarak öldürür. Zor olan sadece istenmeyen olanı bırakmak ve daha fazlasını yapmak.
Victor Stafusa

Victor'a katılıyorum. Bu sorunun cevabı değil. Böylece Ağ Adaptörünü de devre dışı bırakabilirsiniz ...
Sebastian

-3

Evet TCP veya UDP bağlantı noktasını kapatmak mümkün DOS'ta bir komut var

TASKKILL /f /pid 1234 

Umarım bu senin için çalışır


Windows 10'da test ettim ve sadece TCP Bağlantısını değil, tüm İşlem veya İş parçacığını kullanarak öldürmez. Victor'un belirttiği gibi bu onun amacı değil.
Sebastian

-3

Yukarıdaki PowerShell v4 yüklü Windows 8, `Windows Server 2012 veya üzeri sürümlerde çalışıyorsanız, aşağıdaki komut dosyasını kullanabilirsiniz. Bu, bağlantı noktasıyla ilişkili işlemleri bulur ve sonlandırır.

kod

#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 

Belgeler:


Windows 10'da test ettim ve sadece TCP Bağlantısını değil, tüm İşlem veya İş parçacığını kullanarak öldürmez. Victor'un belirttiği gibi bu onun amacı değil.
Sebastian
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.