Как зарезервировать список портов для моих пользовательских приложений?
Точнее говоря, продукт, который я создаю, имеет много процессов и много взаимосвязей между ними.
У меня проблема в том, что время от времени ОС крадет мои порты. Это редко, но это случается.
Это может быть потому, что другое приложение использовало ":: bind" без указания порта.
Или иногда мои собственные приложения крадут порт, когда я вызываю «:: connect» с несвязанным сокетом. Как видно из справочной страницы:
Если сокет еще не был привязан к локальному адресу, connect () должен связать его с адресом, который, если семейство адресов сокета не AF_UNIX, является неиспользуемым локальным адресом.
Поэтому мой вопрос: могу ли я зарезервировать нужные мне порты, чтобы ОС их не использовала? Можно ли это сделать с помощью / etc / services? Или есть другой способ?
SELinux
в принудительном режиме может удовлетворить ваши требования, я все еще учусь на нем. Так только предположение, может быть , вы можете определить свою собственную политикуSELinux
в резервное Yours портов, такие какmy_server_port_t tcp 1111, 2222, 3333, 4444-4600
. Если ваше приложение будет работать везде (не серверное приложение), боюсь, вы не сможете контролировать,SELinux
включено или выключено.Ответы:
Технически, не существует такого понятия, как «зарезервированный порт».
В TCP / UDP единственный способ «зарезервировать» порт - это фактически
bind()
подключить к нему сокет. Связанный порт не будет использоваться другими приложениями; неиспользуемый порт, ну, в общем, не используется, поэтому другие приложения могут использовать его.Если вы пишете серверное программное обеспечение, вы можете привязать свои сокеты к определенным портам, как только захотите в коде приложения. Сделайте номера портов настраиваемыми или, по крайней мере, четко укажите их в документации, чтобы системный администратор мог быстро выявлять конфликты и перемещать конфликтующие приложения на отдельные серверы.
источник
Чтобы ядро не выдавало клиентам 49000 и 49001, так как вы хотите использовать их для своих серверов в Linux.
бросьте его
/etc/sysctl.conf
, а затем бегитеsysctl -p
.Обратите внимание, что это не проверено.
Ссылки
источник
/etc/services
?На самом деле, приведенный выше ответ не совсем точен. В sysctls net.inet.ip.portrange.first и net.inet.ip.portrange.last указывается диапазон портов, которые ОС может выделить для произвольных портов. Вы хотели бы убедиться, что диапазон зарезервированных портов для вашего приложения не попадает в эти переменные.
Взгляните на Руководство FreeBSD, раздел: 12.14. Настройка ядерных ограничений . Но та же самая базовая предпосылка должна относиться и к Linux.
источник
net.ipv4.ip_local_port_range