Получить список открытых портов в Linux

191

Мне нужна команда Linux для вывода списка всех свободных открытых портов для использования в приложении

lsof -i TCP| fgrep LISTEN

Не видно, что он помогает, поскольку перечисленные в нем порты не обязательно бесплатны для использования. Как мне перечислить свободные открытые порты, которые не используются?

ErrorNotFoundException
источник

Ответы:

258
netstat -lntu

ответ @askmish предоставит вам список служб, работающих в вашей системе на портах tcp и udp, где

  • -l = только сервисы, которые прослушивают какой-то порт
  • -n = показать номер порта, не пытайтесь разрешить имя службы
  • -t = порты TCP
  • -u = порты udp
  • -p = название программы

Вам не нужен параметр 'p', поскольку вы заинтересованы только в том, чтобы узнать, какие порты свободны, а не какая программа на нем запущена.

Это только показывает, какие порты в вашей системе израсходованы. Это не говорит вам о состоянии вашей сети, например, если вы находитесь за NAT и хотите, чтобы некоторые службы были доступны извне. Или, если брандмауэр блокирует порт для внешних посетителей. В этом случае на помощь приходит nmap. ВНИМАНИЕ: Используйте nmap только в сетях, которые находятся под вашим контролем. Кроме того, существуют правила брандмауэра, которые могут блокировать пинг Nmap, вам придется поиграться с опциями, чтобы получить правильные результаты.

mehulved
источник
20
Обратите внимание, что netstatво многих системах он устарел и ssдолжен использоваться вместо него.
Йоху
1
но если вы заняты ssне включены
jcollum
90

Поскольку net-toolsэто устарело , вы можете использовать ssкоманду вместо netstatif netstatна вашем компьютере:

ss -lntu

должен работать аналогично

netstat -lntu

согласно встроенной справке:

-n, --numeric       don't resolve service names
-l, --listening     display listening sockets
-t, --tcp           display only TCP sockets
-u, --udp           display only UDP sockets
Эрик Финн
источник
3
Еще один полезный флаг - это -p, который показывает идентификатор процесса сокета.
Talespin_Kit
21

Эта команда выведет список открытых сетевых портов и процессов, которым они принадлежат:

netstat -lnptu

После этого вы можете отфильтровать результаты по вашим точным спецификациям.

Вы также можете использовать nmapдля более детальных результатов о портах.

askmish
источник
2
Флаг -p требует прав суперпользователя для некоторых процессов, поэтому это будетsudo netstat -lnptu
klaus se
5

Все открытые порты, включая ответный трафик:

netstat -tuwanp 2>/dev/null | awk '{print $4}' | sort | uniq -c | wc -l
diyism
источник
3
Список только уникальных номеров портов и только IPv4:netstat -tuwanp4 | awk '{print $4}' | grep ':' | cut -d ":" -f 2 | sort | uniq
Aaron C. de Bruyn
+1 за показ, как отфильтровать и извлечь числа из результата. Отредактировано для удаления вывода stderr из netstat (который добавляет заголовок к результату в Ubuntu).
Даташаман
Хм, на секунду мысли. -1 за не ответ на вопрос.
Даташаман
1

Мой первоначальный вопрос заключался в том, что он спрашивал о неиспользуемых портах, а не о портах, в настоящее время подключенных к сервисам. Если это так, то нет конкретного способа перечислить их, кроме как перечислить используемые порты и предположить, что остальные не используются.

Еще один момент, о котором следует помнить: как пользователь, вы не сможете открыть порт менее 1024 (для этого вам потребуются права root).

joat
источник
0

Следующая команда будет работать на любом Unix, который выводит в том же формате, что и Ubuntu / Debian - где локальный адрес находится в столбце 4, а вывод содержит двухстрочный заголовок вверху. Если любое из этих чисел отличается, настройте команду awk ниже.

Если вы хотите только IPv4:

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

Если вы хотите только IPv6:

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

Если вы хотите оба вместе:

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

Команда выводит список номеров портов, которые прослушиваются на всех интерфейсах. Если вы хотите перечислить все порты, которые прослушивают интерфейс localhost, используйте что-то вроде этого:

netstat -lnt | awk 'NR>2{print $4}' | grep -E '(127.0.0.1:|::1:)' | sed 's/.*://' | sort -n | uniq
datashaman
источник
0

Пытаться

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

и посмотри на это.

Robokishan
источник