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).
źródło
Odpowiedzi:
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.
źródło
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)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”
Teraz możesz ponownie uruchomić serwer na [adres IP]: [numer portu] bez problemu
źródło
System
Proces obsługujący połączenia sieciowe Windows.taskkill /pid 6168 /f
6168 to pidNa przykład chcesz zwolnić port 8080. Następnie wykonaj następujące polecenia.
Gotowe!
źródło
Jeśli znasz port, który chcesz zwolnić, możesz posortować listę netstat, szukając określonego portu w następujący sposób:
Wtedy pid pojawi się na igraszce, którą możesz zabić za pomocą zadania.
Możesz również spojrzeć na to pytanie, które jest przeznaczone specjalnie dla lokalnego hosta, ale myślę, że jest istotne:
źródło
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) ...
źródło
Wypróbuj narzędzie sysinternals / Microsoft tcpview (GUI) i Tcpvcon (wiersz poleceń)
źródło
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:
To wypisze coś takiego:
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:
Jeśli zamykasz usługę, lepiej użyj:
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
źródło
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:
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.
źródło
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/
źródło
Znalazłem właściwą odpowiedź na to. Wypróbuj TCPView firmy Sysinternals, która jest teraz własnością firmy Microsoft. Możesz go znaleźć pod adresem http://technet.microsoft.com/en-us/sysinternals/bb897437
źródło
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.
źródło
Aby zamknąć port, możesz zidentyfikować proces, który nasłuchuje na tym porcie i zakończyć ten proces.
źródło
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.
źródło
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):
Zastąp adres IP tym, którego potrzebujesz, i w razie potrzeby dodaj inne reguły.
źródło
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
źródło
Tak, istnieje możliwość zamknięcia portu TCP lub UDP, jest polecenie w DOS
Mam nadzieję, że to zadziała dla Ciebie
źródło
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
Dokumentacja:
NetStat
odpowiednik programu PowerShellTaskKill
odpowiednik programu PowerShellźródło