Настройка переадресации портов в 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
где
listenaddress - локальный IP-адрес для прослушивания входящего соединения (полезно, если у вас есть несколько сетевых карт в разных подсетях/VLAN или несколько IP-адресов на одном интерфейсе);
listenport - номер локального TCP-порта для прослушивания (ожидает соединения);
connectaddress - локальный или удаленный IP-адрес (или DNS-имя), на который вы хотите перенаправить входящее соединение;
connectport - TCP-порт, к которому осуществляется подключение
listenportпересылается.
Используя
netsh interface portproxy addv4tov6/
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, откройте командную строку от имени администратора и выполните следующую команду:
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Примечание. Если эта команда ничего не возвращает и переадресация портов через прокси-сервер порта netsh не работает, убедитесь, что на вашем устройстве Windows запущена служба iphlpsvc (IP Helper).
Проверьте статус услуги в
services.mscконсоль или с помощью команды PowerShell:
Get-Service iphlpsvcПоддержка IPv6 должна быть включена на сетевом интерфейсе, для которого создается правило переадресации портов.
Это необходимые условия для корректной работы переадресации портов в Windows. Без службы IP Helper и без включенной поддержки IPv6 перенаправление портов работать не будет.
Чтобы переадресация портов работала в Windows Server 2003/XP, необходимо дополнительно установить для параметра IPEnableRouter значение 1 в разделе реестра HKEY_LOCAL_MACHINE\ System\CurrentControlSet\services\ Ткпип\Параметр.
Set-ItemProperty -Path HKLM:\system\CurrentControlSet\services\Tcpip\Parameters -Name IpEnableRouter -Value 1Эта опция также позволяет включить маршрутизацию между различными подсетями в Hyper-V.
Вы можете идентифицировать процесс, прослушивающий указанный порт, по его PID (в нашем примере PID — 636):
tasklist | findstr 636Теперь попробуйте подключиться к новому порту с удаленного компьютера с помощью любого RDP-клиента. Вам необходимо указать 3340 в качестве номера порта RDP. Он указывается после двоеточия после адреса хоста RDP. Например,
10.10.1.110:3340В этом примере порт TCP/3340 необходимо сначала открыть в брандмауэре Защитника Windows (см. следующий раздел статьи).
Соединение 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 (описано ниже).
Кроме того, вы можете использовать туннели SSH в Windows для перенаправления локального порта на удаленный сервер.
Настройка правил брандмауэра для режима переадресации портов в Windows
Убедитесь, что ваш брандмауэр (Защитник Microsoft Windows или сторонний брандмауэр, который часто является частью антивирусного программного обеспечения) разрешает входящие подключения к новому порту. Вы можете добавить новое разрешающее правило в брандмауэр Защитника Windows с помощью команды:
netsh advfirewall firewall add rule name="forwarded_RDPport_3340" protocol=TCP dir=in localip=10.1.1.110 localport=3340 action=allowИли с помощью командлета PowerShell New-NetFirewallRule:
New-NetFirewallRule -DisplayName "forwarder_RDP_3340" -Direction Inbound -Protocol TCP -LocalPort 3340 -Action AllowПри создании правила брандмауэра для входящего трафика для порта TCP/3340 через графический интерфейс брандмауэра Защитника Windows вам не нужно связывать программу или процесс с правилом. Этот порт прослушивается только сетевым драйвером.
Если вы отключили правило portproxy, обязательно удалите оставшееся правило брандмауэра следующим образом:
netsh advfirewall firewall del rule name="RDP_3340"или удалите правило брандмауэра с помощью PowerShell:
Remove-NetFirewallRule -Name RDP_3340Управление правилами переадресации портов Netsh в Windows
В Windows можно создать любое количество правил переадресации портов. Все правила прокси-сервера интерфейса netsh являются постоянными и сохраняются после перезагрузки Windows.
Несколько раз я сталкивался со случаями, когда в Windows Server 2012 R2 правила переадресации портов сбрасывались после перезагрузки сервера. В этом случае необходимо проверить, нет ли периодического отключения на сетевом интерфейсе и не меняется ли IP-адрес при загрузке ОС (лучше использовать статический IP вместо динамического DHCP). В качестве обходного пути мне пришлось добавить пакетный сценарий с правилами прокси-сервера интерфейса netsh в планировщик задач 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 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Важно. Эта схема переадресации портов работает только для TCP-портов. Таким образом вы не сможете перенаправлять порты UDP. Кроме того, вы не можете использовать интерфейс обратной связи 127.0.0.1 (localhost) в качестве
connectaddressВы можете использовать Windows Server с установленной ролью RRAS (служба маршрутизации и удаленного доступа и 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 для 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-портов. Если вам нужно перенаправить несколько портов, вам придется вручную создать несколько правил перенаправления прокси-портов.
Правила переадресации портов также можно использовать для перенаправления порта с внешнего IP-адреса физического сетевого адаптера на порт виртуальной машины, работающей на том же хосте. В Hyper-V вы можете настроить переадресацию портов на уровне виртуального коммутатора (см. ниже).
Переадресация портов с помощью правил NAT на виртуальном коммутаторе Hyper-V
При использовании роли Hyper-V на вашем компьютере (она может быть установлена как на Windows 10/11, так и на Windows Server или как бесплатный сервер Hyper-V) вы можете настроить правила переадресации портов 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










