Назад | Перейти на главную страницу

Исчерпание сетевого порта Linux

Я провел как можно больше исследований по этому поводу, не копаясь сразу в исходниках ядра. Похоже, что по этому вопросу имеется большое количество дезинформации / неверной информации, поэтому я надеюсь, что это ответит на вопрос для меня и других раз и навсегда.

Строго говоря, говоря о IPv4, действительно ли возможно исчерпание портов? Позволь мне объяснить:

И вот вопрос: так ли это работает?

Наконец, меня немного смущают (исходящие) эфемерные порты и входящие порты, которые прослушивают. Я понимаю, что после установления соединения каждая сторона соединения является равноправной и равноправной, но до того, как это произойдет:

Например, если действительно кортеж (srcip, srcport, dstip, dstport) должен быть уникальным, почему, если я включаю, например

net.ipv4.ip_local_port_range = 1024 65535

Это позволяет использовать эфемерные порты от 1024-65535, так что если у меня есть службы, которые привязываются к порту 3306 (например, mySQL), они иногда не запускаются, потому что порт используется.

Относится ли это к тому факту, что: (И это утверждение, которое я прошу подтвердить):

Я могу проверить приведенное выше поведение, т.е. я использую точную строку sysctl, указанную выше, и из-за этого я переместил mySQL на порт ниже 1024, потому что он иногда и очень случайным образом не мог перезапуститься, поскольку предполагал, что ОС использовала этот порт (3306) для эфемерного порта.

У вас есть два основных вопроса:

1.

Строго говоря, говоря о IPv4, действительно ли возможно исчерпание портов?

Да. Возьмем, к примеру, маршрутизатор с балансировкой нагрузки, отправляющий все подключения на IP-адрес NAT. Это может произойти, когда у вас много SRC IPсоединяется с узким местом единственного DST IP.

Это означает, что ваш веб-сервер может иметь несколько подключений, например:

root@buglab:~# netstat -pnt
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 173.200.1.18:80      10.100.1.100:49923        ESTABLISHED 13939/nginx: worker
tcp        0      0 173.200.1.18:80      10.200.1.200:10155        ESTABLISHED 13939/nginx: worker
tcp        0      0 173.200.1.18:80      10.10.1.10:14400        ESTABLISHED 13939/nginx: worker
tcp        0      0 173.200.1.18:80      10.10.1.10:50652        ESTABLISHED 13939/nginx: worker
tcp        0      0 173.200.1.18:80      10.20.1.20:57554        ESTABLISHED 13939/nginx: worker 

и это прекрасно. Однако, если все «внешние адреса» были одинаковыми, это может вызвать проблему (например, «большой маршрутизатор, который выполняет NAT <---> сервер с одним IP-адресом»).

Если бы мне пришлось постулировать, почему временное исчерпание порта не является распространенной проблемой, я бы предложил это потому, что каждый порт требует службы прослушивания и достаточного количества ресурсов для ответа - другой ресурс (память, процессор) обычно сначала является узким местом.

Однако я лично сталкивался с несколькими проблемами нехватки портов, когда работал в компании, занимающейся балансировкой нагрузки.

2. Почему используемый порт может представлять проблему для службы прослушивания?

«Это позволяет использовать эфемерные порты от 1024-65535, и если у меня есть службы, которые привязываются к порту 3306 (например, mySQL), они иногда не запускаются, потому что порт уже используется».

Сервер mySQL не может подключиться к этому порту, если он используется - скажем, localhost: 3306 или на всех интерфейсах. Например, см. Строку 0.0.0.0:80 в следующем netstat вывод?

root@buglab:~# netstat -lnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      PID/Program name
tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN      964/php-fpm.conf)
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      1660/mysqld     
tcp        0      0 0.0.0.0:842             0.0.0.0:*               LISTEN      1317/inetd      
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      13938/nginx     

Это означает, что порт 80 прослушивает все локальные интерфейсы для сервера. Если другой процесс удерживает порт 80 перед моим nginx сервер запускается, nginx не сможет получить контроль над этим портом и, скорее всего, не сможет выполнить процедуру запуска.

Обычно порт 3306 подходит, потому что службы прослушивания имеют предварительно определенные порты (или диапазоны), которые запрашиваются с хост-машины - например, порт 80 и 443 для веб-серверов.

У меня могло быть 65k соединений от 127.0.0.1:(x) до 127.0.0.1:80, у меня могло быть 65k соединений от 127.0.0.1:(x) до 127.0.0.1:555

a: да, если ваш локальный порт - 1-65535, количество подключений - 65k-1 (один порт прослушивает)

По сути, еще раз вопрос в том, что (srcip, srcport, dstip, dstport) должны быть уникальными, правильно? а: да

Мне не удалось открыть более 65 тыс. Подключений с ip «A» на IP «B», порт «N». Аналогично, один IP-адрес не мог открыть более 65 тыс. Подключений к моему веб-серверу на xxxx: 80, однако я мог поддерживать гораздо больше чем 65k в целом, если они с разных исходных IP-адресов?

a: Один IP-адрес не может открыть более 65 тысяч подключений к моему веб-серверу на x.x.x.x: 80, потому что srcip, srcport, dstip, dstport уникальны. да, вы могли бы поддерживать намного больше, чем 65k, если soruce ip отличается