У Linux можна досить просто налаштувати перенаправлення портів за допомогою правил iptables або firewalld. На серверних системах Windows Server для налаштування перенаправлення портів можна використовувати службу маршрутизації та віддаленого доступу (RRAS). Однак є більш простий спосіб налаштування прокидання портів за допомогою режиму portproxy, netsh який однаково добре працює в будь-якій версії Windows (починаючи з Windows 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 порту, підключення до якого перенаправлятиметься (на цьому порту очікується вхідне з'єднання);
conectaddress – локальна або віддалена IP-адреса або DNS-ім'я хоста, на яку потрібно перенаправити мережне підключення;
connectport – номер TCP порту, який потрібно перенаправити трафік з порту listenport.
Припустимо, наше завдання, змусити службу RDP відповідати на нестандартному порту, наприклад 3340 (цей порт, звичайно, можна змінити в налаштуваннях самої служби, але ми використовуємо саме RDP для спрощення демонстрації техніки перенаправлення та прокидання портів). Для цього нам потрібно перенаправити вхідний трафік на порт TCP 3340 на інший локальний порт - 3389 (це номер стандартного порту RDP).За допомогою опцій netsh interface portproxy add v4tov6 / v6tov4 / v6tov6 можна створювати правила порт форвардингу між для IPv4 та IPv6 адрес або між ними.
Щоб створити правило перенаправлення порту, запустіть командний рядок з правами адміністратора та виконайте команду:Примітка. Зверніть увагу, що номер локального порту, який ви вказали в listenport, не повинен бути зайнятий (слухатися) іншою службою. Перевірте, чи номер порту вільний командою:Або ви можете перевірити, що порт не слухається локально за допомогою PowerShell командлета Test-NetConnection :Код: Виділити все
netstat -na|find "3340"
Код: Виділити все
Test-NetConnection -ComputerName localhost -Port 3340
Код: Виділити все
netsh interface portproxy add v4tov4 listenport=3340 listenaddress=10.10.1.110 connectport=3389 connectaddress=10.10.1.110
10.10.1.110 – IP-адреса вашого комп'ютера, на якому налаштовується порт-форвардинг.
Тепер за допомогою утиліти netstat перевірте, що у Windows тепер слухається локальний порт 3340:
Код: Виділити все
netstat -ano | findstr :3340
Ви можете визначити процес, який слухає вказаний локальний порт за його PID (у прикладі PID – 636):Примітка. Якщо ця команда нічого не повертає і перенаправлення портів через netsh interface portproxy не працює, перевірте, чи у вас у Windows включена служба iphlpsvc (IP Helper/Допоміжна служба IP).
Перевірте стан служби в консолі services.msc або за допомогою PowerShell:Також на мережному інтерфейсі, для якого створюється правило перенаправлення портів, повинна бути включена підтримка протоколу IPv6. Це обов'язкові умови коректної роботи порт-форвардинга. Без служби IP Helper і без увімкненої підтримки IPv6 механізм перенаправлення не працює.Код: Виділити все
Get-Service iphlpsvc
У Windows Server 2003/XP для роботи перенаправлення додатково потрібно включити параметр реєстру IPEnableRouter = 1 у гілці HKEY_LOCAL_MACHINE\System\CurrentControlSet\services\Tcpip\Parameter. Цей параметр реєстру можна ввімкнути за допомогою PowerShell:Цей параметр також дозволяє включити маршрутизацію між різними підмережами Hyper-V.Код: Виділити все
Set-ItemProperty -Path HKLM:\system\CurrentControlSet\services\Tcpip\Parameters -Name IpEnableRouter -Value 1
Код: Виділити все
tasklist | findstr 636
RDP підключення має успішно встановитись.У цьому прикладі порт 3340 потрібно попередньо відкрити Windows Defender Firewall (див. наступний розділ статті).
Правила прокидання портів portproxy є постійними і не видаляються під час перезавантаження Windows. Ці правила зберігаються у реєстрі. Можна вивести список правил перенаправлення netsh у реєстрі за допомогою PowerShell:
Код: Виділити все
Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\PortProxy\v4tov4\tcp
Код: Виділити все
netsh interface portproxy add v4tov4 listenport=3389 listenaddress=0.0.0.0 connectport=3389 connectaddress=192.168.1.100
Потрібно зазначити, що режим portproxy у Windows не підтримує збереження IP джерела у перенаправленому мережевому пакеті. Тобто, якщо ви прокинете 443 порт Windows комп'ютера на внутрішній веб-сервер, то на цільовому сервері всі вхідні з'єднання будуть йти з однієї й тієї ж IP адреси (Windows комп'ютер з активним режимом netsh portproxy). Якщо вам потрібно використовувати переадресацію із збереженням IP джерела, потрібно використовувати NAT на зовнішньому файволі або Hyper-V (описано нижче).
Налаштування правил фаєрволу для режиму перенаправлення портів WindowsТакож для прокидання локального порту на віддалений сервер у Windows можна використовувати техніку SSH тунелів.
Перевірте, що в налаштуваннях вашого фаєрвола (брандмауера Windows або стороннього міжмережевого екрану, такі часто включаються до антивірусного ПЗ) дозволені вхідні підключення на новий порт. Ви можете додати новий дозвіл у Windows Defender Firewall командою:
Код: Виділити все
netsh advfirewall firewall add rule name=”RDP_3340” protocol=TCP dir=in localip=10.10.1.110 localport=3340 action=allow
Код: Виділити все
New-NetFirewallRule -DisplayName "RDP_3340" -Direction Inbound -Protocol TCP –LocalPort 3340 -Action Allow -Enabled True
Якщо ви відключаєте правило portproxy, не забудьте видалити правила фаєрволу, що залишилися, командою:
Код: Виділити все
netsh advfirewall firewall del rule name="RDP_3340"
Код: Виділити все
Remove-NetFirewallRule -Name RDP_3340
Можна створити будь-яку кількість правил перенаправлення локальних портів Windows. Всі правила netsh interface portproxy є постійними і зберігаються в системі після перезавантаження Windows.
Щоб вивести список усіх активних правил перенаправлення TCP портів у Windows, виконайте команду:Декілька разів стикався з випадками, коли в Windows Server 2012 R2 правила перенаправлення портів скидалися після перезавантаження сервера. У цьому випадку рекомендується перевірити чи немає періодичних відключень на мережному інтерфейсі, і чи не змінюється IP адреса при завантаженні ОС (краще використовуватися статичну IP замість динамічної - DHCP). Як обхідне рішення довелося додати до планувальника Windows скрипт з правилами netsh interface portproxy, який створює правило перенаправлення порту при завантаженні операційної системи.
Код: Виділити все
netsh interface portproxy show all
Код: Виділити все
Listen on ipv4: Connect to ipv4:
Address Port Address Port
--------------- ---------- --------------- ----------
10.10.1.110 3340 10.10.1.110 3389
Якщо потрібно змінити налаштування наявного правила portproxy, використовуйте таку команду:Порада. Також ви можете вивести вагу правила перенаправлення портів у режимі portproxy так:Код: Виділити все
netsh interface portproxy dump #======================== # Port Proxy configuration #======================== pushd interface portproxy reset add v4tov4 listenport=3340 conectaddress=10.10.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
Код: Виділити все
netsh interface portproxy delete v4tov4 listenport=3340 listenaddress=10.10.1.110
Код: Виділити все
netsh interface portproxy reset
Якщо у вас на комп'ютері розгорнутий WSL (Windows Subsystem for Linux), ви можете створити простий PowerShell скрипт створення правила перенаправлення порту всередину віртуальної машини WSL 2 (у ВМ на WSL 2 є власний віртуальний адаптер ethernet з унікальною IP адресою):Важливо. Така схема перенаправлення працює лише для TCP портів. Трафік UDP портів не можна перенаправити за допомогою режиму portproxy. Також не можна використовувати як conectaddress адресу localhost 127.0.0.1.
Якщо ви хочете увімкнути перенаправлення UDP трафіку, можна використовувати Windows Server за участю RRAS та NAT. Ви можете налаштувати перенаправлення портів між інтерфейсами комп'ютера за допомогою графічного оснащення (rrasmgmt.msc) або командою:Список NAT правил перенаправлення портів у Windows Server можна вивести так:Код: Виділити все
netsh routing ip nat add portmapping Ethernet udp 0.0.0.0 53 192.168.1.54 53
Код: Виділити все
netsh routing ip nat show interface
Код: Виділити все
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;
Код: Виділити все
netsh interface portproxy add v4tov4 listenport=9090 listenaddress=127.0.0.1 connectaddress=142.250.74.46 connectport=443 protocol=tcp
Windows не вміє прокидати діапазон TCP портів. Якщо вам потрібно прокинути кілька портів, доведеться вручну створювати кілька правил перенаправлення.
Налаштування перенаправлення портів за допомогою NAT на Hyper-V Server
При використанні на вашому комп'ютері ролі Hyper-V (можна бути встановлена як на Windows 10/11, так і на Windows Server або у вигляді безкоштовного Windows Hyper-V Server), ви можете налаштувати прокидання портів DNAT за допомогою PowerShell. Допустимо, ви хочете перенаправити всі https запити, які отримує ваш хост Hyper-V на IP адресу запущеної на хості віртуальної машини. Для цього використовується команда Hyper-V StaticMapping.
Створіть віртуальний комутатор Hyper-V:
Код: Виділити все
New-VMSwitch -SwitchName "NAT_Switch" -SwitchType Internal
Код: Виділити все
New-NetIPAddress -IPAddress 192.168.10.1 -PrefixLength 24 -InterfaceAlias "vEthernet (NAT_Switch)"
Код: Виділити все
New-NetNat -Name NATNetwork -InternalIPInterfaceAddressPrefix 192.168.10.0/24
Тепер можна налаштувати перенаправлення порту з хоста Hyper-V у віртуальну машину:
Код: Виділити все
Add-NetNatStaticMapping -NatName NATNetwork443 -Protocol TCP -ExternalIPAddress 0.0.0.0/24 -ExternalPort 443 -InternalIPAddress 192.168.10.80 -InternalPort 443
Якщо ви бажаєте перенаправити нестандартний порт, не забудьте відкрити його у Windows Firewall:
Код: Виділити все
New-NetFirewallRule -DisplayName "HyperV_Nat_443" -Direction Inbound -LocalPort 443 -Protocol TCP -Action Allow -Enabled True
Код: Виділити все
Get-NetNat