Поделиться через


Устранение проблем нехватки портов

Применимо к: 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 и окончания порта 109999 (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 состояния для одного пин-кода.

    Снимок экрана: выходные данные команды 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.

    До октября 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" в разделе сведений и процессов.

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

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

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

Метод 3

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

Действия, которые нужно выполнить в обозревателе процессов.

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

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

  3. Выберите "Вид",>чтобы отобразить более низкую область.

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

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

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

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

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

    File \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)