Jak mogę sprawdzić, które porty są zajęte, a które porty są wolne na moim komputerze z systemem Linux?

30

Czy istnieje jakieś polecenie wiersza polecenia lub inny sposób na znalezienie i wyświetlenie zajętych i wolnych numerów portów na moim komputerze z systemem Linux?

Jeegar Patel
źródło

Odpowiedzi:

41

Komenda

netstat -antu

pokaże wszystkie używane porty tcp i udp. Dane wyjściowe będą wyglądać mniej więcej tak:

Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 0.0.0.0:59753           0.0.0.0:*               LISTEN

Liczba po dwukropku w polu Adres lokalny wskazuje używany port. Jeśli stan to „LISTEN”, oznacza to port używany do połączeń przychodzących. Jeśli adres IP w Local Addresspolu oznacza, 0.0.0.0że połączenia przychodzące będą akceptowane na dowolny adres IP przypisany do interfejsu - oznacza to, że połączenia pochodzą z zewnątrz urządzenia.

Jeśli to powiedziałoby localhostlub 127.0.0.1będzie akceptować tylko połączenia z twojego komputera.

Dodatkowo, jeśli dodasz -pparametr i uruchomisz go jako root, wyświetli się proces, który otworzył port:

$ sudo netstat -antup
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:59753           0.0.0.0:*               LISTEN      860/rpc.statd

Wszystko, co nie jest pokazane jako używane, jest bezpłatne, jednak użytkownicy (konta nieuprzywilejowane) mogą otwierać porty tylko powyżej 1023.

Paweł
źródło
oznacza to, że połączenia przychodzące będą akceptowane pod dowolnym adresem IP przypisanym do interfejsu - a więc oznacza to, że z połączeń pochodzących poza twoim komputerem nie popełniłeś tutaj błędu? Prawdopodobnie miałeś na myśli, że połączenia zostaną zaakceptowane, jeśli przyjdą na dowolny adres przypisany do danego interfejsu, niezależnie od ich pochodzenia. Pochodzenie połączeń przychodzących jest prawdopodobnie określone w następnej kolumnie Adres obcy. Tak więc, jeśli ktoś ma 0.0.0.0 jako wartość, oznacza to, że połączenia będą akceptowane z dowolnego miejsca, w tym poza maszyną
użytkownik907860
1
@ user907860 Może to nie być jasne, ale wprowadzam rozróżnienie między 0.0.0.0 a 127.0.0.1 - ten ostatni akceptuje tylko połączenia z twojego komputera, ponieważ nasłuchuje na niezrejestrowanym adresie IP. Gdzie jako 0.0.0.0 oznacza dowolny adres na twoim komputerze, a więc pod warunkiem, że są one przekierowane, połączenia można nawiązywać z innych komputerów.
Paul
Po prostu FYI, -antumożna zapisać jako -tuna🐟
Abdennour TOUMI
13

Sam opracowałem małą listę .

Niektóre z moich ulubionych to:

netstat -tulpn
lsof -i -n -P
rudzik
źródło
7

Dobrym i niezawodnym sposobem sprawdzenia otwartych portów jest użycie ss(zamiennik przestarzałych netstat ), można go używać w skrypcie bez konieczności podwyższonych uprawnień (tj sudo.).

Użycie: opcja -lnasłuchiwania portów, opcja -nobejścia rozdzielczości DNS i filtr na porcie źródłowym NN: src :NN(zamień NNna port, który chcesz monitorować). Aby uzyskać więcej opcji, zobaczman ss

ss -ln src :NN

Przykłady:

[user@server ~]# ss -ln src :80
State       Recv-Q Send-Q       Local Address:Port   Peer Address:Port
LISTEN      0      128                      *:80                *:*
[user@server ~]# ss -ln src :81
State       Recv-Q Send-Q       Local Address:Port   Peer Address:Port

W skrypcie, używając grep, możemy sprawdzić, czy dane wyjściowe zawierają żądany port. Przykład z używanym portem 80 (patrz wyżej):

myport=80
# count the number of occurrences of port $myport in output: 1= in use; 0 = not in use
result=$(ss -ln src :$myport | grep -Ec -e "\<$myport\>")
if [ "$result" -eq 1 ]; then
  echo "Port $myport is in use (result == $result) "
else
  echo "Port $myport is NOT in use (result == $result) "
fi

# output:
Port 80 is in use (result == 1)

Przykład z nieużywanym portem 81 (patrz wyżej)

myport=81
result=$(ss -ln src :$myport | grep -Ec -e "\<$myport\>")
if [ "$result" -eq 1 ]; then
  echo "Port $myport is in use (result == $result) "
else
  echo "Port $myport is NOT in use (result == $result) "
fi

# output:
Port 81 is NOT in use (result == 0)
Tomasz
źródło