Вопрос или проблема
В общем, эфемерные порты используются клиентами при установлении соединения с сервером.
Например:
- Сервер прослушивает порт 80
- Клиент (браузер, FTP-клиент, клиент bittorent) отправляет запрос на сервер, включая эфемерный порт, назначенный ОС
- Сервер отвечает, используя предоставленный эфемерный порт в качестве порта назначения
А теперь вопрос:
Я написал серверное приложение, которое я хотел бы запускать на случайном свободном порту каждый раз, когда оно запускается (чтобы сохранить вопрос кратким, я не буду объяснять, почему мне нужно такое поведение). Теперь мой вопрос: какие последствия это будет иметь, если я выберу один из эфемерных портов для прослушивания сервером. Есть ли какие-либо недостатки (в том числе с точки зрения безопасности) этого подхода?
Знаете ли вы примеры серверов, которые также на практике используют эфемерные порты?
Меня также беспокоит утверждение из The TCP/IP Guide: A Comprehensive, Illustrated Internet Protocols Reference (страница 705):
Так же, как общеизвестные и зарегистрированные номера портов используются для процессов серверов, эфемерные номера портов предназначены только для процессов клиентов.
Если вы прослушиваете эфемерный порт, вы можете столкнуться с самоподключением TCP.
Другой вопрос на SO о самоподключении: https://stackoverflow.com/questions/5139808/tcp-simultaneous-open-and-self-connect-prevention
В дополнение, на странице Википедии по Эфемерные порты представлена более подробная информация о номерах портов, реально используемых ОС.
Из этого сразу видно, что существует много портов, которые обычно не используются серверами (процессами) и не входят в диапазон эфемерных портов.
Таким образом, очевидное решение — случайным образом выбрать один из таких других портов. Это позволяет избежать необходимости делать предположения о том, как ОС выделяет из эфемерного диапазона: проверяет ли она фактическое использование или просто свои назначения, чтобы избежать коллизий для новых назначений?
Этот вопрос может показаться незначительным, но в случае клиентского порта процесс обычно не использует непосредственно номер порта (он назначается, когда процесс открывает соединение; только глядя на свойства сокета, процесс может найти номер: и, как правило, это совершенно излишне). Однако для приема входящих соединений сокет должен быть привязан к определенному порту, таким образом, серверный процесс несёт ответственность за получение номера порта.
Ответ или решение
Использование эфемерных портов для серверных приложений часто вызывает некоторое любопытство у разработчиков. Для начала разберем теоретическую часть вопроса. Эфемерные порты, как правило, используются клиентами для установления соединения с сервером. Они представляют собой временные порты, которые операционная система автоматически выделяет клиентскому приложению на время сессии. Это временное назначение освобождает порты после завершения использования, позволяя их повторное использование другими приложениями.
По стандарту, сервера используют так называемые “нормированные” порты с фиксированными номерами, чтобы клиенты могли установить соединение с сервером, зная его адрес и номер порта. Обычно такие номера портов находятся в диапазоне от 0 до 1023 и называются “известными портами”. Скачать страницы может быть FTP-сервер (порта 20, 21), HTTP-сервер (порт 80) и другие.
Теперь рассмотрим ситуацию, когда серверное приложение использует эфемерный порт для прослушивания входящих соединений. На первый взгляд, подобное решение способно привести к нестандартному поведению, вызванному несколькими аспектами.
Во-первых, безопасность. Использование эфемерных портов затрудняет внешним клиентам определение номера порта, необходимого для соединения с сервером. Такая “завуалированность” может в определенной мере повысить безопасность, предотвращая атаки на известные порты. Однако важно понимать, что такие средства безопасности невозможно считать надежными, и они не заменяют полноценные меры защиты, такие как использование SSL/TLS и надежная аутентификация.
Во-вторых, риск “самоподключения” TCP (TCP self-connect). При таком сценарии сервер может ошибочно установить соединение с самим собой, что может привести к нежелательному поведению, включая отказ в обслуживании. Проблема усугубляется тем, что система назначения эфемерных портов может не учитывать текущие соединения при попытке выделения нового порта, что делает конфликт с использованием эфемерных портов более вероятным.
Теоретически, существуют примеры серверов, которые могут использовать эфемерные порты, хотя они крайне редки ввиду вышеупомянутых проблем. Чаще всего такие случаи встречаются в специфических ситуациях, где серверная логика требует минимальной предсказуемости порта.
Следующий аспект связан с ограниченностью диапазона эфемерных портов. В различных операционных системах этот диапазон может варьироваться, например, в Linux он составляет от 32768 до 60999, тогда как в Windows – от 49152 до 65535. При интенсивном использовании системы может возникнуть нехватка свободных портов для новых подключений, что добавит дополнительную сложность в управлении сетевыми соединениями.
Возвращаясь к вашей ситуации, рекомендуется рассмотреть альтернативные подходы для реализации проекта. Один из таких подходов — использовать случайный выбор из незарезервированных портов, находящихся за пределами эфемерного диапазона, ограничиваясь диапазоном от 1024 до 49151. Это позволит избежать потенциальных конфликтов и связанных с ними проблем.
Другой подход состоит в использовании балансировщика нагрузки, который позволит распределять сетевые запросы на несколько серверов с различными фиксированными портами, обеспечивая динамическое перенаправление запроса на нужный сервер.
В заключение, рекомендуется крайне осторожно подходить к вопросу использования эфемерных портов для серверных приложений ввиду возможных ограничений и последствий. Тщательно анализируйте все аспекты, связанные с уровнем безопасности, сетевой архитектурой и урегулированием возможных конфликтов, прежде чем принимать такое решение. Использование случайного фиксированного порта или распределение нагрузки на несколько серверов могут стать более надежными альтернативами в вашей ситуации.