Как я могу проверить, какие порты заняты, а какие свободны на моей машине с 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

Число после двоеточия в поле Local Address указывает используемый порт. Если состояние «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, это означает, что соединения будут приниматься откуда угодно, в том числе и за пределами компьютера
user907860
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)
Томас
источник