Устранение неполадок с нехваткой портов
Применимо к: 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.
В частности, об исходящих подключениях в качестве входящих подключений не потребуется временный порт для приема подключений.
Так как исходящие подключения начинают завершать сбой, вы увидите множество экземпляров следующих вариантов поведения:
Не удается войти на компьютер с учетными данными домена, однако вход с локальной учетной записью работает. Для входа в домен вам потребуется связаться с контроллером домена для проверки подлинности, которая снова является исходящим подключением. Если учетные данные кэша заданы, вход в домен может по-прежнему работать.
групповая политика сбои при обновлении:
Общие папки недоступны:
Сбой RDP с затронутого сервера:
Любое другое приложение, работающее на компьютере, начнет выдавать ошибки
Перезагрузка сервера временно решит проблему, но вы увидите, что все симптомы вернутся через некоторое время.
Если вы подозреваете, что компьютер находится в состоянии нехватки портов:
Попробуйте установить исходящее подключение. С сервера или компьютера получите доступ к удаленной общей папке или попробуйте RDP на другой сервер или telnet на сервер через порт. Если для всех этих параметров происходит сбой исходящего подключения, перейдите к следующему шагу.
Откройте средство просмотра событий и в системных журналах найдите события, которые четко указывают на текущее состояние:
Идентификатор события 4227
Идентификатор события 4231
Сбор выходных
netstat -anob
данных с сервера. В выходных данных netstat будет отображаться огромное количество записей для TIME_WAIT состояния для одного PID.После корректного закрытия или внезапного закрытия сеанса через 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: исправления временных портов.Откройте командную строку в режиме администрирования и выполните приведенную ниже команду.
Netsh trace start scenario=netconnection capture=yes tracefile=c:\Server.etl
Откройте файл 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), ознакомьтесь с диспетчером задач:
Добавьте столбец с именем handles в раздел details/processes.
Отсортируйте дескриптор столбца, чтобы определить процесс с наибольшим количеством дескрипторов. Обычно виновником может быть процесс с дескриптором более 3000, за исключением таких процессов, как System, lsass.exe, store.exe ,sqlsvr.exe.
Если какой-либо другой процесс, отличный от этих процессов, имеет большее число, остановите этот процесс, а затем попытайтесь войти с помощью учетных данных домена и проверить, успешно ли он будет выполнен.
Способ 3
Если диспетчер задач не помог определить процесс, используйте Обозреватель process для изучения проблемы.
Действия по использованию обозревателя процессов:
Скачайте Обозреватель process и запустите его с повышенными привилегиями.
Alt + выберите заголовок столбца, выберите Выбрать столбцы и на вкладке Производительность процесса добавьте число дескрипторов.
Выберите Вид Показать>нижнюю область.
Выберите Представление>дескрипторов представления >нижней области.
Выберите столбец Дескрипторы , чтобы отсортировать его по значению.
Изучите процессы с более высоким количеством дескрипторов, чем остальные (скорее всего, будет больше 10 000, если вы не можете установить исходящие подключения).
Щелкните, чтобы выделить один из процессов с высоким количеством дескрипторов.
В нижней области дескрипторами, перечисленными ниже, являются сокеты. (Сокеты технически являются дескрипторами файлов).
Файл \Device\AFD
Некоторые из них являются нормальными, но большое количество из них не является (сотни и тысячи). Закройте рассматриваемый процесс. Если это восстанавливает исходящее подключение, вы также доказали, что причиной является приложение. Обратитесь к поставщику этого приложения.
Наконец, если приведенные выше методы не помогли изолировать процесс, мы рекомендуем собрать полный дамп памяти компьютера в состоянии проблемы. Дамп сообщит, какой процесс имеет максимальное количество дескрипторов.
В качестве обходного решения перезагрузка компьютера возвратит его в нормальное состояние и поможет устранить проблему на время. Однако если перезагрузка непрактичная, можно также рассмотреть возможность увеличения числа портов на компьютере с помощью следующих команд:
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)