Chcę zamknąć otwarty port, który jest w trybie nasłuchu między aplikacją klienta a serwerem.
Czy w Linuksie istnieje jakaś ręczna opcja wiersza polecenia, aby zamknąć port?
UWAGA: Dowiedziałem się, że „tylko aplikacja, która jest właścicielem podłączonego gniazda, powinna je zamknąć, co nastąpi po zakończeniu aplikacji”.
Nie rozumiem, dlaczego jest to możliwe tylko dzięki aplikacji, która ją otwiera ... Ale wciąż chcę wiedzieć, czy jest jakikolwiek inny sposób, aby to zrobić.
Odpowiedzi:
Miałem ten sam problem, proces musi się utrzymać, ale gniazdo musi się zamknąć. Zamknięcie gniazda w uruchomionym procesie nie jest niemożliwe, ale trudne:
zlokalizuj proces:
Dostaniesz
source/destination ip:port portstate pid/processname
mapazlokalizuj deskryptor pliku gniazda w procesie
Otrzymasz listę: nazwa procesu, pid, użytkownik, fileDescriptor, ... ciąg połączenia.
Znajdź odpowiedni numer plikuDescriptor dla połączenia.
Teraz połącz proces:
Teraz zamknij gniazdo:
Następnie odłącz:
A gniazdo jest zamknięte.
źródło
sudo lsof -np $pid
daje mi około 200 linii i jestem zdezorientowany, jak znaleźć pożądane FD. W moim przypadku proces to karta Chrome i próbuję zamknąć otwarte witryny internetowe ...shutdown
:call shutdown($fileDescriptor, 0)
.Tutaj zadajesz złe pytanie. Nie jest możliwe po prostu „zamknąć port” spoza aplikacji, która otworzyła gniazdo nasłuchując na nim. Jedynym sposobem na to jest całkowite zabicie procesu, który jest właścicielem portu. Następnie, za minutę lub dwie, port będzie ponownie dostępny do użytku. Oto, co się dzieje (jeśli nie obchodzi cię to, przejdź do końca, gdzie pokażę ci, jak zabić proces będący właścicielem konkretnego portu):
Porty to zasoby przydzielane przez system operacyjny różnym procesom. Jest to podobne do pytania systemu operacyjnego o wskaźnik pliku. Jednak w przeciwieństwie do wskaźników plików, tylko JEDEN proces na raz może posiadać port. Dzięki interfejsowi gniazda BSD procesy mogą żądać nasłuchu na porcie, który system operacyjny następnie udzieli. System operacyjny upewni się również, że żaden inny proces nie uzyska tego samego portu. W dowolnym momencie proces może zwolnić port, zamykając gniazdo. System operacyjny odzyska port. Alternatywnie, jeśli proces zakończy się bez zwolnienia portu, system operacyjny ostatecznie odzyska port (choć nie nastąpi to natychmiast: zajmie to kilka minut).
Teraz, co chcesz zrobić (po prostu zamknij port z linii poleceń), nie jest możliwe z dwóch powodów. Po pierwsze, gdyby było to możliwe, oznaczałoby to, że jeden proces mógłby po prostu wykraść zasób innego procesu (port). Byłaby to zła polityka, chyba że byłaby ograniczona do procesów uprzywilejowanych. Drugim powodem jest to, że nie jest jasne, co stanie się z procesem, który był właścicielem portu, jeśli pozwolimy mu kontynuować działanie. Kod procesu jest napisany przy założeniu, że jest właścicielem tego zasobu. Gdybyśmy go po prostu usunęli, skończyłoby się to na jego własnym zawieszeniu, więc OS nie pozwala ci tego zrobić, nawet jeśli jesteś uprzywilejowanym procesem. Zamiast tego musisz je po prostu zabić.
W każdym razie, jak zabić proces, który jest właścicielem konkretnego portu:
Spowoduje to wyświetlenie linii odpowiadającej portowi wstrzymania procesu, na przykład:
W tym przypadku, procHoldingPort to nazwa procesu, który otworzył port, 4683 jest jego pid i 8000 (zauważ, że jest to TCP) to numer portu, który przechowuje.
Następnie spójrz na ostatnią kolumnę, zobaczysz /. Następnie wykonaj to:
Jeśli to nie zadziała (możesz sprawdzić, uruchamiając ponownie polecenie netstat). Zrób to:
Ogólnie lepiej jest unikać wysyłania SIGKILL, jeśli możesz. Dlatego mówię ci, żebyś spróbował
kill
przedkill -9
. Po prostu używamkill
wysyła łagodniejszego SIGTERM.Jak już powiedziałem, ponowne otwarcie portu zajmie kilka minut, jeśli to zrobisz. Nie wiem, jak to przyspieszyć. Jeśli ktoś inny, chciałbym to usłyszeć.
źródło
unix.tools.port.close(<my port number>)
użyłbyminit 6
.Można również użyć utrwalacza
Tutaj protokołem jest tcp / udp, a portno to numer, który chcesz zamknąć. Na przykład.
Więcej informacji na stronie strona man fuser
źródło
fuser
prowadzony jest?fuser
znajduje proces używający portu i zabija go, ale nie rozwiązuje faktu, że gniazdo nie jest zamknięte. 60 sekund, a jądro robi to za mnie.Możesz alternatywnie użyć iptables:
W zasadzie osiąga to, co chcesz. Spowoduje to usunięcie całego ruchu TCP do portu 80.
źródło
-j REJECT
aby zwrócić flagę resetowania TCP, która byłaby wtedy postrzegana jako mój proces posiadania (ale tylko wtedy, gdy druga strona próbuje coś wysłać).Powinien ci powiedzieć, jeśli używasz apache, „httpd” (to tylko przykład, użyj portu, którego używa aplikacja zamiast 80)
lub
źródło
Prawdopodobnie po prostu dowiesz się, jaki proces otworzył gniazdo, w którym znajduje się port związane z i zabij ten proces.
Ale musiałbyś to sobie uświadomić, chyba że ten proces ma procedurę obsługi, która deinicjalizuje wszystkie używane elementy (otwarte pliki, gniazda, widelce, rzeczy, które mogą pozostać, dopóki nie zostaną prawidłowo zamknięte po zakończeniu) wtedy stworzyłbyś ten ciąg na wydajności systemu. Dodatkowo gniazdo pozostanie otwórz aż jądro zda sobie sprawę, że proces został zabity. To zwykle tylko trwa około minuty.
Przypuszczam, że lepszym pytaniem byłoby: Jaki port (należący do jaki proces) chcesz zatrzymać?
Jeśli próbujesz położyć kres backdoorowi lub wirusa, który znalazłeś, powinieneś przynajmniej dowiedzieć się, jakie dane przechodzą tam iz powrotem przed zakończeniem. (wireshark jest na to dobry) (I nazwa pliku wykonywalnego procesu, abyś mógł go usunąć i zapobiec jego ponownemu uruchomieniu) lub, jeśli jest to coś, co zainstalowałeś (np. HTTPD lub FTPD lub coś takiego), powinieneś już mieć dostęp do sam proces.
Zazwyczaj będzie miał program sterujący (HTTPD stop | start lub coś). Lub, jeśli jest to sprawa systemowa, prawdopodobnie nie powinieneś się tym zaśmiecać. W każdym razie pomyślałem, że skoro wszyscy inni dają ci kąt „jak to zrobić”, powinienem dać ci zastrzeżenia.
źródło
Najpierw szukałem procesów mongo i węzłów, a następnie:
Po zidentyfikowaniu po prostu zabij procesy za pomocą polecenia kill.
Na koniec wpisz
meteor
i powinno działać ponownie.źródło
Możesz napisać skrypt, który zmodyfikował iptables i uruchomił je ponownie. Jeden skrypt do dodawania reguły upuszczającej wszystkie pakiety na porcie, kolejny skrypt do usuwania wspomnianej reguły.
Inne odpowiedzi pokazały, jak zabić proces związany z portem - to może nie być to, czego chcesz. Jeśli chcesz, aby serwer działał, ale aby zapobiec połączeniom z klientami, chcesz zablokować port, a nie zatrzymać proces.
źródło
Jeszcze jeden problem: kiedyś jądro jest właścicielem portów. Wiem, że routing NAT zawiera niektóre porty otwarte do użycia NAT. Nie można zabić procesu, jest to jądro, wymagana jest rekonfiguracja i ponowne uruchomienie.
źródło
Jeśli chcesz, aby Twój port został zwolniony wcześniej, musisz ustawić następującą wartość:
aby ustawić od 60 sekund (domyślnie) do 1 sekundy
źródło
Możesz użyć polecenia o nazwie killcx, zamykając połączenie bez żadnego procesu, który ma zostać zabity.
źródło
Zdaję sobie sprawę, że ta odpowiedź nie odpowiada na samo pytanie, ściśle mówiąc, ale przeczytanie tego może być istotną informacją:
Domyślnym sposobem wiązania gniazda z portem (i adresem) jest to, że gdy gniazdo zostanie zamknięte przez nagłe zakończenie procesu, gniazdo pozostanie przez pewien czas w TIME_WAIT. Oznacza to, że nie możesz natychmiast ponownie powiązać tego adresu / portu. Jeśli sam tworzysz system za pomocą standardowego interfejsu gniazda BSD, możesz (przynajmniej w pewnym stopniu) kontrolować to zachowanie za pomocą opcji gniazda SO_REUSEADDR. Pozwoli to w zasadzie ponownie połączyć się z tym samym adresem / portem, jeśli gniazdo ma status TIME_WAIT. Wciąż jedno gniazdo na port!
Jednak ta informacja powinna być wykorzystywana jedynie jako pomoc rozwojowa, ponieważ istnieje powód, dla którego TIME_WAIT istnieje przede wszystkim, już wyjaśniono w innych odpowiedziach.
źródło
Jeśli nie chcesz ruchu przez gniazdo, ale chcesz zachować proces: tcpkill .
Uruchomi demona wąchania, który przechwytuje i niszczy cały ruch na tym porcie. Bardzo przydatny do testowania aplikacji pod kątem podziałów sieciowych.
źródło