Поиск по сайту:

Настройка переадресации портов в 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 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, откройте командную строку от имени администратора и выполните следующую команду:

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

Статьи по данной тематике