Jak zamknąć porty w systemie Linux?


38

Mam jakieś pytanie w zamykaniu portu, myślę, że mam dziwne rzeczy.

Kiedy używam wykonać

nmap --top-ports 10 192.168.1.1

pokazuje, że port 23 / TCP jest otwarty.

Ale kiedy wykonam

nmap --top-ports 10 localhost

pokazuje, że port 23 / tcp jest zamknięty.

Które z nich jest prawdziwe? Chcę zamknąć ten port w całym systemie, jak mogę to zrobić?


10
oba są prawdziwe. Porty TCP nie są powiązane z hostami. są powiązane z interfejsami sieciowymi. różnica jest subtelna, ale ważna. interfejsy są często takie same jak hosty, ale nie zawsze. w tym przypadku (jak podano w odpowiedziach) localhostuzyskuje dostęp do lointerfejsu (sprzężenia zwrotnego). Adres IP jest accesing swój prawdziwy interfejs, prawdopodobnie eth0lub wlan0lub somesuch.
strugee

3
Pozorna naiwność tego pytania doprowadziła do niesamowitych odpowiedzi. Dziękuję za pytanie!
dotancohen

Odpowiedzi:


47

Nmap to świetny skaner portów, ale czasem potrzebujesz czegoś bardziej autorytatywnego. Możesz zapytać jądro, jakie procesy mają otwarte porty, używając netstatnarzędzia:

me @ myhost: ~ $ sudo netstat -tlnp
Aktywne połączenia internetowe (tylko serwery)
Proto Recv-Q Send-Q Adres lokalny Adres obcy Stan PID / nazwa programu
tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 1004 / dnsmasq    
tcp 0 0 0,0,0,0:22 0,0,0,0:* SŁUCHAJ 380 / sshd        
tcp 0 0 127.0.0.1:631 0.0.0.0:* POSŁUCHAJ 822 / cupsd       
tcp6 0 0 ::: 22 ::: * LISTEN 380 / sshd        
tcp6 0 0 :: 1: 631 ::: * LISTEN 822 / cupsd       

Dostępne opcje to:

  • -t Tylko TCP
  • -l Tylko porty nasłuchiwania
  • -n Nie szukaj nazw usług i hostów, po prostu wyświetlaj numery
  • -p Pokaż informacje o procesie (wymaga uprawnień roota)

W tym przypadku widzimy, że sshdnasłuchuje na dowolnym 0.0.0.0porcie 22 interfejsu i cupsdnasłuchuje na 127.0.0.1porcie 631 pętli zwrotnej. Twój wynik może wskazywać, że telnetdma lokalny adres 192.168.1.1:23, co oznacza, że ​​nie będzie odpowiadał na połączenia na adapterze pętli zwrotnej (np. nie możesz telnet 127.0.0.1).

Istnieją inne narzędzia, które pokażą podobne informacje (np. lsofLub /proc), ale netstat jest najbardziej dostępny. Działa nawet w systemie Windows ( netstat -anb). BSD netstat jest trochę inny: będziesz musiał użyć sockstat (1), aby uzyskać informacje o procesie.

Po uzyskaniu identyfikatora procesu i nazwy programu możesz przejść do znajdowania procesu i zabijania go, jeśli chcesz zamknąć port. Aby uzyskać bardziej szczegółową kontrolę, możesz użyć zapory ogniowej (iptables w systemie Linux), aby ograniczyć dostęp tylko do niektórych adresów. Może być konieczne wyłączenie uruchamiania usługi. Jeśli PID ma „-” w Linuksie, prawdopodobnie jest to proces jądra (jest to na przykład typowe dla NFS), więc powodzenia w znalezieniu tego, co to jest.

Uwaga: Powiedziałem „autorytatywny”, ponieważ nie przeszkadzają ci warunki sieciowe i zapory ogniowe. Jeśli ufasz swojemu komputerowi, to świetnie. Jeśli jednak podejrzewasz, że zostałeś włamany, możesz nie być w stanie zaufać narzędziom na swoim komputerze. Zastąpienie standardowych narzędzi (a czasem nawet wywołań systemowych) narzędziami, które ukrywają określone procesy lub porty (inaczej rootkity), jest standardową praktyką wśród atakujących. Najlepszym rozwiązaniem w tym momencie jest wykonanie kryminalistycznej kopii dysku i przywrócenie jej z kopii zapasowej; następnie użyj kopii, aby określić sposób, w jaki się dostali i zamknąć.


14

System Linux ma tak zwany interfejs pętli zwrotnej, który służy do komunikacji wewnętrznej. Jego nazwa hosta to localhosti adres IP 127.0.0.1.

Po uruchomieniu nmapna localhost, to rzeczywiście uruchomić PortScan na wirtualnym interfejsu pętli zwrotnej. 192.168.1.1to adres IP twojego fizycznego (najprawdopodobniej eth0) interfejsu.

Więc korzystasz nmapz dwóch różnych interfejsów sieciowych, dlatego jest różnica w otwartych portach. Oba są prawdziwe.

Jeśli masz otwarty port TCP 23, prawdopodobnie masz telneturuchomiony serwer (co nie jest dobre ze względu na brak szyfrowania) lub masz na swoim komputerze konia trojańskiego.


1
więc jak mogę to zamknąć?
user74080

4
@ user74080 Możesz dodać iptablesregułę, jak sugeruje odpowiedź w pobliżu, ale spowoduje to, że usługa będzie nieużywana, co zużywa zasoby. Więc jeśli masz telnetdbieg, po prostu go wyłącz.
psimon

12

Aby „zamknąć” port, którego można użyć iptables

sudo iptables -A INPUT -p tcp --dport 23 -m state --state NEW,ESTABLISHED -j DROP

1
W tej odpowiedzi „zamknięcie portu” oznacza „zignorowanie jakiegokolwiek ruchu do niego”. Port jest nadal otwarty, ale nie można już do niego dotrzeć. Zauważ też, że DROProbi tak, jak mówi, widzi pakiet, a następnie go ignoruje. Zwykle (bez włączonego iptables) jądro odsyła nieosiągalny pakiet portu ICMP z powrotem ( REJECTzamiast tego można symulować z celem DROP).
Lekensteyn

3
@Lekensteyn Port ICMP nieosiągalny jest dla UDP. Właściwym pakietem do odpowiedzi jest pakiet TCP RST, który można również wygenerować za pomocą obiektu REJECTdocelowego przez zapis -j REJECT --reject-with tcp-reset.
kasperd

Pomimo niższego wyniku jest to pierwsza odpowiedź, która faktycznie odpowiada na pytanie. Ktokolwiek może dodać tutaj więcej wyników, zrób to.
EnzoR

2

Jeśli to zrobisz nmap localhost, powie ci o innej sytuacji: niektóre programy na Linuksie działają jako serwer, chociaż są używane tylko lokalnie. Jest tak, ponieważ inne programy używają ich jak serwera, z którym się łączą. Obie odpowiedzi są prawdziwe, ponieważ pytasz o coś innego.

Port 23 służy do telnet. Zwykle nie jest już używany. Spróbuj zrobić, nmap -sV 192.168.1.1aby dowiedzieć się, który program otwiera port.

(192 ... to adres IP sieci lokalnej, więc wynik nmap <your outside world IP>da również inny wynik, ze względu na możliwe ustawienia zapory itp.)


1

Jeśli masz usługę działającą i nasłuchującą na porcie 23, jest prawdopodobnie czystsze, aby zatrzymać proces nasłuchujący na porcie 23 (prawdopodobnie telnet) niż utrzymać go w działaniu i zamknąć lub zablokować korzystanie z portu 23 iptables.

Gdy na porcie nie ma procesu nasłuchującego, nawet przy braku bloku zapory, każda próba połączenia się z nim powinna skutkować natychmiastowym „odrzuceniem połączenia” ( ECONNREFUSEDdo connect(2))

Jednym ze sposobów znalezienia procesu (i jego pid), który nasłuchuje na porcie 23, jeśli taki proces jest, jest:

sudo lsof -i -P | grep ':23 '

Na powyższych -ilistach otwarte porty internetowe (zarówno UDP, jak i TCP), a -P hamuje translację portów na nazwy usług (przez /etc/services)

Po znalezieniu działającego procesu nasłuchującego na porcie 23 możesz dowiedzieć się, jak się zaczął, patrząc na drzewo procesów (powiedzmy, pstree). Jeśli jego rodzic jest init(bardzo prawdopodobne), możesz rekurencyjnie wyszukać nazwę procesu w /etc. na przykład:

sudo grep -r telnet /etc

Powinno to doprowadzić Cię do najlepszego sposobu, aby wyłączyć go z pierwszego miejsca.


Nie ma potrzeby używania grep (a jeśli tak, to nie ma potrzeby cytowania). Możesz użyć sudo lsof -Pi :23.
Théophile

Cytaty są tam nie bez powodu. Aby upewnić się, że 23dopasowany jest tylko port Telnet ( ). Jeśli nie zawierać spacji za :23to odpowiadają :234, :2345itp
arielf

O, rozumiem. To ma sens dla grep. Nawiasem mówiąc, wydaje się, że polecenie bez grep ( lsof -Pi :23) szuka dokładnego dopasowania.
Théophile
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.