Бізнес хоче «просто RDP», бо це знайоме, швидке й працює з кожною старою Windows‑річчю, яка не хоче вмирати.
Безпека хоче «жодних публічних портів», бо вони бачили, що інтернет робить з відкритим 3389. Ви застрягли посередині з pager‑ом в руці.
Хороша новина: ви можете мати віддалений робочий стіл, який відчувається як RDP, не дозволяючи RDP торкатися публічного інтернету.
Погана новина: потрібно дисципліновано ставитися до мережевих меж, ідентичності та діагностики — бо коли щось ламається, воно ламається о 2 ночі.
Мета: RDP залишається приватним
Основне правило сором’язливо просте: RDP ніколи не повинен бути доступним з публічного інтернету.
Не «добре, якщо ми обмежимо швидкість». Не «добре, якщо ми змінили порт». Не «добре, бо ми маленькі».
Він має бути нероутованим ззовні. Крапка.
Замість цього користувачі встановлюють захищений тунель до офісної мережі — зазвичай VPN — і тільки тоді ініціюють RDP до внутрішніх хостів.
Це дає вам одну контрольну точку для автентифікації, MFA, контролю пристроїв і логування. А також одне місце, де все може зламатися,
що, чесно кажучи, краще, ніж ламатися скрізь.
Якщо вас тягне опублікувати 3389 через «тимчасове» правило фаєрвола, пам’ятайте: тимчасові правила живуть так само, як незаклеєні контейнери в офісному холодильнику.
Факти та історичний контекст (чому сьогоднішня каша виглядає так)
- RDP існує з кінця 1990‑х, еволюціонувавши з Terminal Services Microsoft; він проєктувався для керованих мереж, а не ворожих інтернет‑країв.
- TCP/3389 став магнітом для сканування одразу, як масове сканування інтернету стало дешевим; «безпека шляхом затемнення порту» ніколи цього не вирішувала.
- Network Level Authentication (NLA) введено, щоб перемістити автентифікацію раніше у потік з’єднання, зменшуючи витрати ресурсів та частину площі атаки.
- BlueKeep (CVE-2019-0708) нагадав усім, що баги в RDP до автентифікації можуть бути червоточними; це не перший і не останній випадок.
- Кіберзлочинці операціоналізували RDP‑брутфорс, бо це прямий і прибутковий шлях: одна облікова запис = один десктоп = латеральний рух.
- VPN змінилися з «лише мережевої труби» на «вхід для ідентичності» з ростом віддаленої роботи; багато організацій досі ставляться до них як до тупих тунелів.
- Split tunneling став популярним щоб зменшити навантаження на канал та уникнути hairpinning, і також нелюбим інженерами інцидентів, яким подобається страждати.
- RD Gateway існує, бо сирий RDP незручний у масштабі: він дає центральну політику і HTTPS‑транспорт, але це все одно публічний сервіс, який треба патчити й моніторити.
- Сучасний віддалений доступ сходиться до Zero Trust патернів: стан пристрою + доступ по застосункам; VPN+RDP можна наблизити до цього, якщо діяти суворо.
Еталонна архітектура: VPN спочатку, RDP потім
Ось архітектура, яка найчастіше виживає аудити та реальних атакуючих:
- VPN‑точка на захищеному шлюзі (або парі, якщо ви цінуєте сон), відкрита в інтернет на одному порту (наприклад UDP/51820 для WireGuard).
- Сильна автентифікація: сертифікати/ключі плюс MFA (або VPN, що інтегрується з IdP). Якщо не можете ввести MFA — робота не завершена.
- RDP лише для внутрішньої мережі: RDP слухає лише LAN/VPN інтерфейси; правила фаєрвола обмежують джерела підмережами VPN і тільки авторизованими jump‑host.
- Сегментація: користувачі можуть дістатися лише до тих хостів, які їм потрібні. «VPN користувачі мають доступ до всього /16» — це навчання рансомверу бігти швидко.
- Логування: підключення/відключення VPN, входи RDP і адміністративні дії централізовані. Якщо не можете відповісти «хто отримав доступ до хоста X о часі Y», ви гадаєте.
- Опційно jump‑box / бастіон: один або невеликий пул Windows jump‑host з жорсткими політиками. Користувачі RDP до jump‑host, потім до внутрішніх цілей.
Чому jump‑host часто — дорослий вибір
Jump‑host здаються старомодними, але вони нав’язують чисту межу: VPN приводить вас до jump‑host, а jump‑host — до всього іншого.
Це означає менше машин з увімкненим RDP, менше членств у групі «Remote Desktop Users», і менше машин, що мають справу зі всякими клієнтськими проблемами RDP.
Вони також централізують логування. Windows може логувати активність RDP на кожному хості, звісно, але консолідація доступу через невелику кількість хостів робить вашу хронологію інциденту
менш схожою на полювання за скарбами і більш схожною на розслідування.
Складні рішення: VPN vs RD Gateway vs обидва
VPN + внутрішній RDP (фокус тут)
Найкраще, коли ви контролюєте клієнтські пристрої, можете чисто розгорнути конфігурацію VPN і хочете, щоб RDP лишався внутрішнім.
Це «не відкривати RDP в інтернет» у найчистішому вигляді: єдиний публічний компонент — це VPN‑ендпоінт.
RD Gateway (RDP поверх HTTPS)
RD Gateway обгортає RDP в HTTPS (TCP/443), що корисно в мережах з жорсткими обмеженнями.
Воно централізує авторизацію і може зменшити потребу в повному мережевому доступі. Але це публічний сервіс: його треба патчити, моніторити
і захищати як будь‑який інший інтернет‑орієнтований сервер.
Обидва (так, інколи)
Деякі організації ставлять RD Gateway за VPN. Це звучить надмірно, поки не зіткнетеся з:
(1) підрядниками, які мають доступ лише до підмножини десктопів,
(2) потребою умовного доступу на кількох рівнях,
(3) режимами відповідності, які люблять defense‑in‑depth, коли він справді налаштований правильно.
Моє думка: якщо ви невелика‑середня організація і можете надійно розгорнути VPN‑клієнти, VPN + jump‑host дає найкращий баланс витрат і безпеки.
Якщо у вас багато некерованих клієнтських пристроїв, розгляньте RD Gateway з серйозним загартуванням — або краще, модель доступу по застосунку, що уникає широкого мережевого доступу.
Реалізація: WireGuard для офісного VPN (практично, швидко, нудно)
WireGuard не чарівний. Проте він освіжаюче компактний, швидкий і простіший для розуміння порівняно зі старими VPN‑стеками.
Якщо ви керуєте продакшен‑системами, «легко зрозуміти» — це функція, яку можна виправдати в бюджетній таблиці.
План мережі (не імпровізуйте в проді)
- VPN‑підмережа: 10.44.0.0/24 (тут живуть клієнти)
- Офісний LAN: 10.10.0.0/16 (сервери/десктопи тут)
- WireGuard сервер: 10.44.0.1
- Jump‑host: 10.10.20.10–10.10.20.20
Базове загартування сервера
Розмістіть VPN‑ендпоінт на виділеній VM або апараті, не на файловому сервері, не на контролері домену і точно не на «тій одній коробці під чиєюсь столом».
Тримайте ОС лаконічною. Патчіть її. Обмежте вхідні порти до порту VPN і SSH з довірених діапазонів адміністраторів.
Закрити RDP на Windows (щоб воно поводилося)
Увімкнути RDP легко. Увімкнути RDP безпечно — отут починається торг.
Ви хочете: увімкнений NLA, сучасний TLS, розумні таймаути, обмежений склад груп, і скоуп фаєрвола обмежений підмережею VPN (і, можливо, підмережею jump‑host).
Також: відключіть «на всяк випадок» адмінські акаунти. Використовуйте окремі адміністративні ідентичності. Логуйте. Якщо не можете логувати — не зможете захищатися.
Фаєрвол і сегментація (де більшість команд програють)
VPN — це не магічне покривало безпеки. Це подія маршрутизації. Якщо VPN‑клієнти можуть роутити до всього,
то скомпрометований ноутбук також може роутити до всього. Ваші правила фаєрвола мають відображати роль, а не мережеву топологію, яку ви успадкували.
Мінімальна позиція фаєрвола
- VPN‑клієнти можуть досягати лише jump‑host по TCP/3389.
- Адміни можуть мати доступ до management‑портів (WinRM, SSH тощо) з відведених адмінських підмереж.
- Блокуйте east‑west RDP, крім випадків явної потреби.
- Логуйте відмови від VPN‑підмережі. Не назавжди, але достатньо довго для розслідування інцидентів.
Split tunneling: вибирайте обережно
Split tunneling означає, що лише частина трафіку йде через VPN; решта йде безпосередньо в інтернет.
Це добре для пропускної здатності і жахливо для припущень. Якщо ваша модель безпеки ґрунтується на «VPN = довірена мережа», split tunneling це зламає.
Якщо ви мусите використовувати split tunneling, ставтеся до VPN‑клієнтів як до напівворожих: обмежте, що вони можуть досягати, вимагайте MFA і логування з агресивністю.
Ідентичність: MFA, стан пристрою та міф «довіреного VPN»
Доступ до VPN — це не ідентичність. Це з’єднання. Ідентичність — це: хто цей користувач, з якого пристрою, з якою довірою, і чи досі він заслуговує доступу прямо зараз?
Якщо ваш VPN підтримує SSO і умовний доступ — використовуйте це. Якщо ні — компенсуйте: короткоживучі облікові дані, персональні ключі для користувачів і окремий MFA‑шлюз.
Для самого RDP уникайте локальних акаунтів, де це можливо. Прив’язуйте його до директорійних ідентичностей і контролюйте членство в групі «Remote Desktop Users».
Парафразована ідея від Werner Vogels (CTO Amazon): «Все ламається, весь час». Будуйте віддалений доступ так, ніби відмова — це звична ситуація.
Бо так і є.
Логування та моніторинг: доведіть хто що зробив
Вам потрібні дві хронології: хронологія VPN (хто підключився, звідки, з якого пристрою) і Windows‑хронологія (хто ввійшов, куди і який тип сесії).
Помістіть їх в одне місце. Корелюйте по імені користувача, IP‑адресі (VPN IP) і часу.
На Windows вас цікавлять події входу (interactive vs remote interactive), невдалі входи, блокування акаунтів і зміни членства в групах.
На VPN‑шлюзі — успішні/невдалі рукопотискання, зміни конфігурації і аномалії трафіку.
Практичні завдання: 12+ команд, виходи та рішення
Це ті завдання, які я реально виконую, коли будую або налагоджую VPN+RDP у продакшені. Кожне містить: команду, що означає її вихід, і яке рішення далі приймати.
Команди показані з Linux VPN‑шлюзу, коли потрібно. Для перевірок Windows я використовую PowerShell на Windows‑хості, але викликаю його з bash через SSH або management‑шелл.
Завдання 1: Підтвердити інтерфейс WireGuard і рукопотискання peer
cr0x@server:~$ sudo wg show
interface: wg0
public key: 6xk2n3m...redacted
listening port: 51820
peer: uRk9hQ...redacted
endpoint: 198.51.100.24:53312
allowed ips: 10.44.0.10/32
latest handshake: 1 minute, 12 seconds ago
transfer: 148.32 MiB received, 210.77 MiB sent
persistent keepalive: every 25 seconds
Значення: «latest handshake» каже, що тунель живий; лічильники трафіку показують, що пакети передаються.
Рішення: Якщо рукопотискання «never» або дуже старе, припиніть звинувачувати RDP. Спочатку виправте доступність VPN, ключі, NAT або фаєрвол.
Завдання 2: Перевірити, чи сервер слухає порт VPN
cr0x@server:~$ sudo ss -lunpt | grep 51820
udp UNCONN 0 0 0.0.0.0:51820 0.0.0.0:* users:(("wg-quick",pid=1123,fd=6))
Значення: UDP 51820 прив’язаний на всіх інтерфейсах.
Рішення: Якщо нічого не слухає, служба WireGuard не запущена або прив’язана неправильно. Виправте сервіс і конфіг до подальших дій.
Завдання 3: Підтвердити IP‑форвардінг на VPN‑шлюзі (Linux)
cr0x@server:~$ sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1
Значення: Шлюз може маршрутизувати пакети між інтерфейсами.
Рішення: Якщо 0, клієнти VPN можуть підключатися, але не дістатися до LAN‑хостів. Увімкніть форвардінг і зробіть це персистентним.
Завдання 4: Перевірити таблицю маршрутів для VPN‑підмережі і шляху до LAN
cr0x@server:~$ ip route
default via 203.0.113.1 dev eth0
10.10.0.0/16 via 10.10.0.1 dev eth1
10.44.0.0/24 dev wg0 proto kernel scope link src 10.44.0.1
Значення: Шлюз знає, де LAN, і що wg0 володіє VPN‑підмережею.
Рішення: Якщо шлях до LAN відсутній або неправильний, трафік клієнта VPN буде зникати в нікуди. Виправте маршрути перед тим, як чесати Windows.
Завдання 5: Перевірити, чи фаєрвол дозволяє вхідний WireGuard і блокує публічний RDP
cr0x@server:~$ sudo nft list ruleset | sed -n '1,120p'
table inet filter {
chain input {
type filter hook input priority 0; policy drop;
ct state established,related accept
iif "lo" accept
tcp dport 22 ip saddr 203.0.113.50 accept
udp dport 51820 accept
tcp dport 3389 drop
}
}
Значення: VPN дозволено; RDP на самому шлюзі явно відкидається (приємне «ремінь і підтяжки»).
Рішення: Якщо бачите правило accept для tcp/3389 на публічному інтерфейсі — приберіть його. Не торгуйтеся з майбутніми інцидентами.
Завдання 6: Тест досяжності від шлюзу до Windows jump‑host на 3389
cr0x@server:~$ nc -vz 10.10.20.10 3389
Connection to 10.10.20.10 3389 port [tcp/ms-wbt-server] succeeded!
Значення: Jump‑host досяжний і порт RDP відкритий з погляду мережі шлюзу.
Рішення: Якщо не вдається, ймовірно Windows Firewall, мережеві ACL або проблеми маршрутизації між шлюзом і підмережею jump.
Завдання 7: Тест досяжності від VPN‑IP клієнта до jump‑host (імітація зі шлюзу)
cr0x@server:~$ sudo nft add rule inet filter forward ip saddr 10.44.0.0/24 ip daddr 10.10.20.10 tcp dport 3389 counter accept
cr0x@server:~$ sudo nft list chain inet filter forward
table inet filter {
chain forward {
type filter hook forward priority 0; policy drop;
ip saddr 10.44.0.0/24 ip daddr 10.10.20.10 tcp dport 3389 counter packets 0 bytes 0 accept
}
}
Значення: Ви створили явне правило allow для VPN‑клієнтів до RDP jump‑host з лічильниками.
Рішення: Використовуйте лічильники, щоб підтвердити, що трафік потрапляє в правило. Якщо лічильники лишаються 0 під час спроби підключення — трафік не доходить до цієї машини (маршрутизація/NAT/налаштування клієнта).
Завдання 8: Підтвердити, що Windows має увімкнений RDP і вимагання NLA (PowerShell на jump‑host)
cr0x@server:~$ ssh admin@10.10.20.10 'powershell -NoProfile -Command "Get-ItemProperty -Path \"HKLM:\System\CurrentControlSet\Control\Terminal Server\" -Name fDenyTSConnections; Get-ItemProperty -Path \"HKLM:\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp\" -Name UserAuthentication"'
fDenyTSConnections : 0
PSPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Terminal Server
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control
PSChildName : Terminal Server
PSDrive : HKLM
PSProvider : Microsoft.PowerShell.Core\Registry
UserAuthentication : 1
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
Значення: fDenyTSConnections=0 означає, що RDP увімкнено; UserAuthentication=1 означає, що вимагається NLA.
Рішення: Якщо NLA вимкнено — увімкніть його, якщо немає документованої причини й плану працювати без нього.
Завдання 9: Перевірити скоуп правила Windows Firewall для RDP (щоб не було «Any»)
cr0x@server:~$ ssh admin@10.10.20.10 'powershell -NoProfile -Command "Get-NetFirewallRule -DisplayGroup \"Remote Desktop\" | Get-NetFirewallAddressFilter | Select-Object Name,RemoteAddress | Format-Table -AutoSize"'
Name RemoteAddress
---- -------------
RemoteDesktop-UserMode-In-TCP Any
RemoteDesktop-UserMode-In-UDP Any
RemoteDesktop-Shadow-In-TCP Any
Значення: «Any» у полі RemoteAddress означає, що будь‑хто, хто може роутити до цього хоста, може спробувати RDP.
Рішення: Змініть скоуп на підмережу VPN (10.44.0.0/24) і/або тільки на підмережу jump‑host. «Any» — ок для лабораторії; у проді це лінощі.
Завдання 10: Перевірити, що RDP не відкритий публічно (зовнішнє сканування з публічної сторони шлюзу)
cr0x@server:~$ nmap -Pn -p 3389 203.0.113.10
Starting Nmap 7.94 ( https://nmap.org ) at 2025-12-28 15:42 UTC
Nmap scan report for 203.0.113.10
Host is up (0.012s latency).
PORT STATE SERVICE
3389/tcp closed ms-wbt-server
Nmap done: 1 IP address (1 host up) scanned in 0.21 seconds
Значення: Closed тут — добре. «Filtered» теж прийнятний (часто навіть краще), залежно від політики.
Рішення: Якщо порт відкритий — зупиніться. Виправте perimeter‑фаєрвол/NAT негайно. Не продовжуйте, поки 3389 недоступний з інтернету.
Завдання 11: Перевірити поведінку DNS для VPN‑клієнтів (хитра причина «RDP не працює»)
cr0x@server:~$ dig +short jump01.corp.example A @10.10.0.53
10.10.20.10
Значення: Внутрішній DNS розв’язує jump‑host у внутрішню IP‑адресу.
Рішення: Якщо VPN‑клієнти використовують публічні DNS, вони можуть розв’язувати публічний запис або нічого. Виправте push DNS через VPN або політику резолвера клієнта.
Завдання 12: Підтвердити, що клієнт може маршрутувати до LAN через VPN (зі шлюзу інспектуйте conntrack)
cr0x@server:~$ sudo conntrack -L | grep 10.44.0.10 | head
tcp 6 431999 ESTABLISHED src=10.44.0.10 dst=10.10.20.10 sport=53422 dport=3389 src=10.10.20.10 dst=10.44.0.10 sport=3389 dport=53422 [ASSURED] mark=0 use=1
Значення: TCP‑сесія RDP існує через шлюз; пакети течуть і відслідковуються.
Рішення: Якщо не бачите established flow під час спроби користувача підключитися, проблема раніше в ланцюжку (налаштування клієнта, маршрути, фаєрвол).
Завдання 13: Перевірити MTU/фрагментацію (класичне «VPN працює, а RDP жахливий»)
cr0x@server:~$ ping -c 3 -M do -s 1372 10.44.0.10
PING 10.44.0.10 (10.44.0.10) 1372(1400) bytes of data.
1380 bytes from 10.44.0.10: icmp_seq=1 ttl=64 time=34.2 ms
1380 bytes from 10.44.0.10: icmp_seq=2 ttl=64 time=33.5 ms
1380 bytes from 10.44.0.10: icmp_seq=3 ttl=64 time=33.9 ms
--- 10.44.0.10 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2004ms
rtt min/avg/max/mdev = 33.5/33.8/34.2/0.3 ms
Значення: Пакет 1400 байт з DF пройшов, що натякає, що MTU для цього шляху не явно зламаний.
Рішення: Якщо відповідає «Frag needed», налагодьте MTU WireGuard (зазвичай 1280–1420 залежно від uplink) і повторіть тест.
Завдання 14: Перевірити, що Windows‑події показують RDP‑входи (доведіть: це автентифікація, а не мережа)
cr0x@server:~$ ssh admin@10.10.20.10 'powershell -NoProfile -Command "Get-WinEvent -FilterHashtable @{LogName=\"Security\"; Id=4624} -MaxEvents 5 | Select-Object TimeCreated,Id,Message | Format-List"'
TimeCreated : 12/28/2025 3:41:02 PM
Id : 4624
Message : An account was successfully logged on.
...
Logon Type: 10
...
Значення: Logon Type 10 вказує на RemoteInteractive (RDP). У вас є доказ, що користувач дійсно дістався і пройшов автентифікацію на хості.
Рішення: Якщо користувачі скаржаться, але ви бачите успішні входи, проблема з продуктивністю сесії, завантаженням профілю, GPO або додатком — а не «VPN впав».
Завдання 15: Перевірити невдалі входи та блокування (брутфорс або людська помилка)
cr0x@server:~$ ssh admin@10.10.20.10 'powershell -NoProfile -Command "Get-WinEvent -FilterHashtable @{LogName=\"Security\"; Id=4625} -MaxEvents 5 | Select-Object TimeCreated,Id,Message | Format-List"'
TimeCreated : 12/28/2025 3:39:11 PM
Id : 4625
Message : An account failed to log on.
...
Status: 0xC000006D
Sub Status: 0xC000006A
...
Значення: Substatus 0xC000006A зазвичай вказує на неправильний пароль. Повторювані події можуть сигналити про брутфорс або користувача з «липкими» паролями (людський фактор).
Рішення: Якщо це реальний користувач — скиньте пароль або виправте збережені облікові дані. Якщо невідомо — розслідуйте джерело IP (VPN IP), вимкніть акаунт і шукати латеральний рух.
Завдання 16: Перевірити, що служба RDP здорова і слухає на Windows
cr0x@server:~$ ssh admin@10.10.20.10 'powershell -NoProfile -Command "Get-Service TermService | Format-Table Status,Name,DisplayName -AutoSize; netstat -ano | findstr \":3389\""'
Status Name DisplayName
------ ---- -----------
Running TermService Remote Desktop Services
TCP 0.0.0.0:3389 0.0.0.0:0 LISTENING 1204
Значення: Служба RDP запущена і порт слухає.
Рішення: Якщо служба зупинена або порт не слухає — ви не женетеся за VPN‑примарами, ви лагодите хост.
Швидкий план діагностики (знайти вузьке місце швидко)
Коли віддалений робочий стіл «не працює», найшвидший шлях — припинити трактувати його як одну систему. Це чотири системи в одному плащі:
клієнтський пристрій, VPN, мережевий шлях і Windows‑сесія.
Перш за все: чи тунель VPN дійсно підключений?
- На шлюзі:
wg showі перевірити «latest handshake». - На клієнті: підтвердити, що він має VPN IP (наприклад 10.44.0.x) і маршрути для внутрішніх підмереж.
- Рішення: Якщо рукопотискання застаріло, виправляйте доступність VPN (NAT, ключі, блокування UDP). Не чіпайте Windows перш ніж це не вирішено.
Друге: чи можете ви дістатися jump‑host по IP на 3389?
- Зі шлюзу або тестового клієнта в VPN:
nc -vz 10.10.20.10 3389. - Рішення: Якщо порт закритий — це фаєрвол або стан сервісу. Якщо відкритий — рухаємося далі.
Третє: це DNS, автентифікація чи налаштування сесії?
- DNS:
dig jump01...і порівняйте з очікуваною внутрішньою IP. - Автентифікація: перевірте Windows Security логи на 4624/4625 близько часу спроби.
- Продуктивність сесії: якщо вхід успішний, але інтерфейс непридатний — підозрюйте MTU, packet loss, завантаження профілю, роумінг профілів або GPO‑скрипти.
Четверте: якщо повільно — вимірюйте мережу, не гадати
- Ping з DF і розмірені пакети, щоб виявити MTU.
- Подивіться на лічильники WireGuard і помилки інтерфейсу.
- Рішення: Якщо затримка в нормі, але UI лагає — підозрюйте CPU/RAM/Disk на сервері (так, сховище може вбити RDP).
Типові помилки: симптом → корінь → виправлення
1) Симптом: «RDP працює в офісі по Wi‑Fi, але не працює віддалено»
Корінь: Правила RDP у фаєрволі дозволяють LAN‑підмережі, але не VPN‑підмережі; або маршрути VPN не штовхаються.
Виправлення: Стисніть скоуп Windows Firewall «Remote Desktop», щоб включити 10.44.0.0/24, і переконайтеся, що сервер VPN штовхає маршрути LAN клієнтам.
2) Симптом: «VPN підключається, але RDP по hostname падає; по IP працює»
Корінь: DNS не налаштований для VPN‑клієнтів, або split tunneling відправляє DNS‑запити на публічні резолвери.
Виправлення: Штовхайте внутрішні DNS‑сервери через конфіг VPN; перевіряйте через dig внутрішній DNS і налаштування резолвера клієнта.
3) Симптом: «RDP запитує облікові дані знову і знову»
Корінь: Невідповідність NLA, розбіжність часу, що впливає на Kerberos, або використання локальних акаунтів з політиками, що блокують віддалений вхід.
Виправлення: Вимагайте NLA, переконайтеся, що клієнти його підтримують, виправте синхронізацію часу (NTP) і використовуйте доменні акаунти з правильним членством у групах.
4) Симптом: «RDP підключається, але жахливо повільний, особливо введення»
Корінь: MTU/фрагментація через VPN, packet loss або bufferbloat на uplink.
Виправлення: Тест DF ping; налаштуйте MTU WireGuard; додайте QoS/traffic shaping; уникайте VPN hairpinning коли можливо.
5) Симптом: «Випадкові роз’єднання кожні кілька хвилин»
Корінь: Таймаути NAT і відсутність keepalive для клієнтів за NAT; нестабільний Wi‑Fi; агресивні таймаути стану в фаєрволі.
Виправлення: Увімкніть persistent keepalive для WireGuard клієнтів за NAT; розслідуйте поведінку фаєрволу/ISP; віддавайте перевагу дротовому з’єднанню де можливо.
6) Симптом: «Всі можуть RDP куди завгодно, коли в VPN»
Корінь: Плоска мережа + дозволяючі правила фаєрвола + широке членство в AD групах.
Виправлення: Впровадьте сегментацію: VPN‑клієнти до jump‑host лише; least‑privilege групи для RDP; deny‑by‑default правила форвардингу.
7) Симптом: «Безпека просить ротацію ключів щотижня, а тепер нічого не працює»
Корінь: Ротація без автоматизації; клієнти не синхронізовані; застарілі peer‑конфіги.
Виправлення: Автоматизуйте провізіювання/ротацію; використовуйте короткоживучі креденшіали де можливо; версіонуйте конфіги і розгортайте через MDM.
Три корпоративні міні‑історії (бо шрами вчать)
Міні‑історія 1: Інцидент через неправильне припущення
Середня компанія розгорнула VPN, щоб «виправити» віддалений доступ. Вони зробили базу: WireGuard сервер, ключі користувачів, чиста підмережа.
Команда припустила, що оскільки користувачі мають автентифікацію в VPN, все позаду нього «внутрішнє» і отже безпечно.
Вони залишили правила Windows Firewall для RDP за замовчуванням («Any»), і внутрішня мережа була в основному плоскою.
Helpdesk тішився: менше тикетів. Команда безпеки не помітила, бо технічно нічого не було «видно в інтернеті».
Потім ноутбук підрядника був скомпрометований через браузерний експлойт. Атакуючому не потрібно було сканувати інтернет.
Вони підключилися до VPN через вже налаштований клієнт підрядника, опинилися в VPN‑підмережі і відразу почали сканувати внутрішній RDP.
Після кількох слабких паролів вони здобули десктоп з доступом до файлових шар і деяких адмінських інструментів.
Пост‑інцидентна зустріч була різкою. Проблема не в WireGuard. Проблема в припущенні «VPN = довірено».
Виправлення було нецікаве: обмежити трафік VPN до jump‑host, вимагати MFA і звузити правила RDP у фаєрволі до конкретних джерел.
Безпека отримала контроль. Helpdesk — новий скрипт. Усі отримали довший on‑call runbook.
Міні‑історія 2: Оптимізація, яка відплатилася
Інша організація мала скарги: «RDP повільний». Вони подивилися графіки навантаження VPN і вирішили, що split tunneling «зменшить навантаження».
Вони запровадили зміну у п’ятницю вдень (звісно), щоб тільки 10.10.0.0/16 ішов через VPN; все інше — локально.
У понеділок: половина користувачів не могла RDP по hostname. Друга половина могла підключитися, але стикалася з дивними запитами автентифікації.
Це не було випадковим. Деякі домашні мережі перехоплювали DNS. Декому ISP‑резолвери «помагали». Дехто мав старі кешовані корпоративні записи.
Гірше: підмножина користувачів отримала RDP‑сесії, тоді як їхній загальний інтернет‑трафік обминув корпоративні контролі.
Малвар на домашньому роутері отримав чистіший шлях до command‑and‑control, в той час як інфікований пристрій все ще мав маршрут у корпоративний LAN через VPN.
Це той рядок, який не хочеться писати в пост‑інцидентному звіті.
Вони відкотили split tunneling для більшості користувачів і повернули його лише для вузької групи з керованими кінцевими точками і суворими ACL.
Продуктивність покращилася пізніше, але не через split tunneling. Вона покращилася, бо вони виправили MTU і впровадили QoS на офісному uplink.
«Оптимізація» не була поганою у теорії. Вона була невдатною в контексті.
Міні‑історія 3: Нудна, але правильна практика, що врятувала день
Регульована компанія виконувала віддалений доступ через VPN + невеликий пул Windows jump‑host.
Щоквартально вони робили щось, що виглядало як паперова робота: переглядали членства груп для віддаленого доступу,
перевіряли скоупи фаєрвола і тестували, що порти RDP не доступні зовні.
Під час однієї перевірки інженер помітив, що додали нову підмережу для лабораторного середовища.
Команда маршрутизації випадково широко оголосила її, і дозволяюче правило фаєрвола означало, що VPN‑клієнти тепер могли напряму дістатися до лабораторних серверів.
Лабораторні сервери, природно, були «тимчасовими», «експериментальними» і патчувалися за графіком, який краще описувати як «аспіраційний».
Вони виправили це до того, як стало цікаво: звузили forward‑правила, оновили групи адрес і вимагали доступ до лабораторії через окремий jump‑host з додатковим контролем.
Через два тижні вийшла вразливість для UI управління гіпервізором лабораторії. Лабораторію просканували. Нічого не сталося.
Найкращий інцидент — той, що ніколи ним не стає, і його майже завжди запобігає хтось, хто робить нудні речі навмисно.
Перевірочні списки / покроковий план
Покроковий план для безпечного розгортання VPN + RDP
- Виберіть модель віддаленого доступу: VPN + jump‑host для більшості організацій; RD Gateway, якщо потрібен доступ по застосунку без повного мережевого маршруту.
- Виділіть підмережі: окрема підмережа для VPN‑клієнтів; не перевикористовуйте LAN‑діапазони, або пошкодуєте в кав’ярнях і готелях.
- Побудуйте VPN‑шлюз: загартована ОС, мінімум сервісів, pipeline патчів, управління конфігурацією.
- Впровадьте deny‑by‑default форвардінг: лише дозволи VPN‑клієнтам до jump‑host на 3389 (і DNS якщо потрібно).
- Розгорніть jump‑host: невеликий пул, жорсткий базовий образ, обмежений адмінський доступ, увімкнене логування.
- Закрийте RDP на цілях: увімкніть NLA, обмежте скоуп фаєрвола, відключіть застарілі шифри де можливо, тримайте ОС патченою.
- Додайте MFA: на вході в VPN, і бажано також на вході в Windows через умовний доступ або еквівалентні контролі.
- Централізуйте логи: логи VPN + Windows Security + фаєрволів в одному місці з ретеншеном, що відповідає ризику.
- Постійно перевіряйте «немає публічного RDP»: заплановані зовнішні сканування або моніторинг з контрольованої точки.
- Задокументуйте швидку діагностику: шлях on‑call має займати хвилини, а не розкопки в Slack історії.
Операційний чеклист (щотижневий/щомісячний)
- Підтвердити, що 3389 не відкритий на публічних IP (скан ззовні).
- Переглянути список peer‑ів VPN і видалити застарілі користувачі/пристрої.
- Перевірити членства «Remote Desktop Users» і локальних адміністраторів на jump‑host.
- Патчити jump‑host і VPN‑шлюзи за наявним реальним графіком.
- Вибірково перевіряти логи: невдалі автентифікації VPN, повторювані помилки RDP, незвичні гео‑джерела (якщо актуально).
- Протестувати реальне віддалене підключення з неофісної мережі.
Питання та відповіді
1) Чому відкривати RDP в інтернет — така велика проблема, якщо я використовую сильні паролі?
Тому що RDP — ціль високої цінності і постійно бомбардується сканами та credential stuffing.
Сильні паролі допомагають, але не усувають вразливості протоколу, некоректні налаштування або вкрадені креденшіали.
Найбезпечніший RDP — той, до якого інтернет не може дістатися.
2) Хіба зміна порту RDP не достатня?
Ні. Це зменшує шум від найледачіших сканерів, але не ризик від компетентних нападників.
Атакуючі сканують весь діапазон портів або фігурують сервіси. Не будуйте безпеку на надії, що вони занудьгують.
3) VPN виглядає як надання повного мережевого доступу користувачам. Чи можу я його обмежити?
Так, і вам потрібно це зробити. Deny‑by‑default форвардінг на VPN‑шлюзі плюс явні allow‑правила до jump‑host — стандартний підхід.
Якщо ваш продукт VPN підтримує ACL по користувачу — використовуйте їх. Якщо ні — сегментуйте по групах і підмережах.
4) Який транспорт VPN обрати: UDP чи TCP?
Віддавайте перевагу UDP де можливо (WireGuard — UDP). TCP‑over‑TCP може посилити латентність і проблеми з повторними передачами.
Якщо вас змушують використовувати TCP через captive‑мережі, розгляньте альтернативний шлях доступу, але не перебудовуйте все під готельний Wi‑Fi.
5) Чи потрібен RD Gateway, якщо у мене вже є VPN?
Не обов’язково. RD Gateway корисний, коли потрібен доступ RDP без повного мережевого маршруту, або коли клієнтські середовища блокують VPN.
Але це ще один публічний сервіс для операцій. Якщо VPN можна розгорнути — VPN + jump‑host простіше і зазвичай безпечніше.
6) Як зупинити скомпрометований VPN‑клієнт від сканування LAN?
Не дозволяйте йому цього. Впровадьте правила фаєрвола, щоб VPN‑клієнти могли досягати лише конкретних цілей і портів (зазвичай jump‑host на 3389).
Логуйте відмови. Розгляньте окремі VPN‑пули для адміністраторів. Ставтеся до клієнтів як до недовірених, поки не доведено протилежне.
7) RDP повільний лише через VPN. Яка найпоширеніша причина?
MTU‑проблеми і packet loss — головні підозрювані. RDP інтерактивний; невеликі затримки відчуваються величезними.
Тестуйте DF ping, налаштуйте MTU VPN, перевірте завантаження лінії. Також перевіряйте сервер: диск і завантаження профілю можуть імітувати «мережеву» повільність.
8) Чи можна покладатися лише на Windows Firewall?
Можна, але краще не робіть цього. Defense‑in‑depth має значення: perimeter‑фаєрвол/NAT, ACL на VPN‑шлюзі і скоупи Windows Firewall.
Windows Firewall — корисний, але одна політика на помилку від «Any».
9) Що робити з постачальниками/підрядниками, яким потрібен тимчасовий доступ?
Давайте їм доступ до виділеного jump‑host з обмеженим набором інструментів і тимчасовими обліковими даними.
Уникайте надання широких маршрутів через VPN. Логуйте їхні сесії. Видаляйте доступ автоматично після завершення контракту (нагадування в календарі — це не автоматизація).
10) Чи достатньо MFA на VPN, чи потрібно MFA на Windows також?
MFA на VPN — мінімум. MFA на Windows (або умовний доступ на рівні сесії) — кращий варіант, особливо для привілейованих користувачів.
Мета — зробити так, щоб викрадені креденшіали VPN були недостатні для доступу до чутливих десктопів або адміністративних сесій.
Висновок: наступні кроки, які ви дійсно можете зробити
Якщо ви хочете безпечний віддалений робочий стіл, перестаньте думати про RDP як про кінцевий продукт. Продукт — це контрольований доступ.
VPN — вхідні двері. Фаєрвол — коридор. Jump‑host — стійка рецепції. Логування — записи з камер, які знадобляться пізніше.
Наступні кроки, які реально змінять ситуацію цього тижня:
- Проскануйте публічні IP і підтвердіть, що TCP/3389 закритий/фільтрований у всіх місцях.
- Обмежте доступ RDP до VPN‑підмереж і бажано тільки до jump‑host.
- Увімкніть NLA і підтвердіть це в реєстрі/політиці.
- Додайте MFA для доступу до VPN і обмежте маршрути VPN до того, що користувачам справді потрібно.
- Централізуйте логи підключень VPN і входів Windows RDP, щоб відповідати на питання з доказами, а не відчуттями.
Другий жарт, бо ви це заслужили: Інтернет не «знаходить» відкритий порт RDP; він просто запам’ятовує, де ви живете.