Tối ưu và bảo mật RDP trên VPS Windows Server

VPS Windows Server vừa khởi tạo thường đã mở sẵn RDP ở cổng 3389, và trong vòng vài giờ bạn sẽ thấy hàng nghìn dòng log đăng nhập thất bại từ đủ dải IP lạ. Đó là lý do việc đầu tiên sau khi đăng nhập lần đầu không phải là cài phần mềm, mà là tối ưu và bảo mật RDP trước khi làm bất cứ thứ gì khác.
- RDP mặc định ở cổng 3389, là mục tiêu quét tự động phổ biến, nên đổi cổng chỉ giúp giảm nhiễu log chứ không thay thế được các lớp bảo vệ thật.
- Network Level Authentication (NLA) bắt xác thực trước khi cấp phiên đồ họa, chặn phần lớn bot không đủ khả năng bắt tay CredSSP.
- Chính sách khoá tài khoản sau N lần sai và giới hạn RDP theo IP là hai cấu hình đem lại hiệu quả rõ rệt nhất so với công sức bỏ ra.
Bài này áp dụng cho Windows Server 2022 và 2025, chạy trên VPS có quyền Administrator đầy đủ. Mọi thao tác đều làm qua kết nối RDP hiện tại, nhưng nguyên tắc bất di bất dịch là mở sẵn một phiên RDP thứ hai trước khi đổi bất cứ thứ gì, để còn đường lùi nếu cấu hình sai khiến bạn tự khoá mình ra ngoài.
Yêu cầu trước khi bắt đầu
- VPS Windows Server 2022 hoặc 2025, đã đăng nhập bằng tài khoản Administrator.
- Có quyền mở PowerShell với
Run as administrator. - Có sẵn công cụ quản trị console của nhà cung cấp, để vào được máy nếu RDP hỏng. Trên VPS Windows của thueVPS, đây là cách cứu hộ khi mọi thứ tắc.
- Một cổng TCP mới không trùng dịch vụ đang chạy, ví dụ 40222.
- Nếu RDP đi qua Internet công khai, cân nhắc dải IP bạn hay kết nối để giới hạn firewall ở bước cuối.
Vì sao RDP mặc định là lỗ hổng mở
Cổng 3389 lộ ra Internet sẽ bị quét trong vài phút sau khi máy online. Kẻ tấn công không cần khai thác lỗ hổng phức tạp; chúng chỉ cần thử tài khoản Administrator với danh sách mật khẩu rò rỉ. Mỗi lần đăng nhập sai đều tạo một sự kiện trong Security log, và nếu bạn không giới hạn số lần thử, bot cứ chạy mãi cho tới khi trúng.
RDP cũng ngốn tài nguyên khi bị dội liên tục. Dù phiên đăng nhập thất bại, dịch vụ TermService vẫn xử lý bắt tay, TLS negotiation và ghi log. Trên VPS cấu hình vừa phải, đợt quét dày có thể khiến CPU tăng vọt và phiên hợp lệ của bạn bị chậm. Vì vậy tối ưu RDP không chỉ là bảo mật mà còn là giữ hiệu năng ổn định.
Bước 1 - Đổi cổng RDP và cập nhật firewall
Nguyên tắc: đổi cổng trong registry trước, rồi mở cổng đó ở firewall, kiểm tra kết nối được rồi mới xoá rule cũ. Làm ngược thứ tự là tự đá mình ra ngoài.
Mở PowerShell với quyền Administrator và chạy:
Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' -Name 'PortNumber' -Value 40222
New-NetFirewallRule -DisplayName 'RDP-40222' -Direction Inbound -Protocol TCP -LocalPort 40222 -Action Allow -Profile Any
Restart-Service TermService -Force
Dòng đầu đổi cổng RDP sang 40222. Lệnh thứ hai tạo rule firewall cho cổng mới; mình giữ -Profile Any cho đơn giản, còn nếu máy trong mạng nội bộ thì giới hạn Domain/Private hẹp hơn. Lệnh cuối khởi động lại dịch vụ RDP, và nó sẽ ngắt phiên hiện tại. Đây là lý do bạn phải có phiên thứ hai hoặc console dự phòng.
Kiểm tra lại ngay:
Get-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' -Name 'PortNumber'
Get-NetFirewallRule -DisplayName 'RDP-40222' | Select-Object Enabled, Profile
Kết quả mong đợi: PortNumber : 40222 và rule ở trạng thái Enabled : True. Sau khi kết nối lại thành công bằng cổng mới, mới xoá rule cũ:
Remove-NetFirewallRule -DisplayName 'Remote Desktop - User Mode (TCP-In)'
Remove-NetFirewallRule -DisplayName 'Remote Desktop - User Mode (UDP-In)'
Nếu không tìm thấy rule tên như trên (tùy phiên bản), dùng Get-NetFirewallRule | Where-Object DisplayName -like '*Remote Desktop*' để liệt kê rồi xoá đúng cái đang mở 3389.
Bước 2 - Bật Network Level Authentication
NLA buộc client xác thực trước khi server cấp phiên đồ họa. Bot quét cổng phần lớn không vượt qua được bước CredSSP nên bị chặn trước khi chạm tới giao diện đăng nhập, giảm hẳn tải lên TermService.
Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' -Name 'UserAuthentication' -Value 1
Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' -Name 'SecurityLayer' -Value 2
UserAuthentication = 1 bật NLA, SecurityLayer = 2 yêu cầu TLS. Cả hai đều là mặc định trên Windows Server hiện đại, nhưng máy clone từ image cũ đôi khi bị tắt. Kiểm tra:
Get-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' | Select-Object UserAuthentication, SecurityLayer
Kết quả đúng là UserAuthentication : 1 và SecurityLayer : 2. Đảm bảo chứng chỉ RDP không phải chứng chỉ self-signed mặc định nếu client của bạn kiểm tra chặt; với RDP qua Internet, gán certificate thật hoặc để nguyên self-signed kèm cảnh báo là tùy mức độ khắt khe.
Bước 3 - Chính sách khoá tài khoản và giới hạn số phiên
Đây là lớp khiến brute force trở nên vô nghĩa. Khoá tài khoản sau vài lần sai nghĩa là tốc độ thử của bot hiếm khi đủ nhanh để đoán ra mật khẩu trong khoảng thời gian hợp lý.
net accounts /lockoutthreshold:5 /lockoutduration:30 /lockoutwindow:30
net accounts
Ý nghĩa: sai 5 lần thì khoá 30 phút, cửa sổ đếm 30 phút. Đừng đặt lockoutthreshold:0 (tắt khoá) vì đó là mời gọi brute force. Cũng đừng đặt quá thấp như 2, kẻo bạn gõ sai vài lần là tự khoá mình.
Tiếp theo, chặn người dùng ngắt phiên của nhau và đá phiên treo:
Set-ItemProperty -Path 'HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services' -Name 'fDenyTSConnections' -Value 0
Set-ItemProperty -Path 'HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services' -Name 'MaxInstanceCount' -Value 2
Set-ItemProperty -Path 'HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services' -Name 'fResetBroken' -Value 1
MaxInstanceCount = 2 giới hạn số phiên đồng thời, tránh việc kẻ xâm nhập mở thêm phiên song song. fResetBroken = 1 tự giải phóng phiên rớt mạng, tránh treo tài nguyên. Kiểm tra bằng:
qwinsta
query user
Lệnh qwinsta liệt kê phiên đang có kèm trạng thái Active hay Disc. Nếu thấy phiên lạ mà bạn không mở, xử lý ngay:
logoff
Bước 4 - Siết firewall theo dải IP và chặn tấn công tự động
Nếu bạn chỉ kết nối RDP từ một vài dải IP cố định (văn phòng, VPN, IP nhà mạng), giới hạn firewall theo IP là biện pháp mạnh nhất trong danh sách này. Kẻ tấn công quét cổng sẽ không thấy gì để tấn công.
$remote = @('203.0.113.10','198.51.100.0/24')
Set-NetFirewallRule -DisplayName 'RDP-40222' -RemoteAddress $remote
Thay danh sách IP bằng dải thật của bạn. Sau khi áp dụng, chỉ IP trong danh sách mới vào được RDP; mọi IP khác bị drop im lặng. Đây là lúc bạn cần phiên console dự phòng, vì nếu gõ sai dải IP là tự chặn mình.
Với VPS mà IP client hay đổi, dùng thêm chặn tự động dựa trên log:
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4625} -MaxEvents 20 | Select-Object TimeCreated, Message
Sự kiện 4625 là đăng nhập thất bại. Bạn có thể viết một scheduled task đọc 4625, thống kê IP nguồn và gọi New-NetFirewallRule -Action Block -RemoteAddress khi một IP vượt ngưỡng. Nếu không muốn tự viết, có thể dùng script cộng đồng kiểu RDPGuard, nhưng nhớ nó chạy với quyền hệ thống nên phải tin nguồn. Ngoài ra, chạy RDP sau một VPN như WireGuard để không lộ cổng RDP ra Internet là cách nhiều sysadmin chọn, đổi lại phải kết nối VPN trước mỗi lần vào máy.
Bước 5 - Tối ưu hiệu năng phiên RDP
Bảo mật xong thì tối ưu để phiên RDP mượt, không giật khi mạng chậm. Các tinh chỉnh dưới đây là per-user, không làm yếu bảo mật, chủ yếu giảm băng thông và độ trễ hiển thị.
Trong file .rdp ở phía client, thêm hoặc chỉnh:
networkautodetect:i:1
bandwidthautodetect:i:1
compression:i:1
connection type:i:6
videoplaybackmode:i:1
bitmapcachepersistenable:i:1
networkautodetect và bandwidthautodetect cho client tự điều chỉnh chất lượng theo mạng. compression:i:1 bật nén, đổi lại tốn CPU server một chút, đáng giá khi đường truyền yếu. bitmapcachepersistenable giữ cache bitmap giữa các phiên, giúp lần kết nối sau nhanh hơn.
Về phía server, đảm bảo không bật session đòi GPU khi không cần, và tắt hiệu ứng hình ảnh để giải phóng tài nguyên cho phiên RDP đầu tiên:
Set-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\VisualEffects' -Name 'VisualFXSetting' -Value 2
Đặt 2 là "Adjust for best performance", giảm animation và shadow, giúp phiên RDP phản hồi nhanh hơn rõ rệt trên VPS không có card đồ họa rời.
Bước 6 - Kiểm tra, ghi log và sao lưu cấu hình
Sau khi siết xong, kiểm tra tổng thể và ghi lại cấu hình để phục hồi nhanh nếu cần dựng lại máy. Ba lệnh dưới đây cho snapshot tình trạng bảo mật RDP hiện tại:
Get-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' | Select-Object PortNumber, UserAuthentication, SecurityLayer
net accounts
Get-NetFirewallRule | Where-Object {$_.Enabled -eq 'True' -and $_.Direction -eq 'Inbound'} | Select-Object DisplayName, LocalPort
Đảm bảo auditing đăng nhập đang bật để log 4625/4624 được ghi:
auditpol /set /subcategory:"Logon" /success:enable /failure:enable
auditpol /get /subcategory:"Logon"
Cuối cùng, chụp ảnh hoặc copy các giá trị registry ở trên vào một file text trong thư mục backup. VPS Windows không có cơ chế snapshot từ trong máy; dùng tính năng snapshot của nhà cung cấp (xem cách tạo snapshot và khôi phục VPS an toàn) để có điểm lùi trước khi thay đổi hệ thống lớn.
Xử lý lỗi thường gặp
Kết nối RDP treo ở "Configuring remote session" sau khi đổi cổng. Thường do firewall chưa mở cổng mới hoặc chỉ mở ở profile sai. Kiểm tra bằng Get-NetFirewallRule -DisplayName 'RDP-40222' | Select Enabled, Profile, Direction và thử tạm mở rộng -Profile Any. Nếu vẫn không vào, dùng console của nhà cung cấp để sửa.
Không đăng nhập được vì tài khoản bị khoá sau khi siết chính sách. Đây là lúc chính sách khoá phát huy tác dụng, nhưng cũng tự khoá chính bạn. Từ console hoặc phiên Administrator khác, mở PowerShell và chạy Unlock-ADAccount -Identity Administrator (nếu dùng domain) hoặc net user Administrator /active:yes kèm reset mật khẩu nếu là local account.
Log 4625 đầy log quá nhanh. Log Security mặc định giới hạn dung lượng; nếu bị dội quá nhiều, tăng kích thước log để không ghi đè bằng chứng: wevtutil sl Security /ms:104857600 đặt Security log lên 100 MB. Song song đó, nếu một IP lặp lại trong log, chặn hẳn: New-NetFirewallRule -DisplayName 'Block-BadIP' -Direction Inbound -RemoteAddress <địa_chỉ_ip> -Action Block.
Câu hỏi thường gặp
Đổi cổng RDP 3389 có đủ để bảo mật VPS Windows không?
Không đủ. Đổi cổng chỉ giảm bot quét tự động và làm log sạch hơn. Cần thêm NLA, chính sách khoá tài khoản và giới hạn firewall theo dải IP để thực sự chặn brute force.
Bật Network Level Authentication có làm client cũ không vào được không?
Có thể. NLA yêu cầu client hỗ trợ CredSSP, mọi bản Windows 10 trở lên đều đáp ứng. Chỉ client rất cũ hoặc một số app RDP không chuẩn mới lỗi, khi đó phải nâng cấp client.
Có nên chạy RDP qua VPN thay vì mở cổng ra Internet?
Nếu bạn chỉ quản trị RDP từ vài nơi cố định, VPN như WireGuard là lựa chọn an toàn hơn vì cổng RDP không lộ ra ngoài. Đổi lại bạn phải kết nối VPN trước mỗi phiên, thêm một bước nhưng giảm hẳn bề mặt tấn công.
Siết chính sách khoá quá chặt có sợ tự khoá mình không?
Có. Đặt ngưỡng 5 lần thường là điểm cân bằng tốt. Nếu bạn hay gõ sai, giữ ngưỡng này và chuẩn bị sẵn công cụ console của nhà cung cấp để mở khoá khi cần.
Tinh chỉnh trong file .rdp có phải làm trên server không?
Không. Các mục như networkautodetect hay compression nằm ở phía client, trong file .rdp của máy bạn dùng để kết nối. Phía server chỉ cần đảm bảo không bật tính năng nặng như hiệu ứng hình ảnh hay GPU ảo.
Bài viết liên quan
- Cách kết nối RDP vào VPS Windows Server chi tiết 2026
- Cấu hình remote desktop an toàn cho VPS Windows
- Hướng dẫn thuê VPS Windows Server RDP mượt
- Dùng WireGuard VPN trên VPS trong 10 phút


