NefigTut ([info]nefigtut) wrote,

Диапазон временных портов

Иногда внезапно приходит время поговорить  о королях и о капусте  о временных (динамически назначаемых) портах.

  • Что вообще

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

Не совсем очевидно то, что, когда соединение установлено, оно использует порт и на стороне клиента. Если клиентская программа не запрашивает явно определенный номер порта, то используется временный (динамически назначаемый системой) номер порта. Временные порты выдаются IP-стеком машины, и назначаются из определенного диапазона портов, выделенного для этой цели. Когда соединение разрывается, временный порт становится доступен для повторного использования, хотя большинство реализаций IP-стека не будет повторно использовать этот номер порта, пока все доступные временные порты из диапазона не будут использованы. Так что, если клиентская программа переподключится, ей будет назначен другой номер порта для её стороны нового соединения. Аналогично, для UDP/IP, когда клиент посылает датаграмму с не заданного номер порта, номер порта назначается автоматически системой, так что сервер на другом конце соединения может ответить отправителю.

Некоторые программы (например, Oracle) могут требовать установить определённый диапазон временных портов. Здесь описано как сделать это на разных операционных системах и не потерять эти настройки при перезагрузке.

  • AIX

AIX использует команду no, чтобы установить параметры сети. AIX использует два разных диапазона временных портов, по одному для TCP и UDP, и оба имеют значения по-умолчанию от 32768 до 65535:

root@aix:/# uname -a
AIX aix 3 5 00CE49XXXXXX
root@aix:/# /usr/sbin/no -a | fgrep ephemeral
       tcp_ephemeral_high = 65535
        tcp_ephemeral_low = 32768
       udp_ephemeral_high = 65535
        udp_ephemeral_low = 32768

Изменить диапазоны по-умолчанию можно с помощью команды no. Вот так можно установить диапазоны временных портов для TCP и UDP c 49152 до 65535:

root@aix:/# /usr/sbin/no -o tcp_ephemeral_low=49152 -o tcp_ephemeral_high=65535
Setting tcp_ephemeral_low to 49152
Setting tcp_ephemeral_high to 65535
root@aix:/# /usr/sbin/no -o udp_ephemeral_low=49152 -o udp_ephemeral_high=65535
Setting udp_ephemeral_low to 49152
Setting udp_ephemeral_high to 65535

Установка этих параметров должна быть сделана каждый раз при запуске системы. Один из способов сделать это заключается в редактировании файла /etc/rc.tcpip и вставке команд no перед тем, как скрипт начинает запускать сетевые демоны.

  • BSD/OS

Диапазон временных портов по-умолчанию от 49152 до 65535, как определено в файле /usr/include/netinet/in.h:

    #define IPPORT_RESERVED 1024
    #define IPPORT_DYNAMIC 49152
    #define IPPORT_DYNAMIC_LAST 65535

Похоже, не существует run-time настройки ядра для этого (то есть не доступны соответствующие sysctl параметры), так что для изменения диапазона нужно будет перекомпилировать ядро после изменения этих определений.

  • FreeBSD

FreeBSD использует три диапазона: обычный диапазон временных портов, альтернативный «высокий» диапазон временных портов, альтернативный «низкий» зарезервированный диапазон портов для программ, использующих функцию rresvport(). Эти диапазоны кратко описаны в системном заголовочном файле /usr/include/netinet/in.h:

/*
 * Default local port range, used by both IP_PORTRANGE_DEFAULT
 * and IP_PORTRANGE_HIGH.
 */
#define IPPORT_HIFIRSTAUTO      49152
#define IPPORT_HILASTAUTO       65535

Запуск sysctl показывает значения по-умолчанию для этих диапазонов:

[root@cool ~]# uname -mnrs
FreeBSD cool.server.com 8.2-RELEASE-p4 amd64
[root@cool ~]# /sbin/sysctl -a | fgrep net.inet.ip.portrange
...skip...
net.inet.ip.portrange.reservedlow: 0
net.inet.ip.portrange.reservedhigh: 1023
net.inet.ip.portrange.hilast: 65535
net.inet.ip.portrange.hifirst: 49152
net.inet.ip.portrange.last: 65535
net.inet.ip.portrange.first: 10000
net.inet.ip.portrange.lowlast: 600
net.inet.ip.portrange.lowfirst: 1023

Чтобы изменить эти значения, отредактируйте файл /etc/sysctl.conf и добавьте (или измените существующие) строки, такие как:

net.inet.ip.portrange.first = 32768
net.inet.ip.portrange.last = 49151
net.inet.ip.portrange.hifirst = 49152
net.inet.ip.portrange.hilast = 65535

Это заставит обычный диапазон временных портов использовать порты от 32768 до 49151, альтернативный диапазон от 49152 до 65535, и оставит зарезервированный диапазон портов без изменений. Система должна быть перезагружена, чтобы изменения в /etc/sysctl.conf вступили в силу, хотя можно вызвать команду sysctl вручную, чтобы внести изменения сразу.

  • HP-UX

HP-UX использует команду ndd для изменения настраиваемых параметров IP-стека. Временные порты на HP-UX могут быть настроены индивидуально для TCP и UDP, поэтому на самом деле существует два отдельных диапазона временных портов. HP-UX также предоставляет средства для изменения привилегированного диапазона портов (эти порты могут использовать только процессы, запущенные с привилегиями суперпользователя).

Ниже показано, как запросить существующие значения для временных портов TCP, а также изменить их диапазон:

serv02# uname -a
HP-UX serv02 B.11.31 U ia64 4272XXXXXX unlimited-user license
serv02# /usr/bin/ndd /dev/tcp tcp_smallest_anon_port tcp_largest_anon_port
9000

65500
serv02# /usr/bin/ndd /dev/udp udp_smallest_anon_port udp_largest_anon_port
9000

65500
serv02# /usr/bin/ndd -set /dev/tcp tcp_smallest_anon_port 50000
serv02# /usr/bin/ndd -set /dev/tcp tcp_largest_anon_port 61000
serv02# /usr/bin/ndd -set /dev/udp udp_smallest_anon_port 50000
serv02# /usr/bin/ndd -set /dev/udp udp_largest_anon_port 61000

Заметьте, что если вы измените диапазон портов, вам придётся делать это каждый раз при загрузке системы. Предпочтительный способ сделать это для HP-UX заключается в редактировании файла /etc/rc.config.d/nddconf и добавлении записей. Например, вы можете добавить эти строки в ваш файл /etc/rc.config.d/nddconf:

TRANSPORT_NAME[0]=tcp
NDD_NAME[0]=tcp_largest_anon_port
NDD_VALUE[0]=65500

TRANSPORT_NAME[1]=tcp
NDD_NAME[1]=tcp_smallest_anon_port
NDD_VALUE[1]=9000

TRANSPORT_NAME[2]=udp
NDD_NAME[2]=udp_largest_anon_port
NDD_VALUE[2]=65500

TRANSPORT_NAME[3]=udp
NDD_NAME[3]=udp_smallest_anon_port
NDD_VALUE[3]=9000

Если вы сделаете это, убедитесь, что записи нумеруются соответственно. Например, если 4 записи уже присутствуют, то вы увидите их пронумерованными от 0 до 3. В этом случае записи которые вы добавляете должны быть пронумерованы после существующих записей.

  • IRIX

К сожалению, IRIX, кажется, не позволяет настроить диапазон временных портов и он статически установлен от 1024 до 65535. Вот выдержка из файла /usr/include/netinet/in.h:

    #define IPPORT_RESERVED         1024
    #define IPPORT_MAXPORT          65535

Также в команде systune не указаны соответствующие параметры, хотя другие параметры TCP и IP могут быть изменены.

  • Linux

Linux позволяет просмотреть и изменить диапазон временных портов просто используя файл /proc/sys/net/ipv4/ip_local_port_range или параметр ядра net.ipv4.ip_local_port_range:

[root@ololo ~]# uname -a
Linux ololo.server.com 2.6.18-128.2.1.4.37.el5xen #1 SMP Sat Apr 9 05:30:32 EDT 2011 i686 i686 i386 GNU/Linux
[root@ololo ~]# cat /proc/sys/net/ipv4/ip_local_port_range
32768   61000
[root@ololo ~]# sysctl net.ipv4.ip_local_port_range
net.ipv4.ip_local_port_range = 32768    61000

Чтобы поменять границы диапазона, выполните от root:

[root@ololo ~]# echo "49152 65535" > /proc/sys/net/ipv4/ip_local_port_range

или

[root@ololo ~]# sysctl -w net.ipv4.ip_local_port_range="49152 65535"
net.ipv4.ip_local_port_range = 49152 65535

Заметьте, что это нужно будет делать каждый раз при загрузке системы. Так что добавьте одну из команд выше в стартовый системный скрипт вроде /etc/rc.local или (более правильный способ) в файл /etc/sysctl.conf:

[root@ololo ~]# grep ip_local_port_range /etc/sysctl.conf
net.ipv4.ip_local_port_range = 49152 65535

  • OpenBSD

OpenBSD использует команду sysctl чтобы настраивать параметры ядра. У временных портов в OpenBSD на самом деле два отдельных диапазона, обычный диапазон и альтернативный «высокий» диапазон. Ниже приведен пример, показывающий, как использовать sysctl, чтобы просмотреть текущую конфигурацию этих двух диапазонов:

# /usr/sbin/sysctl net.inet.ip.portfirst net.inet.ip.portlast net.inet.ip.porthifirst net.inet.ip.porthilast
net.inet.ip.portfirst = 1024
net.inet.ip.portlast = 49151
net.inet.ip.porthifirst = 49152
net.inet.ip.porthilast = 65535

Чтобы изменить границы диапазонов, отредактируйте файл /etc/sysctl.conf и добавьте (или измените существующие) строки, такие как:

net.inet.ip.portfirst=32768
net.inet.ip.portlast=49151
net.inet.ip.porthifirst=49152
net.inet.ip.porthilast=65535

Эти настройки устанавливают границы обычного диапазона временных портов от 32768 до 49151, а альтернативного диапазона от 49152 до 65535. Система должна быть перезагружена чтобы изменения в /etc/sysctl.conf вступили в силу, хотя вы можете использовать команду sysctl , чтобы применить изменения сразу.

  • Solaris

Solaris использует команду ndd для изменения настраиваемых параметров IP-стека. Временные порты в Solaris могут быть настроены отдельно для TCP и UDP, поэтому на самом деле существует два отдельных диапазона временных портов. Solaris также предоставляет средства для изменения привилегированного диапазона портов (эти порты могут использовать только процессы, запущенные с привилегиями суперпользователя).

Ниже показано, как запросить существующие значения для временных портов TCP, а также изменить их диапазон от 49152 до 61000:

[root@pysh /]# uname -a
SunOS pysh 5.10 Generic_118833-17 sun4v sparc SUNW,Sun-Fire-T200
[root@pysh /]# /usr/sbin/ndd /dev/tcp tcp_smallest_anon_port tcp_largest_anon_port
32768

65535
[root@pysh /]# /usr/sbin/ndd /dev/udp udp_smallest_anon_port udp_largest_anon_port
32768

65535
[root@pysh /]# /usr/sbin/ndd -set /dev/tcp tcp_smallest_anon_port 49152
[root@pysh /]# /usr/sbin/ndd -set /dev/tcp tcp_largest_anon_port 61000
[root@pysh /]# /usr/sbin/ndd -set /dev/udp udp_smallest_anon_port 49152
[root@pysh /]# /usr/sbin/ndd -set /dev/udp udp_largest_anon_port 61000

Заметьте, что если вы хотите изменить диапазон значений, вы должны делать это каждый раз при загрузке системы. Вы можете добавить эти команды в какой-нибудь системный стартовый скрипт типа /etc/rc3.d/S99local.

  • Tru64

Tru64 Unix от Compaq (бывший Digital Unix и Digital OSF/1) использует традиционный для BSD-систем диапазон от 1024 до 4999 как диапазон временных портов. Следующий пример иллюстрирует использование команды sysconfig для запроса текущего диапазона:

# /sbin/sysconfig -q inet | fgrep ipport_userreserved
ipport_userreserved = 5000
ipport_userreserved_min = 1024

Следующий пример показывает как с помощью sysconfig установить предпочтительный диапазон временных портов:

# /sbin/sysconfig -r inet ipport_userreserved=65535 ipport_userreserved_min=49152
ipport_userreserved: reconfigured
ipport_userreserved_min: reconfigured
# /sbin/sysconfig -q inet | fgrep ipport_userreserved
ipport_userreserved = 65535
ipport_userreserved_min = 49152

Команда sysconfig применяет изменения только для текущего цикла загрузки. Для того, чтобы изменения автоматически применялись каждый раз при загрузке системы, вы можете либо создать системный стартовый скрипт для запуска команды sysconfig, либо используйте команду sysconfigdb для настройки файла /etc/sysconfigtab. Вот пример:

/sbin/sysconfigdb -a -f /tmp/inet.stanza inet

Файл /tmp/inet.stanza который мы используем должен выглядеть следующим образом. Убедитесь, что этом файле на первой строке стоит только слово inet: а перед следующими двумя строками стоит один символ табуляции (не используйте пробелы).

inet:
        ipport_userreserved = 65535
        ipport_userreserved_min = 49152

  • Microsoft Windows

Всё, что касается Windows — это сами. Для установки диапазона временных портов почитайте следующие статьи из базы знаний Microsoft (на английском):

  • Заключение

Вообще говоря, всё что выше — это вольный перевод вот этой статьи (локальная копия вот) от аффтараф сервера NcFTPd. За что им ссылка, всяческий респект и большая уважуха.

Пыщь! Оригинал поста размещен в блоге Ад, ненависть и локалхост. Комментить? Набигай. Подкат? ОИНЧ.


Create an Account
Forgot your login or password?
Facebook Twitter More login options
English • Español • Deutsch • Русский…