24

Когда я подключаюсь к https://www.google.co.uk, это меняется на 216.58.198.228:443. Затем соединение со мной открывается на [Мой IP-адрес]:63998.

Мой вопрос: как выбрать порт 63998 и есть ли способ заставить его быть 63999.

3 ответа3

33

Как определяются локальные порты

Номер порта выбирается программным обеспечением реализации TCP из диапазона номеров портов, называемых эфемерными портами.

Точный механизм выбора номера порта и используемого диапазона зависит от операционной системы.


Есть ли способ заставить его быть 63999.

Это можно сделать, изменив конфигурацию программного обеспечения реализации TCP.

Инструкции по настройке диапазона эфемерных портов для различных операционных систем можно найти в разделе Изменение диапазона эфемерных портов.

  • Инструкции для Linux и Windows включены в этот ответ ниже для справки.

Однако не стоит ограничивать диапазон одним портом, например 63999 .

  • На самом деле в Windows это невозможно, так как:

    Минимальный диапазон портов, который можно установить, составляет 255.


Эфемерный Порт Порт

Соединение TCP/IPv4 состоит из двух конечных точек, и каждая конечная точка состоит из IP-адреса и номера порта. Поэтому, когда пользователь клиента подключается к компьютеру-серверу, установленное соединение может рассматриваться как набор из четырех (IP-адрес сервера, порт сервера, IP-адрес клиента, клиентский порт).

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

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

Эфемерные порты - это временные порты, назначаемые IP-стеком машины, и назначаются для этого назначенным диапазоном портов. Когда соединение завершается, эфемерный порт доступен для повторного использования, хотя большинство IP-стеков не будет повторно использовать этот номер порта, пока не будет использован весь пул эфемерных портов.

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

Источник Эфемерный Порт Порт


Изменение диапазона эфемерного порта

Linux:

Linux позволяет вам просматривать и изменять диапазон временных портов, просто используя файл /proc/sys/net/ipv4/ip_local_port_range . Например, здесь показана конфигурация по умолчанию в системе с ядром 2.2:

$ cat /proc/sys/net/ipv4/ip_local_port_range 
1024 4999

Чтобы изменить это на предпочтительный диапазон, вы можете сделать (как суперпользователь):

# echo "49152 65535" > /proc/sys/net/ipv4/ip_local_port_range 

Обратите внимание, что вам придется делать это каждый раз при загрузке системы, поэтому обязательно добавьте строку в скрипт запуска системы, такой как /etc/rc.local чтобы ваш диапазон всегда использовался.

Также обратите внимание, что ядро Linux 2.4 по умолчанию будет иметь диапазон от 32768 до 61000, если доступно достаточное количество памяти ядра, поэтому изменение диапазона может не потребоваться в более новых системах Linux.

Наконец, также обратите внимание, что вы можете использовать интерфейс sysctl для изменения настроек вместо использования файловой системы /proc . Имя параметра sysctl - «net.ipv4.ip_local_port_range». Отредактируйте /etc/sysctl.conf если он у вас есть, или запустите сценарий запуска, запустите команду sysctl вручную, если вы хотите изменить этот параметр с помощью sysctl .

Windows Vista/Windows Server 2008 и новее:

Начиная с Windows Vista и Windows Server 2008, Windows теперь использует большой диапазон (49152-65535) по умолчанию, согласно статье 929851 базы знаний Майкрософт. В той же статье также показано, как вы можете изменить диапазон при желании, но диапазон по умолчанию теперь достаточен для большинства серверов.

Источник Изменение диапазона эфемерных портов

Вы можете просмотреть динамический диапазон портов на компьютере под управлением Windows Vista или Windows Server 2008, используя следующие команды netsh :

netsh int ipv4 show dynamicport tcp
netsh int ipv4 show dynamicport udp
netsh int ipv6 show dynamicport tcp
netsh int ipv6 show dynamicport udp 

Заметки:

  • Диапазон устанавливается отдельно для каждого транспорта и для каждой версии IP.
  • Диапазон портов теперь действительно является диапазоном с начальной точкой и конечной точкой.
  • У клиентов Microsoft, которые развертывают серверы под управлением Windows Server 2008, могут возникнуть проблемы с RPC-связью между серверами, если во внутренней сети используются брандмауэры.
  • В этих случаях рекомендуется переконфигурировать брандмауэры, чтобы обеспечить трафик между серверами в диапазоне динамических портов от 49152 до 65535 .
  • Этот диапазон дополняет известные порты, которые используются сервисами и приложениями.
  • Или диапазон портов, используемый серверами, можно изменить на каждом сервере.

Вы можете настроить этот диапазон с помощью команды netsh следующим образом:

netsh int <ipv4|ipv6> set dynamic <tcp|udp> start=number num=range

Эта команда устанавливает динамический диапазон портов для TCP. Начальный порт - это номер, а общее количество портов - это диапазон. Ниже приведены примеры команд:

netsh int ipv4 set dynamicport tcp start=10000 num=1000
netsh int ipv4 set dynamicport udp start=10000 num=1000
netsh int ipv6 set dynamicport tcp start=10000 num=1000
netsh int ipv6 set dynamicport udp start=10000 num=1000

Эти примеры команд устанавливают динамический диапазон портов, начиная с порта 10000 и заканчивая портом 10999 (1000 портов).

Заметки:

  • Минимальный диапазон портов, который можно установить, составляет 255 .
  • Минимальный начальный порт, который можно установить, составляет 1025 .
  • Максимальный конечный порт (в зависимости от настраиваемого диапазона) не может превышать 65535 .
  • Чтобы продублировать поведение по умолчанию в Windows Server 2003, используйте 1025 в качестве начального порта, а затем используйте 3976 в качестве диапазона для TCP и UDP. Это приводит к начальному порту 1025 и конечному порту 5000 .

Источник Статья базы знаний Microsoft 929851:

Windows XP и старше:

В старых операционных системах Windows (Windows XP и более ранних) Windows использует традиционный диапазон BSD от 1024 до 4999 для своего эфемерного диапазона портов. К сожалению, похоже, что вы можете установить только верхнюю границу диапазона эфемерного порта. Вот информация, взятая из статьи базы знаний Microsoft 196271:

  • Запустите редактор реестра (Regedt32.exe).
  • Найдите следующий ключ в реестре:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

  • В меню "Редактировать" нажмите "Добавить значение", а затем добавьте следующее значение реестра:

    Имя значения: MaxUserPort Тип данных: REG_DWORD Значение: 65534 (например)

    Допустимый диапазон: 5000-65534 (десятичное число) По умолчанию: 0x1388 (5000 десятичное число)

    Описание: Этот параметр контролирует максимальный номер порта, используемый, когда приложение запрашивает любой доступный пользовательский порт из системы. Обычно эфемерные (то есть недолговечные) порты распределяются между значениями от 1024 до 5000 включительно.

  • Закройте редактор реестра.

Примечание. Существует другая соответствующая статья базы знаний (812873), в которой утверждается, что вы можете установить диапазон исключения, что может означать, что вы можете исключить порты 1024-9999 (например), чтобы иметь диапазон эфемерных портов 10000-65534 . Однако мы не смогли заставить его работать (по состоянию на октябрь 2004 года).

Источник Изменение диапазона эфемерных портов

8

Ответ Дэвида Постила совершенно верный. Я хотел бы просто добавить к этому, подчеркивая, что изменение диапазона временных портов в Linux настолько просто, что у ОП есть утвердительный ответ.

Вы меняете EPR следующим образом:

echo "40000 60000" > /proc/sys/net/ipv4/ip_local_port_range 

и вы можете выбрать порт 50000 (в качестве примера) с помощью следующего скрипта:

OLD_RANGE=$(cat /proc/sys/net/ipv4/ip_local_port_range)
MY_PORT=50000
echo "$MY_PORT $MY_PORT" > /proc/sys/net/ipv4/ip_local_port_range
sudo -u SomeUser SomeApplication  & 
echo $OLD_RANGE" > /proc/sys/net/ipv4/ip_local_port_range 

Одно предостережение: поскольку в диапазоне есть один порт, другое приложение может вырвать его у вас между выполнением третьей и четвертой строк выше; Кроме того, даже если нет условий гонки, вы будете парализовать все другие приложения, пока не восстановите большой EPR, поэтому я восстановил исходный диапазон как можно скорее.

Таким образом, если бы операционная система OP была Linux, ответ был бы таков: это легко сделать.

Удивительно, но это не так просто на BSD, некоторые из которых даже не имеют настройки ядра времени выполнения для EPR. MacOS X, FreeBSD и OpenBSD требуют изменения файла /etc/sysctl.conf, но у них есть разные варианты для EPR.

Независимо от вышесказанного и от ОС, тот факт, что что-то можно сделать, не означает, что это должно быть сделано: зачем вам это нужно на Земле? Я не могу придумать ни одного варианта использования.

0

Стоит добавить, что ядро Linux также имеет

net.ipv4.ip_local_reserved_ports

ручка, которая работает несколько наоборот, но, тем не менее, она может быть очень полезна, потому что таким образом вы можете "пробить дыру" для сервисов, которые открывают определенные порты в других эфемерных диапазонах портов.

Краткая выдержка из документов:

Укажите порты, которые зарезервированы для известных сторонних приложений. Эти порты не будут использоваться для автоматического назначения портов (например, при вызове connect () или bind () с номером порта 0). Явное распределение портов не изменяется.

Формат, используемый для ввода и вывода, представляет собой список диапазонов, разделенных запятыми (например, «1,2-4,10-10» для портов 1, 2, 3, 4 и 10). Запись в файл очистит все ранее зарезервированные порты и обновит текущий список тем, который указан во входных данных.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .