Порт TCP Debian Stretch с исходным кодом * всегда * четен

9

Во время отладки некоторого странного поведения с помощью балансировщика нагрузки Azure я заметил, что мой локальный TCP-стек Debian Stretch устанавливал только TCP-соединения с четным портом. Я не запускаю ни одного TCP-рукопожатия с нечетным портом источника. Это предназначено?

Оливье Доуби
источник

Ответы:

12

Это должно уменьшить конфликт между connect()и bind()(появился в Linux 4.2; у Jessie 3.16, а у Stretch 4.9):

commit 07f4c90062f8fc7c8c26f8f95324cbe8fa3145a5
Автор: Эрик Думазет 
Дата: вс 24 мая 14:49:35 2015 -0700

    tcp / dccp: попытаться не исчерпать ip_local_port_range в connect ()

    Давняя проблема на занятых серверах - крошечный доступный порт TCP
    диапазон (/ proc / sys / net / ipv4 / ip_local_port_range) и значение по умолчанию
    последовательное распределение исходных портов в системном вызове connect ().

    Если на хосте много активных сеансов TCP, скорее всего,
    очень высокий, что все порты используются хотя бы одним потоком,
    и последующие попытки bind (0) завершаются неудачно, или приходится сканировать большую часть
    пространство, чтобы найти слот.

    В этом патче я изменил начальную точку в __inet_hash_connect ()
    так что мы стараемся отдавать предпочтение четным [1] портам, оставляя нечетные порты для bind ()
    пользователи.

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

    Эта стратегия работает хорошо только если / proc / sys / net / ipv4 / ip_local_port_range
    является четным, т.е. если начальное / конечное значения имеют разную четность.

    Поэтому по умолчанию / proc / sys / net / ipv4 / ip_local_port_range был изменен на
    32768 - 60999 (вместо 32768 - 61000)

    Здесь нет никаких изменений в аспектах безопасности, только плохое хеширование
    это изменение может повлиять на схемы.

    [1]: нечетное / четное свойство зависит от четности значений ip_local_port_range

Вы также можете увидеть последующий коммит 1580ab63fc9a03593072cc5656167a75c4f1d173 .

Ференц Вагнер
источник