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

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

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

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

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

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

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

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

Вы можете просмотреть динамический диапазон портов на компьютере с помощью следующих команд 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). Диапазон портов теперь является диапазоном, в котором есть начальная и конечная точки. Клиенты Microsoft, развертывающие серверы под управлением Windows Server, могут столкнуться с проблемами, влияющими на взаимодействие RPC между серверами, если брандмауэры используются во внутренней сети. В таких случаях мы рекомендуем перенастраивать брандмауэры, чтобы разрешить трафик между серверами в диапазоне динамических портов 4915265535. Этот диапазон является дополнением к известным портам, которые используются службами и приложениями. Кроме того, на каждом сервере можно изменить диапазон портов, используемый серверами. Этот диапазон можно настроить с помощью команды 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.

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

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

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

    Снимок экрана с сообщением об ошибке NETLOGON в средстве просмотра событий

  • Ошибки обновления групповой политики:

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

  • Общие файлы недоступны.

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

  • Не удается выполнить RDP с уязвимого сервера:

    Снимок экрана: ошибка, когда не удается подключиться к удаленному рабочему столу

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

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

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

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

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

    А. Событие с кодом 4227

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

    Б. Событие с кодом 4231

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

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

    Снимок экрана: вывод команды netstat

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

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

Примечание

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

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

Пока не 10/2016, средство netstat было неточным. Исправления для netstat, обратного переноса в 2012 R2, разрешены программой netstat. exe и Get-Нетткпконнектион для правильного отчета об использовании порта TCP или UDP в Windows Server 2012 R2. Дополнительные сведения можно найти в разделе исправления для Windows Server 2012 R2: временные порты .

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

    Netsh trace start scenario=netconnection capture=yes tracefile=c:\Server.etl
    
  2. Откройте файл Server. ETL с сетевым монитором и в разделе Фильтр примените фильтр WSCORE_MICROSOFTWINDOWSWINSOCKAFD. АФД _event_bind. Status. Лентстатус. Code = = 0x209. Вы должны увидеть записи, которые говорят STATUS_TOO_MANY_ADDRESSES. Если вы не нашли ни одной записи, сервер по-прежнему не помещается в порт. Если вы обнаружите их, вы можете убедиться, что сервер в разделе "исчерпание порта".

Устранение неполадок с портом

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

Способ 1

Для начала взгляните на выходные данные netstat. Если вы используете Windows 10 или Windows Server 2016, вы можете выполнить команду netstat -anobq и проверить идентификатор процесса, для которого заданы максимальные значения. Кроме того, вы также можете выполнить указанную ниже команду 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 

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

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

Способ 2

Если способ 1 не помогает идентифицировать процесс (до Windows 10 и Windows Server 2012 R2), просмотрите Диспетчер задач.

  1. Добавьте столбец с названием "маркеры" в разделе "Подробности и процессы".
  2. Отсортируйте маркеры столбцов, чтобы определить процесс с наибольшим количеством дескрипторов. Обычно процесс с дескрипторами более 3000 может быть недоступен, кроме процессов, таких как System, LSASS. exe, Store. exe, склсвр. exe.

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

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

Способ 3

Если диспетчер задач не помог найти процесс, а затем проанализирует ее с помощью Process Explorer.

Инструкции по использованию проводника по процессам:

  1. Скачайте проводник процессов и запустите его **** с повышенными привилегиями.
  2. Удерживая нажатой клавишу Alt, щелкните заголовок столбца, выберите команду Выбрать столбцы, а затем на вкладке производительность процесса — добавить Счетчик дескрипторов.
  3. На вкладке Вид нажмите кнопку Показать меньшую область.
  4. На вкладке Вид нажмите кнопку вид, а затем — маркеры.
  5. Щелкните столбец маркеры , чтобы отсортировать по значению.
  6. Изучите процессы с большим количеством дескрипторов, чем остаток (скорее всего, в 10 000, если вы не можете устанавливать исходящие подключения).
  7. Щелкните, чтобы выбрать один из процессов с большим количеством дескрипторов.
  8. В нижней области показанные ниже маркеры — это сокеты. (Сокеты являются техническими дескрипторами файлов).

    \Девице\афд файла

    Снимок экрана: Проводник по процессам

  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)