2010-04-06 03:39:57 +0000 2010-04-06 03:39:57 +0000
116
116

Ręczne zamykanie portu z linii komend

Chcę zamknąć otwarty port, który jest w trybie nasłuchiwania pomiędzy moją aplikacją kliencką i serwerową.

Czy w Linuksie jest jakaś ręczna opcja z linii komend aby zamknąć port?

NOTE: Dowiedziałem się, że “tylko aplikacja posiadająca podłączone gniazdo powinna je zamknąć, co stanie się gdy aplikacja zakończy pracę”

Nie rozumiem dlaczego jest to możliwe tylko przez aplikację, która je otwiera … Ale nadal chcę wiedzieć, czy jest jakiś inny sposób, aby to zrobić.

Odpowiedzi (13)

137
137
137
2013-11-01 01:43:00 +0000

Miałem ten sam problem, proces musi pozostać przy życiu, ale gniazdo musi się zamknąć. Zamknięcie gniazda w uruchomionym procesie nie jest niemożliwe, ale trudne:

  1. zlokalizuj proces :

  2. zlokalizuj deskryptor pliku gniazda w procesie

  3. Teraz podłącz proces:

  4. Teraz zamknij gniazdo:

20
20
20
2012-02-13 08:44:54 +0000

Fuser może być również używany

fuser -k -n *protocol portno*

Tutaj protokół jest tcp/udp, a portno jest numerem, który chcesz zamknąć. Np.

fuser -k -n tcp 37

Więcej informacji na stronie man fuser

6
6
6
2010-04-06 09:38:15 +0000

Alternatywnie możesz użyć iptables:

iptables -I INPUT -p tcp --dport 80 -j DROP

W zasadzie osiąga to, co chcesz. Spowoduje to spadek całego ruchu TCP na port 80.

3
3
3
2010-04-06 03:45:53 +0000
netstat -anp | grep 80

Jeśli używasz apache'a, “httpd” (to tylko przykład, użyj portu, którego używa Twoja aplikacja zamiast 80)

pkill -9 httpd

lub

killall -9 httpd
2
2
2
2015-05-27 03:46:19 +0000

Najpierw szukałem procesów mongo i węzłów, potem zrobiłem następujące:

ps -A | grep node

10418 pts/23 00:00:05 node

10551 pts/23 00:00:00 node

ps -A | grep mongo

10490 pts/23 00:00:00 mongod

Po zidentyfikowaniu, po prostu zabij procesy komendą kill.

kill -9 10418
kill -9 10490

Na koniec, wpisz meteor i powinien znów działać.

2
2
2
2012-04-22 05:02:17 +0000

Prawdopodobnie mógłbyś po prostu dowiedzieć się, jaki proces otworzył gniazdo, z którym port jest związany, i zabić ten proces.

Ale, musiałbyś zdać sobie sprawę, że jeśli ten proces nie ma obsługi, która deinicjuje wszystkie rzeczy, których używał (otwarte pliki, gniazda, widelce, rzeczy, które mogą pozostać, chyba że zostaną prawidłowo zamknięte po zakończeniu), wtedy stworzyłbyś to przeciągnięcie na wydajność systemu. Dodatkowo, gniazdo pozostanie otwarte dopóki jądro nie zorientuje się, że proces został zabity. Zwykle trwa to tylko około minuty.

Przypuszczam, że lepszym pytaniem będzie: Jaki port (należący do jakiego procesu) chcesz zatrzymać?

Jeśli próbujesz położyć kres znalezionemu backdoor'owi lub wirusowi, powinieneś przynajmniej dowiedzieć się jakie dane przechodzą tam i z powrotem zanim je zakończysz. (wireshark jest do tego dobry) (A nazwa wykonywalna procesu, więc możesz go usunąć i zapobiec jego ponownemu uruchomieniu) lub, jeśli jest to coś, co zainstalowałeś (jak HTTPD lub FTPD lub coś w tym stylu) to powinieneś już mieć dostęp do samego procesu.

Zwykle będzie miał program sterujący (HTTPD stop|start lub coś w tym stylu). Albo, jeśli jest to rzecz systemowa, prawdopodobnie nie powinieneś z nią zadzierać. W każdym razie pomyślałem, że skoro wszyscy inni dają ci kąt “jak do”, powinienem dać ci zastrzeżenia.

2
2
2
2015-04-23 06:06:09 +0000

Jeśli chcesz, aby twój port został zwolniony wcześniej, musisz ustawić następującą wartość:

echo 1 > /proc/sys/net/ipv4/tcp_fin_timeout

aby ustawić go od 60 sekund (domyślnie) do 1 sekundy

1
1
1
2010-04-06 04:10:46 +0000

Możesz napisać skrypt, który zmodyfikowałby iptables i zrestartował je. Jeden skrypt dodaj±cy regułę zrzucaj±c± wszystkie pakiety na port, drugi usuwaj±cy wspomnian± regułę.

Pozostałe odpowiedzi pokazały jak zabić proces zwi±zany z portem - to może nie być to co chcesz. Jeżeli chcesz, aby serwer działał nadal, ale aby nie było połączeń z klientami, to chcesz zablokować port, a nie zatrzymać proces.

1
1
1
2015-07-29 02:25:58 +0000

Można użyć komendy o nazwie killcx, zamykającej połączenie bez potrzeby zabijania procesu.

  • składnia:
killcx [dest_ip:dest_port] {interface}

dest_ip : remote IP
dest_port : remote port
interface (optional) : network interface (eth0, lo etc).
  • przykład:
killcx 120.121.122.123:1234
killcx 120.121.122.123:1234 eth0
1
1
1
2015-10-15 08:45:34 +0000

Zdaję sobie sprawę, że ta odpowiedź nie odpowiada na samo pytanie, ściśle rzecz biorąc, ale wczytając się w nią, może to być istotna informacja:

Domyślnym zachowaniem wiązania gniazda z portem (i adresem) jest to, że gdy gniazdo zostanie zamknięte przez nagłe zakończenie procesu, pozostanie ono przez jakiś czas w TIME_WAIT. Będzie to oznaczać, że nie można od razu ponownie związać się z tym adresem/portem. Jeśli rozwijasz sam system poprzez standardowy interfejs gniazda BSD, możesz (przynajmniej w pewnym stopniu) kontrolować to zachowanie za pomocą opcji gniazda SO_REUSEADDR. Zasadniczo pozwoli to na ponowne przypisanie do tego samego adresu/portu, jeśli gniazdo jest w stanie TIME_WAIT. Wciąż jednak jedno gniazdo na każdy port!

Jednak ta informacja powinna być używana tylko jako pomoc rozwojowa, ponieważ istnieje powód, dla którego TIME_WAIT ma istnieć w pierwszej kolejności, wyjaśniony już w innych odpowiedziach.

1
1
1
2013-11-01 02:08:35 +0000

Jeszcze jedna sprawa: czasami jądro samo posiada porty. Wiem, że routing NAT posiada pewne porty otwarte do użytku NAT. Nie można w tym celu zabić procesu, to jest jądro, i wymagana jest rekonfiguracja i restart.

0
0
0
2016-03-30 10:02:54 +0000

Jeśli nie chcesz żadnego ruchu nad gniazdem, ale chcesz utrzymać ten proces przy życiu: tcpkill .

tcpkill -i eth0 host xxx.xxx.xxx.xxx and port yyyy

Uruchomi węszącego demona, który przechwyci i zniszczy cały ruch na tym porcie. Bardzo przydatny do testowania aplikacji pod kątem podziałów sieci.

0
0
0
2019-08-07 15:17:33 +0000

Możesz zamknąć gniazdo odsłuchowe używając ss :

sudo ss --kill state listening src :1234

Gdzie 1234 to numer twojego portu.

ss jest częścią pakietu iproute2, więc jest to silna zmiana, która jest już zainstalowana na nowoczesnym Linuksie.

Dowiedziałem się o tym z odpowiedzi na powiązane pytanie .