Зміна порту прослуховування для віддаленого робочого стола на комп'ютері
При підключенні комп'ютера (клієнтської версії Windows або Windows Server) за допомогою клієнта віддаленого робочого столу функції віддаленого робочого стола на комп'ютері "чують" запит на з'єднання через порт прослуховування (за замовчуванням - 3389). Можна змінити порт прослуховування на комп'ютерах Windows шляхом зміни реєстру.
- Відкрийте редактор реєстру. (Введіть "regedit" у полі пошуку).
- Перейдіть до наступного підрозділу реєстру: HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp
- Знайдіть параметр PortNumber.
- Клацніть Редагувати > Змінити, а потім виберіть Десятичне.
- Введіть новий номер порту та натисніть кнопку ОК.
- Закрийте редактор реєстру та перезавантажте комп'ютер.
При черговому підключенні комп'ютера до цього комп'ютера за допомогою віддаленого робочого стола необхідно буде ввести новий номер порту. Якщо ви використовуєте брандмауер, переконайтеся, що у ньому дозволено підключення до нового номера порту.
Номер поточного порту можна перевірити за допомогою наступної команди PowerShell:
Get-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' -name "PortNumber"
PortNumber : 3389 PSPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations PSChildName : RDP-Tcp PSDrive : HKLM PSProvider : Microsoft.PowerShell.Core\Registry
Номер порту RDP можна змінити за допомогою наступної команди PowerShell. У цій команді вкажіть новий порт RDP 3390.
Щоб додати новий порт RDP до реєстру, виконайте таку команду:
$portvalue = 3390 Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' -name "PortNumber" -Value $portvalue New-NetFirewallRule -DisplayName 'RDPPORT Profile 'Public' -Direction Inbound -Action Allow -Protocol TCP -LocalPort $portvalue New-NetFirewallRule -DisplayName 'RDPPORTLatest-UDP-In' -Profile 'Public' -Direction Inbound -Action Allow -Protocol UDP -LocalPort $portvalue
Налаштування прокидання мережевих портів (порт форвардинг) у Windows
У всіх версіях 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 conectaddress=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
Щоб створити правило перенаправлення порту, запустіть командний рядок з правами адміністратора та виконайте команду:
netsh interface portproxy add v4tov4 listenport = 3340 listenaddress = 10.10.1.110 connectport = 3389
Де 10.10.1.110 – IP-адреса вашого комп'ютера, на якому налаштовується порт-форвардинг.
Тепер за допомогою утиліти netstat перевірте, що у Windows тепер слухається локальний порт 3340:
netstat-ano | findstr :3340
Примітка . Якщо ця команда нічого не повертає і перенаправлення портів через netsh interface portproxy не працює, перевірте, що у вас у Windows включена служба iphlpsvc (IP Helper/Допоміжна служба IP).
Перевірте стан служби в консолі services.msc або за допомогою PowerShell:
Також на мережному інтерфейсі, для якого створюється правило перенаправлення портів, повинна бути включена підтримка протоколу IPv6.
Це обов'язкові умови коректної роботи порт-форвардинга. Без служби IP Helper і без увімкненої підтримки IPv6 механізм перенаправлення не працює.
У Windows Server 2003 / XP для роботи перенаправлення додатково потрібно увімкнути параметр реєстру IPEnableRouter = 1 у гілці HKEY_LOCAL_MACHINE SystemCurrentControlSetservicesTcpipParameter. Цей параметр реєстру можна ввімкнути за допомогою PowerShell :
Set-ItemProperty -Path HKLM:systemCurrentControlSetservicesTcpipParameters -Name IpEnableRouter -Value 1
Ви можете визначити процес, який слухає вказаний локальний порт за його PID (у прикладі PID – 636):
tasklist | findstr 636
Тепер спробуйте підключитися на новий порт з віддаленого комп'ютера за допомогою будь-якого клієнта RDP. Як rdp-порт потрібно вказати 3340 (номер порту вказується після двокрапки після адреси rdp-сервера). Наприклад, , 10.10.1.110:3340
У цьому прикладі порт 3340 потрібно попередньо відкрити Windows Defender Firewall (див. наступний розділ статті).
RDP підключення має успішно встановити.
Правила прокидання портів portproxy є постійними і не видаляються під час перезавантаження Windows. Ці правила зберігаються у реєстрі. Можна вивести список правил перенаправлення netsh у реєстрі за допомогою PowerShell:
Get-ItemProperty -Path HKLM:SYSTEMCurrentControlSetServicesPortProxyv4tov4tcp
Якщо потрібно перенаправити вхідне з'єднання TCP на віддалений комп'ютер, використовуйте таку команду:
netsh interface portproxy add v4tov4 listenport=3389 listenaddress=0.0.0.0 connectport=3389 conectaddress=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:
Додано до ipv4: Connect to ipv4:_x000D_Address Port Address Port_x000D_--------------- ---------- ------------- -- ----------_x000D_10.10.1.110 3340 10.10.1.110 3389
Порада . Також ви можете вивести вагу правила перенаправлення портів у режимі portproxy так:
netsh interface portproxy dump
#========================_x000D_# Port Proxy configuration_x000D_#=================== =====_x000D_pushd interface portproxy_x000D_reset_x000D_add v4tov4 listenport=3340 conectaddress=10.10.1.110 connectport=3389_x000D_popd_x000D_# End of Port Proxy configuration
Якщо потрібно змінити налаштування наявного правила portproxy, використовуйте таку команду:
netsh interface portproxy set v4tov4 listenport=3340 listenaddress=10.10.1.110 connectport=3300 conectaddress=10.10.1.110
У цьому прикладі ми змінили адресу цільового порту portproxy на 3300.
Щоб видалити певне правило перенаправлення порту, виконайте:
netsh interface portproxy delete v4tov4 listenport=3340 listenaddress=10.10.1.110
Щоб видалити всі наявні правила перенаправлення та повністю очистити таблицю з правилами порт-форвардингу:
netsh interface portproxy reset
Важливо . Така схема перенаправлення працює лише для 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 conectaddress=$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
Тепер, якщо в браузері перейди за адресою https://localhost:9090 (потрібно ігнорувати помилки SSL_ERROR_BAD_CERT_DOMAIN), відкриється пошукова сторінка Google. Тобто.незважаючи на те, що браузер звертається до локального комп'ютера, у ньому відкривається сторінка із зовнішнього веб-сервера.
Перенаправлення портів також можна використовувати, щоб прокинути порт із зовнішньої 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
Введіть 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 можна вивести так: