Sprawdź, czy port jest otwarty czy zamknięty na serwerze Linux?

209

Jak mogę sprawdzić, czy port nasłuchuje na serwerze z systemem Linux?

James Anderson
źródło
2
Nie jest do końca jasne, o co pytasz. Co rozumiesz przez „otwarty”? Czy masz na myśli, że jakiś serwer nasłuchuje na tym porcie? A może masz na myśli zaporę systemową? Albo co?
David Schwartz,
Myślę, że port jest blokowany na moim serwerze i chcę go odblokować / otworzyć ponownie.
James Anderson,
14
netstat -an | grep PORTNUMBER | grep -i listenJeśli dane wyjściowe są puste, port nie jest używany.
automatix

Odpowiedzi:

187

Możesz sprawdzić, czy proces nasłuchuje na porcie TCP lub UDP netstat -tuplen.

Aby sprawdzić, czy niektóre porty są dostępne z zewnątrz (prawdopodobnie tego właśnie chcesz), możesz użyć skanera portów, takiego jak Nmap z innego systemu. Uruchamianie Nmapa na tym samym hoście, który chcesz sprawdzić, jest całkiem bezużyteczne.

joschi
źródło
54
GNU netstat zna parametry -t, -u, -p, -l, -e, i -n. Dzięki parserowi opcji można go wyrazić jako -tuplen. linux.die.net/man/8/netstat
joschi
3
Ponadto telnetpolecenie zwykle obsługuje tylko protokół TCP, więc nie masz szczęścia, jeśli usługa, którą chcesz sprawdzić, działa na innym protokole.
joschi
1
tak, korzystałem z systemu Windows, stąd zamieszanie.
Dexter
2
nc jest (lepszą) alternatywą dla telnet. Obsługuje również UDP.
Tsvetomir Dimitrov
1
Użyj go z sudo: sudo netstat -tuplen. To da ci procesy będące własnością nie tylko ciebie, ale także innych, i wydrukuje dodatkowe szczegóły (takie jak PID / nazwa programu), jeśli nie są jeszcze wyświetlane jako użytkownik inny niż root.
John Red,
102

Najszybszym sposobem na sprawdzenie, czy port TCP jest otwarty (w tym wszelkie posiadane zapory sprzętowe), jest napisanie na komputerze zdalnym (np. Na pulpicie):

telnet myserver.com 80

Który spróbuje otworzyć połączenie z portem 80 na tym serwerze. Jeśli dostaniesz czas lub odmówisz, port nie jest otwarty :)

Adrian Macneil
źródło
1
mówi, że nie rozpoznaje „telnet” jako polecenia ...
James Anderson,
6
„yum install telnet”, aby zainstalować pakiet klienta telnet.
cjc
8
Napisane powyżej:if you get a time out or deny, the port is not open
Przemysłowe
2
Co jeśli nie masz uprawnień do zainstalowania telnetu? Czy istnieje inne standardowe narzędzie?
KC Baltz
3
Próbowałem „telnet myhost 22” i dostałem limit czasu. Ale mogę ssh do tej maszyny. ?!
Torsten Bronger,
30

OK, podsumowując, masz serwer, na który możesz się zalogować. Chcesz sprawdzić, czy coś nasłuchuje na jakimś porcie. Jako root uruchom:

netstat -nlp

pokaże to listę procesów nasłuchujących na portach TCP i UDP. Możesz zeskanować go (lub grep) w poszukiwaniu interesującego Cię procesu i / lub oczekiwanych numerów portów.

Jeśli oczekiwany proces nie istnieje, powinieneś go uruchomić i ponownie sprawdzić netstat. Jeśli proces istnieje, ale nasłuchuje na interfejsie i porcie, którego się nie spodziewałeś, oznacza to problem z konfiguracją (np. Może nasłuchiwać, ale tylko na interfejsie pętli zwrotnej, więc zobaczysz 127.0.0.1:3306 i brak innych linii dla portu 3306, w przypadku domyślnej konfiguracji MySQL).

Jeśli proces się zakończył i nasłuchuje na oczekiwanym porcie, możesz spróbować uruchomić „telnet” na tym porcie z komputera Macbook w biurze / domu, np.

 telnet xxxxxxxxxxxx.co.uk 443

To sprawdzi, czy (zakładając standardowe porty), że istnieje serwer WWW skonfigurowany dla SSL. Zauważ, że ten test za pomocą telnetu zadziała tylko wtedy, gdy proces nasłuchuje na porcie TCP. Jeśli jest to port UDP, równie dobrze możesz spróbować z dowolnym klientem, którego chcesz użyć do połączenia się z nim. (Widzę, że użyłeś portu 224. To jest masqdialer i nie mam pojęcia co to jest).

Jeśli usługa jest dostępna, ale nie można do niej dotrzeć zewnętrznie, oznacza to, że blokuje ją zapora ogniowa. W takim przypadku uruchom:

 iptables -L -n

Spowoduje to wyświetlenie wszystkich reguł zapory zdefiniowanych w systemie. Możesz to opublikować, ale ogólnie, jeśli nie zezwalasz na wszystko w łańcuchu INPUT, prawdopodobnie będziesz musiał wyraźnie zezwolić na ruch na danym porcie:

 iptables -I INPUT -p tcp --dport 224 -j ACCEPT

lub coś podobnego. Nie uruchamiaj poleceń zapory na ślepo w oparciu o to, co powiedział ci nieznajomy w Internecie. Zastanów się, co robisz.

Jeśli zapora sieciowa na urządzeniu zezwala na żądany ruch, wówczas firma hostingowa może uruchamiać zaporę ogniową (np. Zezwala tylko na SSH (22 / tcp), HTTP (80 / tcp) i HTTPS (443 / tcp) i odrzucanie wszelkiego innego ruchu przychodzącego). W takim przypadku musisz otworzyć bilet pomocy technicznej, aby rozwiązać ten problem, ale przypuszczam, że może być coś w twoim cPanelu, który może na to pozwolić.

cjc
źródło
Czy możesz dodać, jak cofnąć polecenie iptables -I? Dzięki!!
Evgeny
1
„iptables -D”, po którym następuje cokolwiek innego po „-I” w pierwotnym poleceniu. Zasadniczo poszukaj dokumentacji.
cjc 10.09.13
11

Używam kombinacji netstati lsof:

netstat -an | grep <portnumber>
lsof -i:<portnumber>

Aby sprawdzić, czy port jest używany i co z niego korzysta.

królikarnia
źródło
nic nie podpowiada z sudo lub bez
Dheeraj Thedijje
1
@DheerajThedijje - wtedy ten port nie jest otwarty
warren
Tak, nie było, rozumiem.
Dheeraj Thedijje
7

Jeśli jesteś podłączony do systemu i możesz uruchomić komendę jako root, możesz sprawdzić dane wyjściowe iptables

iptables -L -vn

spowoduje to wyświetlenie listy reguł zapory i portów, które są otwartym celem ACCEPToraz jawnie zamkniętych portów docelowych REJECT.

użytkownik619714
źródło
A jeśli masz firewalld, jest to prostsze firewall-cmd --query-port=port/protocol, np firewall-cmd --query-port=80/tcp.
Agostino,
6

lsof -i :ssh wyświetli listę wszystkich procesów z otwartym portem ssh, zarówno nasłuchujących, jak i aktywnych połączeń.

pgs
źródło
Prefiks, sudojeśli nie zwraca żadnych danych wyjściowych.
Elijah Lynn