Jak zamknąć porty TCP i UDP za pomocą wiersza poleceń systemu Windows

160

Czy ktoś wie, jak zamknąć gniazdo TCP lub UDP dla pojedynczego połączenia za pomocą wiersza poleceń systemu Windows?

Szukając w Google, widziałem, jak niektórzy ludzie pytali o to samo. Ale odpowiedzi wyglądały jak strona podręcznika poleceń netstat lub netsh, skupiająca się na sposobie monitorowania portów. Nie chcę odpowiedzi, jak je monitorować (już to robię). Chcę je zamknąć / zabić.

EDYTUJ, dla wyjaśnienia: Powiedzmy, że mój serwer nasłuchuje portu TCP 80. Klient nawiązuje połączenie i jest mu przydzielany port 56789. Potem odkrywam, że to połączenie jest niepożądane (np. Ten użytkownik robi złe rzeczy, poprosiliśmy go o zatrzymanie, ale połączenie nie zostało zerwane gdzieś po drodze). Zwykle dodawałbym zaporę ogniową, aby wykonać zadanie, ale zajęłoby to trochę czasu i byłem w sytuacji awaryjnej. Zabicie procesu będącego właścicielem połączenia jest tutaj naprawdę złym pomysłem, ponieważ spowodowałoby to wyłączenie serwera (wszyscy użytkownicy straciliby funkcjonalność, gdybyśmy chcieli tylko selektywnie i czasowo porzucić to jedno połączenie).

Victor Stafusa
źródło
1
Czemu? Nie możesz zamknąć portów z wiersza poleceń ani plików. Musisz zamknąć programy, które są ich właścicielami. A może masz na myśli operacje zapory ogniowej? Twoje pytanie pozostaje niejasne.
Markiz Lorne
9
Rozumiem głos przeciw. Ale dlaczego blisko głosów? To pytanie jest uzasadnione.
Victor Stafusa,
37
@EJP: To prawdziwe pytanie, ponieważ o coś prosiłem i oczekiwałem odpowiedzi (nawet jeśli odpowiedź była zwodniczym „nie, nie możesz tego zrobić”). Otrzymałem odpowiedź i przyjąłem odpowiedź. Co więcej, nawet twoje „Tego się nie da zrobić” JEST również ważną odpowiedzią. Zatem to pytanie jest słuszne.
Victor Stafusa,
1
@EJP, proszę, nie odpowiadaj w ten sposób, mamy tutaj wystarczająco dużo ludzi, którzy w takiej czy innej formie po prostu mówią `` gdybyś znał odpowiedź, nie zadałbyś tego pytania '' - jestem pewien, że widzisz szaleństwo tego.
Chalky,

Odpowiedzi:

65

Tak, jest to możliwe. Nie musisz być bieżącym procesem będącym właścicielem gniazda, aby je zamknąć. Rozważ przez chwilę, że zdalna maszyna, karta sieciowa, kabel sieciowy i system operacyjny mogą powodować zamknięcie gniazda.

Weź również pod uwagę, że oprogramowanie Fiddler i Desktop VPN może wstawić się do stosu sieciowego i pokazać cały ruch lub przekierować cały ruch.

Więc wszystko, czego naprawdę potrzebujesz, to albo system Windows zapewniający interfejs API, który pozwala na to bezpośrednio, albo ktoś, kto napisał program, który działa trochę jak VPN lub Fiddler i umożliwia zamknięcie gniazd, które przez niego przechodzą.

Istnieje co najmniej jeden program ( CurrPorts ), który dokładnie to robi i użyłem go dzisiaj do zamykania określonych gniazd w procesie, który został uruchomiony przed uruchomieniem CurrPorts. Aby to zrobić, musisz oczywiście uruchomić go jako administrator.

Zauważ, że prawdopodobnie nie jest łatwo spowodować, aby program nie nasłuchiwał na porcie (cóż, jest to możliwe, ale ta funkcja jest nazywana zaporą ogniową ...), ale nie sądzę, aby o to pytano. Wydaje mi się, że pytanie brzmi "jak selektywnie zamknąć jedno aktywne połączenie (gniazdo) z portem, na którym nasłuchuje mój program?". Sformułowanie pytania jest trochę dziwne, ponieważ podano numer portu dla niepożądanego połączenia przychodzącego klienta i nazywano go „portem”, ale jest całkiem jasne, że było to odniesienie do tego jednego gniazda, a nie portu nasłuchującego.

huntharo
źródło
3
Tak, CP to wspaniałe narzędzie: CurrPorts.exe / close <Adres lokalny> <Port lokalny> <Adres zdalny> <Port zdalny> {Nazwa procesu} To będzie wiersz: CurrPorts.exe / close * 56789 * * server. exe
JasonXA
Wydaje się, że
CurrPorts
143
  1. otwarty cmd

    • Wpisz netstat -a -n -o

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

    • (Btw, kill [target_PID]nie działa dla mnie)

  2. CTRL + ALT + DELETE i wybierz „Uruchom menedżera zadań”

    • Kliknij zakładkę „Procesy”

    • Włącz kolumnę „PID”, przechodząc do: Widok> Wybierz kolumny> Zaznacz pole PID

    • Znajdź interesujący Cię PID i „KONIEC PROCESU”

  3. Teraz możesz ponownie uruchomić serwer na [adres IP]: [numer portu] bez problemu

HaoQi Li
źródło
8
Mówisz tylko o zabiciu procesu serwera i ponownym uruchomieniu go, czego chciałem uniknąć, ponieważ spowodowałoby to zerwanie każdego połączenia z serwerem, a nie tylko niepożądanego.
Victor Stafusa
7
Przepraszam, że nie pomogłem w rozwiązaniu twojego konkretnego pytania. Właśnie udzielałem odpowiedzi, gdy pojawiło się twoje pytanie, kiedy szukałem w Google sposobu, jak po prostu zamknąć port systemu Windows, i pomyślałem, że może to być pomocne dla innych, którzy również mieli mój problem. :)
HaoQi Li
2
@HaoQiLi, nie możesz po prostu zakończyć wszystkiego i czegokolwiek. Np. SystemProces obsługujący połączenia sieciowe Windows.
Pacerier
2
@HaoQiLi Myślę, że do zamknięcia możemy użyć taskkill /pid 6168 /f6168 to pid
Madhawa Priyashantha
9
absurdalna ta odpowiedź ma tak wiele pozytywnych głosów, gdy pytanie wyraźnie stwierdza POJEDYNCZE POŁĄCZENIE, a nie cały proces !!!
Mike
59

Na przykład chcesz zwolnić port 8080. Następnie wykonaj następujące polecenia.

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

Gotowe!

Rahul
źródło
5
Dzięki. Pomogło mi tylko Twoje rozwiązanie.
vvator
1
Racja, faktyczne wydrukowanie PID jest pomocne podczas próby zlokalizowania PID. (Kim są Ci ludzie?).
Adrian M.
3
to również zabija proces wspomnianego pid, a nie tylko zamykanie portu.
NDestiny
1
To jest pomocne.
Tural Asgar
Testowałem na systemie Windows 10 i nie zabija samego połączenia TCP, ale cały proces lub wątek, który go używa. Jak stwierdził Victor, to nie jest jego celem.
Sebastian,
53

Jeśli znasz port, który chcesz zwolnić, możesz posortować listę netstat, szukając określonego portu w następujący sposób:

netstat -ano | findstr :8080

Wtedy pid pojawi się na igraszce, którą możesz zabić za pomocą zadania.

wprowadź opis obrazu tutaj

taskkill/pid 11704 /F

Możesz również spojrzeć na to pytanie, które jest przeznaczone specjalnie dla lokalnego hosta, ale myślę, że jest istotne:

Felipe Centeno
źródło
Testowałem na systemie Windows 10 i nie zabija samego połączenia TCP, ale cały proces lub wątek, który go używa. Jak stwierdził Victor, to nie jest jego celem.
Sebastian,
27

Użyj TCPView ( http://technet.microsoft.com/en-us/sysinternals/bb897437.aspx ) lub CurrPorts ( http://www.nirsoft.net/utils/cports.html ).

Alternatywnie, jeśli nie chcesz korzystać z OPROGRAMOWANIA ZEWNĘTRZNEGO (przy okazji te narzędzia nie wymagają instalacji), możesz po prostu NAJPIERW uruchomić polecenie netstat (najlepiej netstat -b), a następnie skonfigurować lokalną politykę bezpieczeństwa, aby zablokować adres IP adres komputera użytkownika, o którym mowa, to właśnie robiłem z niechcianymi lub nawet nieznanymi połączeniami - co pozwala robić wszystko BEZ ŻADNEGO OPROGRAMOWANIA ZEWNĘTRZNEGO (wszystko jest dostarczane z systemem Windows) ...

Vman
źródło
2
To jest właściwa odpowiedź iw pełni obsługiwana przez firmę Microsoft.
Dan Bonachea
U mnie też zadziałało. Użyłem lokalnych zasad bezpieczeństwa -> IPSecurity Policies na lokalnym komputerze. Interfejs użytkownika jest dość intuicyjny.
Puterdo Borato
1
Próbowałem tego, bliskie połączenie jest wyszarzone dla IPv6, jaka jest alternatywa dla zamknięcia ipv6, jeśli istnieje?
jjxtra
23

Wypróbuj narzędzie sysinternals / Microsoft tcpview (GUI) i Tcpvcon (wiersz poleceń)

Patrick
źródło
7

Nie można zamknąć gniazd bez wyłączania procesu, do którego należą te gniazda. Gniazda są własnością procesu, który je otworzył. Aby znaleźć identyfikator procesu (PID) dla systemu Unix / Linux. Użyj netstat w ten sposób:

netstat -a -n -p -l

To wypisze coś takiego:

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         

Gdzie -a wyświetla wszystkie gniazda, -n pokazuje numer portu, -p pokazuje PID, -l pokazuje tylko to, czego nasłuchuje (jest to opcjonalne w zależności od tego, czego szukasz).

Prawdziwe informacje, które chcesz, to PID. Teraz możemy zakończyć ten proces, wykonując:

kill 1879

Jeśli zamykasz usługę, lepiej użyj:

service sendmail stop

Zabij dosłownie zabija tylko ten proces i wszystkie dzieci, które posiada. Użycie polecenia service uruchamia skrypt zamykający zarejestrowany w katalogu init.d. Jeśli użyjesz funkcji zabijania w usłudze, może ona nie zostać poprawnie uruchomiona, ponieważ nie została ona poprawnie zamknięta. To zależy tylko od usługi.

Niestety pod tym względem Mac różni się od Linux / Unix. Nie możesz użyć netstat. Przeczytaj ten samouczek, jeśli interesuje Cię Mac:

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

A jeśli korzystasz z systemu Windows, użyj TaskManagera do zabijania procesów i interfejsu usług do zamykania usług. Możesz użyć netstat w Windows, tak jak Linux / Unix, do identyfikacji PID.

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

chubbsondubs
źródło
Wyjaśnił swoje pytanie, które dotyczy gniazd klienta zdalnego, które można zamknąć innymi narzędziami, jak zauważyli inni. Ta odpowiedź koncentruje się głównie na gniazdach serwerów, które nie mogą (bez majstrowania w systemie operacyjnym). W ten sposób można wyczyścić proces, który jest właścicielem gniazda serwera, co chcesz zrobić, jeśli jest to port. Ale jeśli masz wiele połączeń przychodzących na swój serwer, to inna sytuacja i zdecydowanie możesz je zabić. Nie jest źle, tylko nie do końca, o co prosił OP.
chubbsondubs
Należy usunąć część „zabij proces”, ponieważ nie jest to odpowiedź na pytanie. Możesz także zatrzymać kartę sieciową, aby zatrzymać ruch, ale nadal nie zabija to tylko gniazda!
Sebastian,
Odpowiedź jest poprawna tylko dla ipv6, dla ipv4 możesz zadzwonić do SetTcpEntry
jjxtra
5

Użyj CurrPorts (to nic nie kosztuje i nie wymaga instalacji): http://www.nirsoft.net/utils/cports.html

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

Przykłady:

# 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

Posiada również ładny graficzny interfejs użytkownika z funkcjami wyszukiwania i filtrowania.

Uwaga: ta odpowiedź jest odpowiedzią i komentarzem huntharo i JasonXA zebranych i uproszczonych, aby ułatwić czytelnikom. Przykłady pochodzą ze strony internetowej CurrPorts.

qwertzguy
źródło
3

Nie możesz zamknąć gniazd na serwerze bez ich posiadania, dlatego nie możesz zamknąć gniazda bez uruchomienia kodu w procesie będącym właścicielem gniazda serwera.

Istnieje jednak inna opcja, która nakazuje klientowi zamknięcie gniazda. Wysłanie pakietu RST TCP do portu, z którym łączy się klient, spowoduje przerwanie połączenia. Możesz to zrobić za pomocą skanowania RST przy użyciu nmap.

http://nmap.org/

chubbsondubs
źródło
To znacznie lepsza odpowiedź niż Twoja poprzednia odpowiedź! Dziękuję Ci!
Sebastian,
2

wkillcx to niezawodne narzędzie wiersza poleceń systemu Windows do zabijania połączeń tcp z wiersza poleceń, o którym nie wspomniano. Czasami jednak ma problemy z serwerami z dużą liczbą połączeń. Czasami używam tcpview do interaktywnych zabójstw, ale wkillcx może być używany w skryptach.

user3310805
źródło
1

Aby zamknąć port, możesz zidentyfikować proces, który nasłuchuje na tym porcie i zakończyć ten proces.

Darin Dimitrov
źródło
2
@Victor, widziałem to, ale nie ma możliwości przymusowego zamknięcia portu bez spowolnienia procesu. Inną możliwością jest napisanie programu serwera w taki sposób, aby mieć jakiś panel sterowania, w którym można monitorować i administrować klientami.
Darin Dimitrov
1
Ponadto, jeśli interfejs, na którym nasłuchuje gniazdo, zostanie wyłączony, gniazdo zostanie zamknięte.
rustyx
Myślę, że prosił o przykład.
EyoelD
@rustyx Thanks! Tak właśnie pomyślałem po przeczytaniu wszystkich odpowiedzi „zabij proces”… ale jego odpowiedź jest tylko sugestią, więc jest dla mnie w porządku (ale nie jest dobrą odpowiedzią), inne odpowiedzi są tak, jakby nie było sposobu, aby to zrobić.
Sebastian,
1

możesz użyć programu takiego jak tcpview z sysinternal. Myślę, że może ci to bardzo pomóc zarówno w monitorowaniu, jak i zabijaniu niechcianego połączenia.

Mochan
źródło
1

CurrPorts nie działało dla nas i mogliśmy uzyskać dostęp do serwera tylko przez ssh, więc nie było też TCPView. Nie mogliśmy też zabić tego procesu, aby nie porzucić innych połączeń. Skończyło się na tym, że nie zasugerowano nam jeszcze zablokowania połączenia w zaporze systemu Windows. Tak, to zablokuje wszystkie połączenia pasujące do reguły, ale w naszym przypadku było tylko jedno połączenie (to, które nas interesowało):

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

Zastąp adres IP tym, którego potrzebujesz, i w razie potrzeby dodaj inne reguły.

afarah
źródło
0

natychmiastowa / wykonalna / częściowa odpowiedź : https://stackoverflow.com/a/20130959/2584794 w

przeciwieństwie do poprzedniej odpowiedzi, w której użyto netstat -a -o -n niezwykle długa lista miała być przeglądana bez nazwy aplikacji korzystającej z tych porty

Anup
źródło
5
To prawie to samo, co odpowiedź HaoQi Li. To zabiłoby proces serwera, przerywając każde połączenie, a nie tylko niepożądane. Wyzwaniem jest porzucenie tylko tego niepożądanego i nic więcej.
Victor Stafusa
Zgadzam się z Victorem. To nie jest odpowiedź na pytanie. Więc możesz również wyłączyć kartę sieciową ...
Sebastian,
-3

Tak, istnieje możliwość zamknięcia portu TCP lub UDP, jest polecenie w DOS

TASKKILL /f /pid 1234 

Mam nadzieję, że to zadziała dla Ciebie

Bijay Budhathoki
źródło
Testowałem na systemie Windows 10 i nie zabija samego połączenia TCP, ale cały proces lub wątek, który go używa. Jak stwierdził Victor, to nie jest jego celem.
Sebastian,
-3

Jeśli pracujesz w systemie Windows 8, `Windows Server 2012 lub nowszym z zainstalowanym programem PowerShell v4 powyżej, możesz użyć poniższego skryptu. Znajduje procesy powiązane z portem i kończy je.

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 

Dokumentacja:

JohnLBevan
źródło
Testowałem na systemie Windows 10 i nie zabija samego połączenia TCP, ale cały proces lub wątek, który go używa. Jak stwierdził Victor, to nie jest jego celem.
Sebastian,