Як я можу перевірити, які порти зайняті та які порти безкоштовні на моїй машині Linux?


30

Чи є якась команда командного рядка чи інший спосіб знайти та перелічити зайняті та вільні номери портів на моїй машині Linux?

Відповіді:


41

Команда

netstat -antu

покаже всі порти tcp та udp, які використовуються. Вихід буде виглядати приблизно так:

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

Число після двокрапки в полі Місцева адреса показує порт, який використовується. Якщо стан "LISTEN", це означає порт, який використовується для вхідних з'єднань. Якщо IP-адреса в Local Addressполі - 0.0.0.0це означає, що вхідні з'єднання будуть прийняті на будь-яку IP-адресу, призначену для інтерфейсу - значить, це означає, що з'єднання походять за межами вашої машини.

Якщо він сказав, localhostабо 127.0.0.1це буде лише прийняття з'єднань з вашої машини.

Крім того, якщо ви додасте -pпараметр і запустите його як root, він покаже процес, який відкрив порт:

$ 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

Все, що не відображається як використовується, є безкоштовним, проте користувачі (непривілейовані акаунти) можуть відкривати порти вище 1023.


це означає, що вхідні з'єднання будуть прийняті на будь-яку IP-адресу, призначену в інтерфейсі, - значить, це означає, що підключення, що походять за межами вашої машини , ви не помилилися тут? Ви, мабуть, мали на увазі, що з'єднання будуть прийняті, якщо вони надійдуть за будь-якою адресою, призначеною для даного інтерфейсу, незалежно від їх походження. Походження вхідних з'єднань, ймовірно, вказане в наступному стовпці Іноземна адреса. Отже, якщо у вас є значення
0,0.0.0

1
@ user907860 Можливо, це не зрозуміло, але різницю, яку я роблю, є між 0,0.0.0 та 127.0.0.1 - останній приймає лише з'єднання з вашої машини, оскільки він прослуховує нерозподілену IP-адресу. Якщо 0,0.0.0 означає будь-яку адресу на вашій машині, і за умови їх маршрутизації, з'єднання можна здійснювати з інших машин.
Павло

Просто FYI, -antuможе бути записаний як -tuna🐟
Abdennour TOUMI


7

Хороший і надійний спосіб перевірити наявність відкритих портів - це використання ss(заміна застарілого netstat ), його можна використовувати в сценарії, не вимагаючи підвищених привілеїв (тобто sudo).

Використання: опція -lдля прослуховування портів, опція -nобходу роздільної здатності DNS та фільтр на вихідний порт NN: src :NN(замінити NNпортом, який ви хочете контролювати). Детальніше дивman ss

ss -ln src :NN

Приклади:

[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

І в скрипті, використовуючи grep, ми можемо перевірити, чи не містить вихідний порт, про який ми просили. Приклад із використовуваним портом 80 (див. Вище):

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)

Приклад з портом 81 не використовується (див. Вище)

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)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.