
Вы можете настроить переадресацию сетевых портов во всех версиях 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 по умолчанию).
netstat -na|find "3340"
Также можно проверить, что порт не прослушивается локально, с помощью команды PowerShell Test-NetConnection:
Test-NetConnection -ComputerName localhost -Port 3340
Чтобы создать правило переадресации портов в Windows, откройте командную строку с правами администратора и выполните следующую команду:
netsh interface portproxy add v4tov4 listenport=3340 listenaddress=10.1.1.110 connectport=3389 connectaddress=10.1.1.110
Где 10.10.1.110 – текущий IP-адрес компьютера, на котором настроена переадресация портов.
Теперь с помощью инструмента netstat проверьте, что Windows теперь прослушивает локальный порт 3340:
netstat -ano | findstr :3340
Проверьте состояние службы в разделе services.msc
консоли или с помощью команды PowerShell:
Get-Service iphlpsvc
На сетевом интерфейсе, для которого создается правило проброса портов, должна быть включена поддержка 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-соединение должно быть успешно установлено.
Правила проброса портов Portproxy являются постоянными и не удаляются при перезагрузке Windows. Эти правила хранятся в реестре. Вы можете перечислить правила переадресации netsh в реестре с помощью PowerShell:
Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\PortProxy\v4tov4\tcp
Если вы хотите перенаправить входящее 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 (описано ниже).
Настройка правил брандмауэра для режима переадресации портов в 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.
Чтобы отобразить список всех включенных правил проброса 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
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
Если вам нужно изменить настройки существующего правила portproxy, используйте следующую команду:
netsh interface portproxy set v4tov4 listenport=3340 listenaddress=10.10.1.110 connectport=3300 connectaddress=10.10.1.110
В этом примере мы изменили номер целевого порта portproxy на 3300.
Чтобы удалить определенное правило переадресации портов:
netsh interface portproxy delete v4tov4 listenport=3340 listenaddress=10.1.1.110
Чтобы удалить все существующие правила сопоставления портов и полностью очистить таблицу правил переадресации портов:
netsh interface portproxy reset
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). Таким образом, несмотря на то, что браузер обращается к адресу локального компьютера, он открывает страницу с внешнего веб-сервера.
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
Установите 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