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

10

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

Строго говоря, 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) для эфемерного порта.

AB Carroll
источник
Я обновил свой ответ с дополнительной информацией. Не стесняйтесь отвечать на любые вопросы.
89c3b1b8-b1ae-11e6-b842-48d705

Ответы:

8

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

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 для веб-серверов.

89c3b1b8-b1ae-11e6-b842-48d705
источник
0

У меня могло быть 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-адресов?

О: Один IP-адрес не может открыть более 65 тыс. подключений к моему веб-серверу по адресу xxxx: 80, поскольку srcip, srcport, dstip, dstport уникальны. да, вы могли бы поддерживать гораздо больше, чем 65 КБ, если Soruce IP отличается

вау цин
источник