Налаштування прокидання мережевих портів (порт форвардинг) у Windows

Поради та підказки щодо софту, роботи в операційних системах, комплектуючих та зборок комп'ютерів.
Аватар користувача
toxi
Администратор
Администратор
Статті: 0
Повідомлень: 542
З нами з: 12-04-2008 07:58:25
Ваша стать: Чоловічий
І'мя: Roman
Контактна інформація:

Налаштування прокидання мережевих портів (порт форвардинг) у Windows

Повідомлення toxi »

У всіх версіях Windows можна настроїти перенаправлення/прокидання мережевих портів (порт форвардинг) без використання сторонніх інструментів. За допомогою правила форвардингу ви можете перенаправити вхідне з'єднання TCP (IPv4 або IPv6) з локального TCP порту на будь-який інший номер порту або навіть на порт віддаленого комп'ютера. Перенаправлення портів у Windows найчастіше використовується для обходу фаєрволів або щоб сховати сервер або службу від зовнішньої мережі (NAT/PAT).

У 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.
За допомогою опцій netsh interface portproxy add v4tov6 / v6tov4 / v6tov6 можна створювати правила порт форвардингу між для IPv4 та IPv6 адрес або між ними.
Припустимо, наше завдання, змусити службу RDP відповідати на нестандартному порту, наприклад 3340 (цей порт, звичайно, можна змінити в налаштуваннях самої служби, але ми використовуємо саме RDP для спрощення демонстрації техніки перенаправлення та прокидання портів). Для цього нам потрібно перенаправити вхідний трафік на порт TCP 3340 на інший локальний порт - 3389 (це номер стандартного порту RDP).
Примітка. Зверніть увагу, що номер локального порту, який ви вказали в listenport, не повинен бути зайнятий (слухатися) іншою службою. Перевірте, чи номер порту вільний командою:

Код: Виділити все

netstat -na|find "3340"
Або ви можете перевірити, що порт не слухається локально за допомогою PowerShell командлета Test-NetConnection :

Код: Виділити все

Test-NetConnection -ComputerName localhost -Port 3340
pereviriti-lokalniy-port-windows.jpg
Щоб створити правило перенаправлення порту, запустіть командний рядок з правами адміністратора та виконайте команду:

Код: Виділити все

netsh interface portproxy add v4tov4 listenport=3340 listenaddress=10.10.1.110 connectport=3389 connectaddress=10.10.1.110
netsh-interface-portproxy-add-v4tov4-uvimknuti-perenapravlennya.jpg
Де,
10.10.1.110 – IP-адреса вашого комп'ютера, на якому налаштовується порт-форвардинг.

Тепер за допомогою утиліти netstat перевірте, що у Windows тепер слухається локальний порт 3340:

Код: Виділити все

netstat -ano | findstr :3340
netstat-ano-findstr.jpg
Примітка. Якщо ця команда нічого не повертає і перенаправлення портів через netsh interface portproxy не працює, перевірте, чи у вас у Windows включена служба iphlpsvc (IP Helper/Допоміжна служба IP).
Перевірте стан служби в консолі services.msc або за допомогою PowerShell:

Код: Виділити все

Get-Service iphlpsvc
sluzhba-IP-Helper.jpg
Також на мережному інтерфейсі, для якого створюється правило перенаправлення портів, повинна бути включена підтримка протоколу IPv6.
IPv6-povinen-bit-uvimkneniy.jpg
Це обов'язкові умови коректної роботи порт-форвардинга. Без служби IP Helper і без увімкненої підтримки IPv6 механізм перенаправлення не працює.

У Windows Server 2003/XP для роботи перенаправлення додатково потрібно включити параметр реєстру IPEnableRouter = 1 у гілці HKEY_LOCAL_MACHINE\System\CurrentControlSet\services\Tcpip\Parameter. Цей параметр реєстру можна ввімкнути за допомогою PowerShell:

Код: Виділити все

Set-ItemProperty -Path HKLM:\system\CurrentControlSet\services\Tcpip\Parameters -Name IpEnableRouter -Value 1
Цей параметр також дозволяє включити маршрутизацію між різними підмережами Hyper-V.
Ви можете визначити процес, який слухає вказаний локальний порт за його PID (у прикладі PID – 636):

Код: Виділити все

tasklist | findstr 636
tasklist-findstr-pid.jpg
tasklist-findstr-pid.jpg (10.83 Кіб) Переглянуто 15193 разів
Тепер спробуйте підключитися на новий порт з віддаленого комп'ютера за допомогою будь-якого клієнта RDP. Як rdp-порт потрібно вказати 3340 (номер порту вказується після двокрапки після адреси rdp-сервера). Наприклад, 10.10.1.110:3340
У цьому прикладі порт 3340 потрібно попередньо відкрити Windows Defender Firewall (див. наступний розділ статті).
rdp-another-port.jpg
RDP підключення має успішно встановитись.
Правила прокидання портів portproxy є постійними і не видаляються під час перезавантаження Windows. Ці правила зберігаються у реєстрі. Можна вивести список правил перенаправлення netsh у реєстрі за допомогою PowerShell:

Код: Виділити все

Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\PortProxy\v4tov4\tcp
pravila-portproxy-v-reestre-windows.jpg
Якщо потрібно перенаправити вхідне з'єднання TCP на віддалений комп'ютер, використовуйте таку команду:

Код: Виділити все

netsh interface portproxy add v4tov4 listenport=3389 listenaddress=0.0.0.0 connectport=3389 connectaddress=192.168.1.100
Це правило перенаправить весь вхідний трафік RDP (з локального порту TCP 3389) з цього комп'ютера на віддалений комп'ютер з IP-адресою 192.168.1.100.

Потрібно зазначити, що режим portproxy у Windows не підтримує збереження IP джерела у перенаправленому мережевому пакеті. Тобто, якщо ви прокинете 443 порт Windows комп'ютера на внутрішній веб-сервер, то на цільовому сервері всі вхідні з'єднання будуть йти з однієї й тієї ж IP адреси (Windows комп'ютер з активним режимом netsh portproxy). Якщо вам потрібно використовувати переадресацію із збереженням IP джерела, потрібно використовувати NAT на зовнішньому файволі або Hyper-V (описано нижче).
Також для прокидання локального порту на віддалений сервер у Windows можна використовувати техніку SSH тунелів.
Налаштування правил фаєрволу для режиму перенаправлення портів Windows
Перевірте, що в налаштуваннях вашого фаєрвола (брандмауера 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
Або за допомогою командлета PowerShell New-NetFirewallRule:

Код: Виділити все

New-NetFirewallRule -DisplayName "RDP_3340" -Direction Inbound -Protocol TCP –LocalPort 3340 -Action Allow  -Enabled True
При створенні вхідного правила брандмауера для порту 3340 через графічний інтерфейс Windows Defender, не потрібно асоціювати з правилом програму або процесом. Цей порт слухається виключно мережним драйвером.

Якщо ви відключаєте правило 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). Як обхідне рішення довелося додати до планувальника Windows скрипт з правилами netsh interface portproxy, який створює правило перенаправлення порту при завантаженні операційної системи.
Щоб вивести список усіх активних правил перенаправлення TCP портів у Windows, виконайте команду:

Код: Виділити все

netsh interface portproxy show all
У нашому випадку є тільки одне правило форвардингу з локального порту 3340 на 3389:

Код: Виділити все

Listen on ipv4: Connect to ipv4:
Address Port Address Port
--------------- ---------- --------------- ----------
10.10.1.110 3340 10.10.1.110 3389
Порада. Також ви можете вивести вагу правила перенаправлення портів у режимі 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-show-all-spisok-perenapravlennya.jpg
Якщо потрібно змінити налаштування наявного правила portproxy, використовуйте таку команду:

Код: Виділити все

netsh interface portproxy set v4tov4 listenport=3340 listenaddress=10.10.1.110  connectport=3300 connectaddress=10.10.1.110
У цьому прикладі ми змінили адресу цільового порту portproxy на 3300.
netsh-portproxy-vivesti-vsi-pravila.jpg
Щоб видалити певне правило перенаправлення порту, виконайте:

Код: Виділити все

netsh interface portproxy delete v4tov4 listenport=3340 listenaddress=10.10.1.110
netsh-interface-portproxy-dump.jpg
Щоб видалити всі наявні правила перенаправлення та повністю очистити таблицю з правилами порт-форвардингу:

Код: Виділити все

netsh interface portproxy reset
skidannya-pravil-netsh-interface-portproxy-reset.jpg
Важливо. Така схема перенаправлення працює лише для TCP портів. Трафік UDP портів не можна перенаправити за допомогою режиму portproxy. Також не можна використовувати як conectaddress адресу localhost 127.0.0.1.
Якщо ви хочете увімкнути перенаправлення UDP трафіку, можна використовувати Windows Server за участю RRAS та NAT. Ви можете налаштувати перенаправлення портів між інтерфейсами комп'ютера за допомогою графічного оснащення (rrasmgmt.msc) або командою:

Код: Виділити все

netsh routing ip nat add portmapping Ethernet udp 0.0.0.0 53 192.168.1.54 53
Список NAT правил перенаправлення портів у Windows Server можна вивести так:

Код: Виділити все

netsh routing ip nat show interface
Якщо у вас на комп'ютері розгорнутий WSL (Windows Subsystem for Linux), ви можете створити простий PowerShell скрипт створення правила перенаправлення порту всередину віртуальної машини WSL 2 (у ВМ на WSL 2 є власний віртуальний адаптер 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 на google.com:443

Код: Виділити все

netsh interface portproxy add v4tov4 listenport=9090 listenaddress=127.0.0.1     connectaddress=142.250.74.46 connectport=443 protocol=tcp
Тепер, якщо в браузері перейди за адресою https://localhost:9090 (потрібно ігнорувати помилки SSL_ERROR_BAD_CERT_DOMAIN), відкриється пошукова сторінка Google. Тобто. незважаючи на те, що браузер звертається до локального комп'ютера, у ньому відкривається сторінка із зовнішнього веб-сервера.
priklad-vikoristannya-lokalnogo-prenapravlennya-portsv-na-zovnishniy-sayt.jpg
Перенаправлення портів також можна використовувати, щоб прокинути порт із зовнішньої IP-адреси мережної карти на порт віртуальної машини, запущеної на цьому ж комп'ютері. У Hyper-V такий прокид порту можна налаштувати на віртуальному комутаторі (див. нижче).

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
hyper-v-komanda-new-vmswitch.png
hyper-v-komanda-new-vmswitch.png (6.38 Кіб) Переглянуто 15193 разів
Введіть IP адресу для нового віртуального комутатора:

Код: Виділити все

New-NetIPAddress  -IPAddress 192.168.10.1  -PrefixLength 24  -InterfaceAlias "vEthernet (NAT_Switch)"
Увімкніть NAT для цієї мережі:

Код: Виділити все

New-NetNat -Name NATNetwork -InternalIPInterfaceAddressPrefix 192.168.10.0/24
Підключіть ВМ до вашого комутатора NAT_Switch і задайте для неї статичну IP адресу (наприклад, 192.168.10.80). Як шлюз за-замовчуванням, потрібно вказати IP адресу віртуального комутатора Hyper-V (192.168.10.1).

Тепер можна налаштувати перенаправлення порту з хоста Hyper-V у віртуальну машину:

Код: Виділити все

Add-NetNatStaticMapping -NatName NATNetwork443  -Protocol TCP  -ExternalIPAddress 0.0.0.0/24  -ExternalPort 443  -InternalIPAddress 192.168.10.80  -InternalPort 443
Після виконання цих команд весь HTTPS трафік, який приходить на порт TCP/443 гіпервізора, буде переправлений на сірий IP адресу віртуальної машини.

Якщо ви бажаєте перенаправити нестандартний порт, не забудьте відкрити його у Windows Firewall:

Код: Виділити все

New-NetFirewallRule -DisplayName "HyperV_Nat_443" -Direction Inbound -LocalPort 443 -Protocol TCP -Action Allow -Enabled True
Повний список правил NAT на хості Hyper-V можна вивести так:

Код: Виділити все

Get-NetNat
Правила форуму :: Виконую послуги IT-адміністратора (види послуг).