Я провел столько исследований, сколько смог, не копаясь в исходном коде ядра. Похоже, что существует много дезинформации / неверной информации по этому вопросу, поэтому я надеюсь, что это раз и навсегда ответит на этот вопрос для меня и других.
Строго говоря, IPv4, возможно ли исчерпание порта? Позволь мне объяснить:
- По-видимому, для использования доступно 65535 портов. 0 не доступно.
- Я прочитал, что исчерпание порта требует, чтобы кортеж (src ip, src port, dst ip, dst port) был уникальным.
- Для ясности и предположения, что я могу использовать 100% временных портов через настройку sysctl net.ipv4.ip_local_port_range
И это вопрос: так ли это работает?
- Я мог бы иметь 65 тыс. Соединений от 127.0.0.1:(x) до 127.0.0.1:80
- Я мог бы иметь 65 тыс. Соединений от 127.0.0.1:(x) до 127.0.0.1:555
- По сути, еще раз, вопрос (srcip, srcport, dstip, dstport) должен быть уникальным, правильно?
- Я не мог открыть больше чем 65k соединений от ip "A" к IP "B", порту "N"
- Аналогично, один IP-адрес не может открыть более 65 тыс. Подключений к моему веб-серверу в xxxx: 80, однако я мог бы поддерживать в целом гораздо более 65 тыс. Соединений, если они получены с разных исходных IP-адресов ?
Наконец, я немного озадачен (исходящими) эфемерными портами и входящими портами, которые прослушивают. Я понимаю, что как только соединение установлено, каждая сторона соединения является равноправной и равной, но до того, как это произойдет:
Например, если на самом деле кортеж (srcip, srcport, dstip, dstport) должен быть уникальным, почему, если я включу, например,
net.ipv4.ip_local_port_range = 1024 65535
Что позволяет использовать временные порты с 1024-65535, что если у меня есть службы, которые привязываются к порту 3306 (например, mySQL), они иногда не запускаются, потому что порт используется.
Связано ли это с тем, что: (И это утверждение, которое я прошу подтвердить):
- (srcip, srcport, dstip, dstport) должны быть уникальными для каждого соединения с диапазоном портов 1-65535 (не обращая внимания на использование в операционной системе эфемерных портов)
- Однако для связывания сокета это можно увидеть как (srcip, srcport, *, *). Или еще один способ выразить это: IP не должен использовать этот порт по какой-либо причине для привязки?
Я могу проверить вышеупомянутое поведение, то есть я использую точную строку sysctl выше, и из-за этого я переместил mySQL на порт ниже 1024, потому что он иногда и очень случайно перезагружался, потому что предполагал, что ОС использует этот порт (3306) для эфемерного порта.
источник
Ответы:
У вас есть два основных вопроса здесь:
1.
Да. Возьмем, к примеру, маршрутизатор с балансировкой нагрузки, отправляющий все соединения на IP-адрес NAT. Это может произойти, когда у вас есть много
SRC IP
подключений к узкому месту одногоDST IP
.Это означает, что ваш веб-сервер может иметь несколько соединений, таких как:
и это прекрасно. Однако, если все «внешние адреса» были одинаковыми, это может вызвать проблему (например, «большой маршрутизатор, который выполняет NAT <---> сервер с одним IP-адресом»).
Если бы мне пришлось постулировать, почему эфемерное исчерпание порта не является распространенной проблемой, я бы предложил, потому что каждый порт требует службы прослушивания и достаточного количества ресурсов для ответа - другой ресурс (память, процессор) обычно является узким местом в первую очередь.
Тем не менее, я лично сталкивался с некоторыми проблемами исчерпания портов при работе в компании по балансировке нагрузки.
2. Почему используемый порт может представлять проблему для службы прослушивания?
Сервер MySQL не может связываться с этим портом, если он используется - скажем, localhost: 3306 или на всех интерфейсах. Например, см. Строку 0.0.0.0:80 в следующем
netstat
выводе?Это означает, что порт 80 прослушивает все интерфейсы, локальные для сервера. Если другой процесс удерживает порт 80 до
nginx
запуска моего сервера,nginx
он не сможет получить контроль над этим портом и, скорее всего , не выполнит процедуру запуска.Обычно с портом 3306 все в порядке, потому что у прослушивающих сервисов есть предопределенные порты (или диапазоны), которые запрашиваются с хост-машины - например, порты 80 и 443 для веб-серверов.
источник
a: да, если у вас локальный порт 1-65535, количество подключений 65k-1 (один порт прослушивается)
О: Один IP-адрес не может открыть более 65 тыс. подключений к моему веб-серверу по адресу xxxx: 80, поскольку srcip, srcport, dstip, dstport уникальны. да, вы могли бы поддерживать гораздо больше, чем 65 КБ, если Soruce IP отличается
источник