Устранение неполадок с нехваткой портов

Применимо к: Windows 10

Протоколы TCP и UDP работают на основе номеров портов, используемых для установления подключения. Для любого приложения или службы, которым требуется установить TCP/UDP-подключение, потребуется порт на его стороне.

Существует два типа портов:

  • Временные порты( динамические порты) — это набор портов, которые каждый компьютер по умолчанию должен установить исходящее подключение.
  • Хорошо известные порты — это определенные порты для конкретного приложения или службы. Например, служба файлового сервера находится на порту 445, HTTPS — 443, HTTP — 80, А RPC — 135. Пользовательские приложения также будут иметь собственные номера портов.

При установке соединения с приложением или службой клиентские устройства используют временный порт с устройства для подключения к известному порту, определенному для этого приложения или службы. Браузер на клиентском компьютере будет использовать временный порт для подключения к https://www.microsoft.com порту 443.

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

Диапазон динамических портов по умолчанию для TCP/IP

В соответствии с рекомендациями центра IANA корпорация Майкрософт увеличила динамический диапазон клиентских портов для исходящих подключений. Новый начальный порт по умолчанию — 49152, а новый конечный порт по умолчанию — 65535. Это увеличение является изменением конфигурации более ранних версий Windows, которые использовали диапазон портов по умолчанию от 1025 до 5000.

Динамический диапазон портов на компьютере можно просмотреть с помощью следующих 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
    

Диапазон задается отдельно для каждого транспорта (TCP или UDP). Диапазон портов теперь является диапазоном, который имеет начальную и конечную точки. У клиентов Майкрософт, которые развертывают серверы под управлением Windows Server, могут возникнуть проблемы, влияющие на связь RPC между серверами, если брандмауэры используются во внутренней сети. В таких ситуациях рекомендуется перенастроить брандмауэры, чтобы разрешить трафик между серверами в динамическом диапазоне портов от 49152 до 65535. Этот диапазон является дополнением к хорошо известным портам, которые используются службами и приложениями. Кроме того, диапазон портов, используемый серверами, можно изменить на каждом сервере. Этот диапазон можно настроить с помощью команды netsh, как показано ниже. Приведенная выше команда задает динамический диапазон портов для TCP.

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

Начальный порт — число, а общее число портов — диапазон. Ниже приведены примеры команд.

  • 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.

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

Так как исходящие подключения начинают завершать сбой, вы увидите множество экземпляров следующих вариантов поведения:

  • Не удается войти на компьютер с учетными данными домена, однако вход с локальной учетной записью работает. Для входа в домен вам потребуется связаться с контроллером домена для проверки подлинности, которая снова является исходящим подключением. Если учетные данные кэша заданы, вход в домен может по-прежнему работать.

    Снимок экрана: ошибка для NETLOGON в Просмотр событий.

  • групповая политика сбои при обновлении:

    Снимок экрана: свойства события для сбоя групповая политика.

  • Общие папки недоступны:

    Снимок экрана: сообщение об ошибке Windows не может получить доступ.

  • Сбой RDP с затронутого сервера:

    Снимок экрана: ошибка при невозможности подключения к удаленному рабочему столу.

  • Любое другое приложение, работающее на компьютере, начнет выдавать ошибки

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

Если вы подозреваете, что компьютер находится в состоянии нехватки портов:

  1. Попробуйте установить исходящее подключение. С сервера или компьютера получите доступ к удаленной общей папке или попробуйте RDP на другой сервер или telnet на сервер через порт. Если для всех этих параметров происходит сбой исходящего подключения, перейдите к следующему шагу.

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

    1. Идентификатор события 4227

      Снимок экрана: событие с идентификатором 4227 в Просмотр событий.

    2. Идентификатор события 4231

      Снимок экрана: событие с идентификатором 4231 в Просмотр событий.

  3. Сбор выходных netstat -anob данных с сервера. В выходных данных netstat будет отображаться огромное количество записей для TIME_WAIT состояния для одного PID.

    Снимок экрана: выходные данные команды netstate.

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

    Кроме того, в том же выходных данных могут отображаться подключения CLOSE_WAIT состояния; однако CLOSE_WAIT состояние — это состояние, когда одна сторона однорангового узла TCP больше не имеет данных для отправки (FIN отправлено), но может получать данные с другого конца. Это состояние не обязательно указывает на нехватку портов.

    Примечание.

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

    Netstat был обновлен в Windows 10 с добавлением -Q переключателя, чтобы отобразить порты, которые перевели время ожидания, как в состоянии BOUND. Выпущено обновление для Windows 8.1 и Windows Server 2012 R2, содержащее эту функцию. Командлет Get-NetTCPConnection PowerShell в Windows 10 также отображает эти порты BOUND.

    До 10/2016 netstat был неточным. Исправления для netstat, обратно перенесенного в 2012 R2, позволили Netstat.exe и Get-NetTcpConnection правильно сообщать об использовании портов TCP или UDP в Windows Server 2012 R2. Дополнительные сведения см. в статье Windows Server 2012 R2: исправления временных портов.

  4. Откройте командную строку в режиме администрирования и выполните приведенную ниже команду.

    Netsh trace start scenario=netconnection capture=yes tracefile=c:\Server.etl
    
  5. Откройте файл server.etl с помощью сетевого монитора и в разделе фильтра примените фильтр Wscore_MicrosoftWindowsWinsockAFD.AFD_EVENT_BIND.Status.LENTStatus.Code == 0x209. Вы должны увидеть записи с STATUS_TOO_MANY_ADDRESSES. Если вы не нашли никаких записей, сервер по-прежнему не выходит из портов. Если вы найдете их, вы можете убедиться, что сервер находится в нехватке портов.

Устранение неполадок с нехваткой портов

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

Способ 1

Начните с просмотра выходных данных netstat. Если вы используете Windows 10 или Windows Server 2016, вы можете выполнить команду netstat -anobq и проверка для идентификатора процесса, который содержит максимальное количество записей в качестве BOUND. Кроме того, можно также выполнить следующую команду PowerShell, чтобы определить процесс:

Get-NetTCPConnection | Group-Object -Property State, OwningProcess | Select -Property Count, Name, @{Name="ProcessName";Expression={(Get-Process -PID ($_.Name.Split(',')[-1].Trim(' '))).Name}}, Group | Sort Count -Descending 

Большая часть утечек портов вызвана тем, что процессы пользовательского режима неправильно закрывают порты при обнаружении ошибки. На уровне пользовательского режима порты (фактически сокеты) являются дескрипторами. TaskManager и ProcessExplorer могут отображать количество дескрипторов, что позволяет определить, какой процесс потребляет все порты.

Для Windows 7 и Windows Server 2008 R2 можно обновить версию PowerShell, включив приведенный выше командлет.

Способ 2

Если метод 1 не помогает определить процесс (до Windows 10 и Windows Server 2012 R2), ознакомьтесь с диспетчером задач:

  1. Добавьте столбец с именем handles в раздел details/processes.

  2. Отсортируйте дескриптор столбца, чтобы определить процесс с наибольшим количеством дескрипторов. Обычно виновником может быть процесс с дескриптором более 3000, за исключением таких процессов, как System, lsass.exe, store.exe ,sqlsvr.exe.

    Снимок экрана: столбец дескрипторов в диспетчере задач Windows.

  3. Если какой-либо другой процесс, отличный от этих процессов, имеет большее число, остановите этот процесс, а затем попытайтесь войти с помощью учетных данных домена и проверить, успешно ли он будет выполнен.

Способ 3

Если диспетчер задач не помог определить процесс, используйте Обозреватель process для изучения проблемы.

Действия по использованию обозревателя процессов:

  1. Скачайте Обозреватель process и запустите его с повышенными привилегиями.

  2. Alt + выберите заголовок столбца, выберите Выбрать столбцы и на вкладке Производительность процесса добавьте число дескрипторов.

  3. Выберите Вид Показать>нижнюю область.

  4. Выберите Представление>дескрипторов представления >нижней области.

  5. Выберите столбец Дескрипторы , чтобы отсортировать его по значению.

  6. Изучите процессы с более высоким количеством дескрипторов, чем остальные (скорее всего, будет больше 10 000, если вы не можете установить исходящие подключения).

  7. Щелкните, чтобы выделить один из процессов с высоким количеством дескрипторов.

  8. В нижней области дескрипторами, перечисленными ниже, являются сокеты. (Сокеты технически являются дескрипторами файлов).

    Файл \Device\AFD

    Снимок экрана: Обозреватель процесса с процессами, отсортированных по дескрипторам.

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

Наконец, если приведенные выше методы не помогли изолировать процесс, мы рекомендуем собрать полный дамп памяти компьютера в состоянии проблемы. Дамп сообщит, какой процесс имеет максимальное количество дескрипторов.

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

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

Эта команда задает динамический диапазон портов, который будет начинаться с порта 10000 и заканчиваться портом 10999 (1000 портов). Минимальный диапазон портов, который можно задать, — 255. Минимальный порт запуска, который можно задать, — 1025. Максимальный конечный порт (на основе настраиваемого диапазона) не может превышать 65535.

Примечание.

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

Для Windows 7 и Windows Server 2008 R2 можно использовать приведенный ниже сценарий для сбора выходных данных netstat с определенной частотой. В выходных данных можно увидеть тенденцию использования портов.

@ECHO ON
set v=%1
:loop
set /a v+=1
ECHO %date% %time% >> netstat.txt
netstat -ano >> netstat.txt
 
PING 1.1.1.1 -n 1 -w 60000 >NUL
 
goto loop

Дополнительная информация

  • Исчерпание портов и вы! — в этой статье приводятся подробные сведения о состояниях netstat и о том, как использовать выходные данные netstat для определения состояния порта.
  • Обнаружение временного исчерпания портов. В этой статье есть скрипт, который будет выполняться в цикле для сообщения о состоянии порта. (Применимо для Windows 2012 R2, Windows 8, Windows 10 и Windows 11)