TGViewer
BashTex | Linux BashTex | Linux @bash_tex · 2.52K subscribers
Post #663 101
Ephemeral ports - почему заканчиваются исходящие TCP-порты

Когда приложение устанавливает исходящее TCP-соединение, порт выбирается автоматически. Это ephemeral port, временный исходный порт клиента.

Например:

10.0.0.10:49152 → 142.250.74.14:443


Если приложение создаёт тысячи соединений, диапазон таких портов может стать узким местом.

▪️Посмотреть доступный диапазон

В Linux его задаёт:

cat /proc/sys/net/ipv4/ip_local_port_range


Например:

32768 60999


Это около 28 тысяч портов для исходящих соединений с одного локального IP.

▪️Но количество соединений не всегда ограничено этим числом

TCP-соединение определяется не одним портом, а набором:

source IP
source port
destination IP
destination port
protocol


То есть:

10.0.0.10:50000 → 1.1.1.1:443
10.0.0.10:50001 → 1.1.1.1:443


это разные соединения.

Но тот же локальный порт теоретически может использоваться снова, если меняется destination tuple.

Поэтому несколько destination IP/портов значительно расширяют пространство комбинаций.

▪️Как увидеть исходящие соединения

ss -tan state established


А чтобы посмотреть локальные порты:

ss -tan | awk 'NR>1 {print $4}' | sort | uniq -c | sort -nr | head


Если приложение создаёт огромное количество короткоживущих TCP-соединений, дополнительно стоит посмотреть TIME-WAIT:

ss -tan state time-wait | wc -l


▪️Почему TIME_WAIT особенно неприятен

После закрытия TCP-соединения локальный порт не всегда сразу можно использовать для нового соединения.
Это нужно для защиты TCP от старых сегментов предыдущего соединения.
При большом количестве коротких запросов можно получить ситуацию:

requests
↓
тысячи TCP connections
↓
close()
↓
TIME_WAIT
↓
исчерпание доступных комбинаций


В итоге новое connect() начинает получать ошибки вроде:

Cannot assign requested address


▪️Практический сценарий

Проблема часто появляется у прокси, API-клиентов, NAT-шлюзов и сервисов, которые вместо переиспользования соединений постоянно создают новые.

Поэтому сначала стоит проверить:

ss -s
cat /proc/sys/net/ipv4/ip_local_port_range
ss -tan state time-wait | wc -l


А уже потом решать проблему: расширять диапазон, использовать connection pooling или уменьшать количество коротких TCP-соединений.

Важно: увеличение ip_local_port_range не создаёт новые IP-адреса и не отменяет остальные ограничения TCP.

BashTex 📱 #bash #utils
  • 👍 5
More from @bash_tex
  1. Oct 5, 2026name_to_handle_at() - как получить файловый объект без обычного пути В Linux обычно обраща…
  2. Oct 2, 2026madvise() - как процесс подсказывает ядру, как он собирается использовать память Когда про…
  3. Oct 1, 2026flock vs fcntl - почему две блокировки одного файла могут вести себя совершенно по-разному…
  4. Sep 30, 2026DEBUG trap - как Bash выполняет код перед каждой командой В Bash есть специальный DEBUG tr…
  5. Sep 29, 2026tee + process substitution: один поток и несколько получателей Иногда нужно одновременно:…
  6. Sep 28, 2026Архитектура большого bash-скрипта Пока скрипт на 30 строк - все терпимо. На 300 строк начи…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →