Отримайте список відкритих портів у Linux


191

Мені потрібна команда Linux, щоб перелічити всі вільні відкриті порти для використання в додатку

lsof -i TCP| fgrep LISTEN

Не бачить, що допомагає, оскільки перераховані порти не обов'язково є безкоштовними для використання. Як перерахувати вільні відкриті порти, які не використовуються?

Відповіді:


258
netstat -lntu

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

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

Параметр 'p' вам не потрібен, оскільки ви зацікавлені лише у тому, щоб отримати вільні порти, а не яка програма працює на ньому.

Це показує лише, які порти вашої системи використовуються, хоча. Це не говорить вам про стан вашої мережі, наприклад, якщо ви відстали від NAT і хочете, щоб деякі сервіси були доступні зовні. Або якщо брандмауер блокує порт для зовнішніх відвідувачів. У цьому випадку на допомогу приходить nmap. ПОПЕРЕДЖЕННЯ: Використовуйте nmap лише в мережах, які перебувають під вашим контролем. Крім того, існують правила брандмауера, які можуть блокувати пінг-файли nmap, вам доведеться поспілкуватися з параметрами, щоб отримати правильні результати.


19
Зауважте, що netstatце застаріло у багатьох системах і його ssслід використовувати замість цього.
Джоху

1
але якщо ви перебуваєте на ss
зайнятій скриньці,

90

Оскільки net-toolsзастаріло , ви можете використовувати ssкоманду замість, netstatякщо 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більш детальні результати щодо портів.


2
Прапор -p вимагає кореневих привілеїв для деяких процесів, тому це було бsudo netstat -lnptu
klaus

5

Усі відкриті порти, включаючи трафік відповідей:

netstat -tuwanp 2>/dev/null | awk '{print $4}' | sort | uniq -c | wc -l

3
Список просто унікальних номерів портів та лише IPv4:netstat -tuwanp4 | awk '{print $4}' | grep ':' | cut -d ":" -f 2 | sort | uniq
Аарон К. де Брюйн

+1 - показувати, як фільтрувати та витягувати числа з результату. Відредаговано для видалення виводу більш жорсткого з netstat (що додає заголовок до результату в Ubuntu).
datashaman

Хм, на другі думки. -1 за те, що не відповів на запитання.
datashaman

1

Моє первинне запитання полягало в тому, що він запитував про невикористані порти, а не про порти, підключені до сервісів. У такому випадку немає іншого способу їх переліку, крім перелічених використаних портів та припущення, що інші не використовуються.

Ще один момент, який потрібно пам’ятати: як користувач, ви не зможете відкрити порт менше 1024 (для цього вам знадобляться кореневі дозволи).


0

Наступна команда буде працювати на будь-якому Unix, який виводить у тому ж форматі, що і Ubuntu / Debian - де локальна адреса знаходиться у стовпці 4, а висновок містить заголовку 2 рядка вгорі. Якщо будь-яке з цих чисел відрізняється, змініть команду 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

0

Спробуйте

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

і подивіться на це.

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