Настройка переадресации портов в Windows

Вы можете настроить переадресацию сетевых портов во всех версиях Windows без использования сторонних инструментов. Используя правило переадресации портов, вы можете перенаправить входящее TCP-соединение (IPv4 или IPv6) с локального TCP-порта на любой другой порт или даже на порт удаленного компьютера. Проброс портов в Windows чаще всего используется для обхода брандмауэров или для скрытия внутреннего узла или службы от внешней сети (NAT/PAT).

В мире Linux проброс портов настраивается довольно просто с помощью iptables или firewalldправила. На хостах Windows Server для настройки перенаправления портов обычно используется служба маршрутизации и удаленного доступа (RRAS). Однако есть более простой способ включить перенаправление портов с помощью netsh portproxy , который работает на всех версиях Windows от Win XP до текущих сборок Windows 11 и Windows Server 2022.

Как включить переадресацию портов в Windows с помощью Netsh Portproxy?

Вы можете настроить переадресацию портов в Windows с помощью команды Portproxy режим Netsh команда.

Синтаксис команды следующий:

netsh interface portproxy add v4tov4 listenaddress=localaddress listenport=localport connectaddress=destaddress connectport=destport
где

  • адрес прослушивания -это локальный IP-адрес для прослушивания входящего соединения (полезно, если у вас несколько сетевых карт в разных подсетях/VLAN или несколько IP-адресов на одном интерфейсе);
  • listenport – номер локального TCP-порта для прослушивания (на котором ожидается соединение);
  • connectaddress – локальный или удаленный IP-адрес (или DNS-имя), на который необходимо перенаправить входящее соединение;
  • connectport – это TCP-порт, к которому подключается соединение из listenport перенаправляется.
Использование netsh interface portproxy add v4tov6/v6tov4/v6tov6 опции, вы можете создавать правила переадресации портов между адресами IPv4 и IPv6.

Предположим, ваша задача – заставить службу RDP отвечать на нестандартный порт, например 3340 (конечно, этот номер порта можно изменить в настройках Windows, но мы используем RDP, чтобы было проще продемонстрировать технику переадресации портов). Для этого нам нужно перенаправить входящий трафик с TCP-порта 3340 на другой локальный порт 3389 (это номер порта RDP по умолчанию).

Обратите внимание, что номер локального порта, который вы указали в listenport не должен прослушиваться (использоваться) другой службой или процессом. Убедитесь, что номер порта не используется:

netstat -na|find "3340"

Также можно проверить, что порт не прослушивается локально, с помощью команды PowerShell Test-NetConnection:

Test-NetConnection -ComputerName localhost -Port 3340

проверка состояния локального прослушивания на windows 10проверить состояние локального прослушивания на windows 10

Чтобы создать правило переадресации портов в Windows, откройте командную строку с правами администратора и выполните следующую команду:

netsh interface portproxy add v4tov4 listenport=3340 listenaddress=10.1.1.110 connectport=3389 connectaddress=10.1.1.110

правило переадресации портов в windows с помощью netsh interface portproxy addправило переадресации портов windows с помощью netsh интерфейса portproxy add

Где 10.10.1.110 – текущий IP-адрес компьютера, на котором настроена переадресация портов.

Теперь с помощью инструмента netstat проверьте, что Windows теперь прослушивает локальный порт 3340:

netstat -ano | findstr :3340

netstat -ano - Получить PID процессаnetstat -ano - Получить PID процесса

Примечание. Если эта команда ничего не дает, а проброс портов через интерфейс netsh portproxy не работает, убедитесь, что у вас есть iphlpsvc (Служба IP Helper), запущенная на вашем устройстве Windows.

Проверьте состояние службы в разделе services.msc консоли или с помощью команды PowerShell:

Get-Service iphlpsvc

  служба iphlpsvc (IP Helper)   служба iphlpsvc (IP Helper)

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

протокол ipv6 включенпротокол ipv6 включен

Это необходимые условия для корректной работы перенаправления портов в Windows. Без службы IP Helper и без включенной поддержки IPv6 перенаправление портов работать не будет.

Чтобы переадресация портов работала в Windows Server 2003/XP, необходимо дополнительно установить параметр IPEnableRouter параметр к 1 под ключом реестра HKEY_LOCAL_MACHINE\ System\CurrentControlSet\services\Tcpip\Parameter.

Set-ItemProperty -Path HKLM:\system\CurrentControlSet\services\Tcpip\Parameters -Name IpEnableRouter -Value 1

Этот параметр также позволяет включить маршрутизацию между различными подсетями в Hyper-V.

Процесс, прослушивающий указанный порт, можно определить по его PID (в нашем примере PID равен 636):

tasklist | findstr 636

Теперь попробуйте подключиться к новому порту с удаленного компьютера с помощью любого RDP-клиента. В качестве номера порта RDP необходимо указать 3340. Он указывается после двоеточия, следующего за адресом хоста RDP. Например, 10.10.1.110:3340

RDP-клиент подключается к другому портуRDP-клиент подключается к другому порту

В этом примере порт TCP/3340 должен быть сначала открыт в брандмауэре Windows Defender (см. следующий раздел статьи).

RDP-соединение должно быть успешно установлено.

Правила проброса портов Portproxy являются постоянными и не удаляются при перезагрузке Windows. Эти правила хранятся в реестре. Вы можете перечислить правила переадресации netsh в реестре с помощью PowerShell:

Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\PortProxy\v4tov4\tcp

получить список правил portproxy из реестра windowsполучить список правил portproxy из реестра windows

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

netsh interface portproxy add v4tov4 listenport=3389 listenaddress=0.0.0.0 connectport=3389 connectaddress=192.168.100.101

Это правило перенаправит весь входящий RDP-трафик (с локального TCP-порта 3389) с этого компьютера на удаленный хост с IP-адресом 192.168.1.100.

Обратите внимание, что режим portproxy в Windows не поддерживает сохранение IP-адреса источника в пересылаемом сетевом пакете. Поэтому, если вы переадресуете порт 443 с Windows-устройства на внутренний веб-сервер, то все входящие соединения будут отображаться на целевом сервере как исходящие с одного IP-адреса (с вашего Windows-узла с включенным netsh portproxy). Если вам нужно использовать переадресацию IP-адреса источника, вам нужно использовать NAT на внешнем брандмауэре или в Hyper-V (описано ниже).

Также можно использовать SSH-туннели в Windows для перенаправления локального порта на удаленный сервер.

Настройка правил брандмауэра для режима переадресации портов в Windows

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

netsh advfirewall firewall add rule name="forwarded_RDPport_3340" protocol=TCP dir=in localip=10.1.1.110  localport=3340 action=allow

Или с помощью команды New-NetFirewallRule PowerShell:
New-NetFirewallRule -DisplayName "forwarder_RDP_3340" -Direction Inbound -Protocol TCP –LocalPort 3340 -Action Allow

При создании входящего правила брандмауэра для порта TCP/3340 через графический интерфейс Windows Defender Firewall вам не нужно связывать программу или процесс с правилом. Этот порт прослушивается только сетевым драйвером.

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

netsh advfirewall firewall del rule name="RDP_3340"

или удалите правило брандмауэра с помощью PowerShell:

Remove-NetFirewallRule -Name RDP_3340

Управление правилами переадресации портов Netsh в Windows

Вы можете создать любое количество правил переадресации портов в Windows. Все правила netsh interface portproxy являются постоянными и сохраняются после перезагрузки Windows.

Несколько раз я сталкивался со случаями, когда в Windows Server 2012 R2 правила проброса портов сбрасывались после перезагрузки сервера. В этом случае необходимо проверить, происходит ли периодическое отключение сетевого интерфейса и меняется ли IP-адрес при загрузке ОС (лучше использовать статический IP, а не динамический DHCP). В качестве обходного пути мне пришлось добавить пакетный сценарий с правилами netsh interface portproxy в планировщик задач Windows, который запускается при загрузке системы.

Чтобы отобразить список всех включенных правил проброса TCP-портов в Windows, выполните команду:

netsh interface portproxy show all

В нашем случае существует только одно правило переадресации с локального порта 3340 на 3389:

Listen on ipv4:             Connect to ipv4:
Address         Port        Address         Port
--------------- ----------  --------------- ----------
10.1.1.110     3340        10.1.1.110     3389

Отображение всех правил переадресации портовОтображение всех правил переадресации портов

Совет. Вы также можете перечислить все правила переадресации портов в portproxy следующим образом:

netsh interface portproxy dump

#========================
# Port Proxy configuration
#========================
pushd interface portproxy
reset
add v4tov4 listenport=3340 connectaddress=10.1.1.110 connectport=3389
popd
# End of Port Proxy configuration

netsh interface portproxy dumpnetsh interface portproxy dump

Если вам нужно изменить настройки существующего правила portproxy, используйте следующую команду:

netsh interface portproxy set v4tov4 listenport=3340 listenaddress=10.10.1.110 connectport=3300 connectaddress=10.10.1.110

В этом примере мы изменили номер целевого порта portproxy на 3300.

изменить правило переадресации портов netsh portproxyизменить правило переадресации портов netsh portproxy

Чтобы удалить определенное правило переадресации портов:

netsh interface portproxy delete v4tov4 listenport=3340 listenaddress=10.1.1.110

Чтобы удалить все существующие правила сопоставления портов и полностью очистить таблицу правил переадресации портов:

netsh interface portproxy reset

Важно. Эта схема проброса портов работает следующим образом только для порта TCPs. Вы не сможете пробросить таким образом порты UDP. Также вы не сможете использовать loopback-интерфейс 127.0.0.1 (localhost) в качестве connectaddress.

Вы можете использовать Windows Server с установленной ролью RRAS (Routing and Remote Access Service and NAT), чтобы включить проброс портов для UDP-трафика. Вы можете настроить переадресацию портов между сетевыми интерфейсами сервера с помощью графической оснастки (rrasmgmt.msc) или с помощью команды:

netsh routing ip nat add portmapping Ethernet1 udp 0.0.0.0 53 192.168.100.100 53

Список правил переадресации портов NAT в Windows Server может быть представлен следующим образом:

netsh routing ip nat show interface

Если на вашем компьютере установлена WSL (Windows Subsystem for Linux), вы можете создать простой сценарий PowerShell для создания правила переадресации портов на виртуальную машину WSL 2 (виртуальная машина WSL2 имеет свой виртуальный адаптер Ethernet с уникальным IP-адресом):

wsl --shutdown;
netsh interface portproxy reset;
$wsl_ipaddr = wsl -d Ubuntu-20.04 hostname -I;
netsh interface portproxy add v4tov4 listenport=443 listenaddress=0.0.0.0 connectport=443 connectaddress=$wsl_ipaddr ;
netsh interface portproxy show all;
exit;

Еще одной неявной особенностью portproxy является возможность придать любой удаленной сетевой службе такой вид, как будто она работает локально. Например, вы хотите перенаправить соединения с локального порта 9090 на удаленный HTTPS-сервер (google.com:443)

netsh interface portproxy add v4tov4 listenport=9090 connectport=443 connectaddress=google.com protocol=tcp

Теперь страница поиска Google откроется, если вы перейдете по адресу http://localhost:9090/ в браузере (необходимо игнорировать ошибки SSL_ERROR_BAD_CERT_DOMAIN). Таким образом, несмотря на то, что браузер обращается к адресу локального компьютера, он открывает страницу с внешнего веб-сервера.

portproxy: перенаправление локального порта на удаленный веб-сервисportproxy: перенаправление локального порта на удаленный веб-сервис

Windows не может перенаправлять диапазон TCP-портов. Если вам нужно перенаправить несколько портов, вам придется вручную создать несколько правил перенаправления portproxy.

Правила переадресации портов также можно использовать для перенаправления порта с внешнего IP-адреса физической сетевой карты на порт виртуальной машины, работающей на том же хосте. В Hyper-V можно настроить перенаправление портов на уровне виртуального коммутатора (см. ниже).

Переадресация портов с правилами NAT на виртуальном коммутаторе Hyper-V

При использовании роли Hyper-V на компьютере (она может быть установлена как на Windows 10/11, так и на Windows Server, или как бесплатный Hyper-V Server) можно настроить правила переадресации портов DNAT с помощью PowerShell. Предположим, вам нужно перенаправить весь HTTPS-трафик, который получает ваш хост Hyper-V, на IP-адрес виртуальной машины, запущенной на этом хосте. Для этого воспользуйтесь командой Hyper-V StaticMapping Команды.

Создайте виртуальный коммутатор Hyper-V:

New-VMSwitch -SwitchName NAT_Switch -SwitchType Internal

создание виртуального коммутатора hyperv nat switch с помощью powershellсоздание коммутатора hyperv nat с помощью powershell

Установите IP-адрес для нового виртуального коммутатора:

New-NetIPAddress -IPAddress 192.168.100.1 -PrefixLength 24  -InterfaceAlias "vEthernet (NAT_Switch)"

Включите NAT для этой сети:

New-NetNat -Name NATNetwork -InternalIPInterfaceAddressPrefix 192.168.100.0/24

Подключите виртуальную машину к NAT_Switch и назначьте ей статический IP-адрес (например, 192.168.10.80). Установите IP-адрес виртуального коммутатора Hyper-V (в данном случае 192.168.100.1) в качестве шлюза по умолчанию для сетевого подключения виртуальной машины.

Теперь можно включить перенаправление портов с хоста Hyper-V на виртуальную машину:

Add-NetNatStaticMapping -NatName NATNetwork443 -Protocol TCP  -ExternalIPAddress 0.0.0.0/24  -ExternalPort 443  -InternalIPAddress 192.168.10.80  -InternalPort 443

После выполнения этих команд PowerShell весь HTTPS-трафик, поступающий на порт TCP/443 хоста Hyper-V, будет перенаправляться на частный IP-адрес виртуальной машины.

Если вы хотите создать правило переадресации портов для нестандартного порта, не забудьте открыть его в брандмауэре Windows:

New-NetFirewallRule -DisplayName "HyperV_Nat_444" -Direction Inbound -LocalPort 444 -Protocol TCP -Action Allow -Enabled True

Вы можете отобразить полный список правил проброса портов NAT/PAT на хосте Hyper-V следующим образом:

Get-NetNat

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *