Uzyskaj listę otwartych portów w systemie Linux

191

Potrzebuję polecenia Linuksa, aby wyświetlić listę wszystkich wolnych otwartych portów do użycia w aplikacji

lsof -i TCP| fgrep LISTEN

Nie wydaje się pomagać, ponieważ wymienione porty niekoniecznie są bezpłatne. Jak wyświetlić listę wolnych otwartych portów, które nie są używane?

ErrorNotFoundException
źródło

Odpowiedzi:

258
netstat -lntu

jak odpowiedział @askmish da ci listę usług działających w twoim systemie na portach TCP i UDP gdzie

  • -l = tylko usługi nasłuchujące na jakimś porcie
  • -n = pokaż numer portu, nie próbuj rozpoznawać nazwy usługi
  • -t = porty TCP
  • -u = porty udp
  • -p = nazwa programu

Nie potrzebujesz parametru „p”, ponieważ jesteś zainteresowany tylko tym, które porty są wolne, a nie który program na nim działa.

To pokazuje jednak tylko, które porty w systemie są zużyte. Nie informuje to o stanie sieci, np. Jeśli masz za sobą NAT i chcesz, aby niektóre usługi były dostępne z zewnątrz. Lub jeśli zapora blokuje port dla odwiedzających z zewnątrz. W takim przypadku na ratunek przychodzi nmap. OSTRZEŻENIE: Korzystaj z nmap tylko w sieciach, które są pod twoją kontrolą. Istnieją również reguły zapory, które mogą blokować pingi nmap, będziesz musiał bawić się z opcjami, aby uzyskać poprawne wyniki.

mehulved
źródło
19
Zauważ, że netstatjest przestarzałe w wielu systemach i sspowinno się go używać.
Johu
1
ale jeśli jesteś ss
zajęty,
90

Ponieważ net-toolsjest przestarzałe , możesz użyć sspolecenia zamiast, netstatjeśli netstatnie ma go na twoim komputerze:

ss -lntu

powinien działać podobnie do

netstat -lntu

zgodnie z wbudowaną pomocą:

-n, --numeric       don't resolve service names
-l, --listening     display listening sockets
-t, --tcp           display only TCP sockets
-u, --udp           display only UDP sockets
Eric Finn
źródło
3
Inną przydatną flagą jest -p, która pokazuje identyfikator procesu gniazda.
Talespin_Kit
21

To polecenie wyświetli listę otwartych portów sieciowych i procesów, które są ich właścicielami:

netstat -lnptu

możesz następnie filtrować wyniki według dokładnych specyfikacji.

Możesz także użyć nmapdo bardziej szczegółowych wyników dotyczących portów.

pytać
źródło
2
Flaga -p wymaga uprawnień roota dla niektórych procesów, więc będzie tosudo netstat -lnptu
klaus se
5

Wszystkie otwarte porty, w tym ruch odpowiedzi:

netstat -tuwanp 2>/dev/null | awk '{print $4}' | sort | uniq -c | wc -l
diyizm
źródło
3
Lista tylko unikalnych numerów portów i tylko IPv4:netstat -tuwanp4 | awk '{print $4}' | grep ':' | cut -d ":" -f 2 | sort | uniq
Aaron C. de Bruyn,
+1 za pokazanie, jak filtrować i wyodrębniać liczby z wyniku. Edytowane, aby usunąć dane wyjściowe stderr z netstat (który dodaje nagłówek do wyniku w Ubuntu).
datashaman
Hmm, po namyśle. -1 za brak odpowiedzi na pytanie.
datashaman
1

Moje pierwotne pytanie polegało na tym, że pytał o nieużywane porty, a nie porty aktualnie podłączone do usług. W takim przypadku nie ma konkretnego sposobu na ich wylistowanie, poza wymienieniem użytych portów i założeniem, że pozostałe są nieużywane.

Należy pamiętać o jednym dodatkowym punkcie: jako użytkownik nie będziesz mógł otworzyć portu mniejszego niż 1024 (do tego potrzebne będą uprawnienia roota).

joat
źródło
0

Poniższe polecenie będzie działać na każdym systemie Unix, który wyświetla dane w tym samym formacie co Ubuntu / Debian - gdzie adres lokalny znajduje się w kolumnie 4, a wyjście zawiera nagłówek 2 wierszy u góry. Jeśli którakolwiek z tych liczb jest inna, dostosuj poniższe polecenie awk.

Jeśli chcesz tylko IPv4:

netstat -lnt | awk 'NR>2{print $4}' | grep -E '0.0.0.0:' | sed 's/.*://' | sort -n | uniq

Jeśli chcesz tylko IPv6:

netstat -lnt | awk 'NR>2{print $4}' | grep -E ':::' | sed 's/.*://' | sort -n | uniq

Jeśli chcesz obu razem:

netstat -lnt | awk 'NR>2{print $4}' | grep -E '(0.0.0.0:|:::)' | sed 's/.*://' | sort -n | uniq

Polecenie wyświetla listę numerów portów nasłuchujących na wszystkich interfejsach. Jeśli chcesz wyświetlić listę wszystkich portów nasłuchujących na interfejsie hosta lokalnego, użyj czegoś takiego:

netstat -lnt | awk 'NR>2{print $4}' | grep -E '(127.0.0.1:|::1:)' | sed 's/.*://' | sort -n | uniq
Datashaman
źródło
0

Próbować

sudo netstat -plnt | grep -E '(0.0.0.0:|:::|127.0.0.1:|::1:)' |  awk 'NR>2{print $7}' | sort -n  | uniq

i spójrz na to.

Robokishan
źródło