{"id":908,"date":"2026-10-21T23:13:37","date_gmt":"2026-10-21T23:13:37","guid":{"rendered":"https:\/\/windows-vps.org\/blog\/?p=908"},"modified":"2026-10-21T23:13:37","modified_gmt":"2026-10-21T23:13:37","slug":"rdp-brute-force-defense-nla-lockout-source-rate-limiting","status":"publish","type":"post","link":"https:\/\/windows-vps.org\/blog\/rdp-brute-force-defense-nla-lockout-source-rate-limiting\/","title":{"rendered":"Defending RDP Against Brute Force: NLA, Lockout Policy, and Source Rate Limiting"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">RDP brute-force traffic is relentless and largely automated. An exposed Windows Server on a public IP will typically see its first credential-guessing attempts within hours of going live, and the pattern is repetitive: a few thousand attempts against Administrator from a handful of \/24s, then a pause, then a shift to the RDP port if that proves unreachable. The defences that actually reduce the volume are, in order of effectiveness: not exposing RDP at all, requiring Network Level Authentication so unauthenticated clients cannot even reach the login prompt, and then rate limiting and lockout for whatever still arrives. This article covers each layer with the concrete settings.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The Baseline: Measure Before You Change Anything<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Before hardening, record what the server is seeing. The two log sources that matter are the Security log on the target (events 4625 for failed logon, 4624 for success, 4776 for credential validation) and any logs from your provider&#8217;s edge firewall. A quick count over the last seven days gives you a baseline to compare against after the changes:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4625; StartTime=(Get-Date).AddDays(-7)} | Measure-Object<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Then break it down by source address and target account. If the top talkers are a small set of IPs hitting Administrator, that is generic scanning. If the source set is large and distributed, you are the target of a coordinated credential-stuffing run, and per-IP blocking will not help much \u2014 account lockout policy and MFA will.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Layer One: Do Not Expose 3389<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The single most effective RDP hardening step costs nothing in software: stop publishing TCP 3389 to the internet. The options, roughly in order of preference for a VPS:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>VPN first.<\/strong> Put the VPS on a WireGuard or OpenVPN endpoint and connect to RDP over the tunnel. The RDP listener binds to the private interface only.<\/li><li><strong>RD Gateway.<\/strong> Expose only HTTPS 443 on the gateway and keep the session hosts on a private network. This is the correct enterprise answer and works well on a two-node VPS estate.<\/li><li><strong>IP allowlist.<\/strong> Restrict 3389 to your office and home ranges at both the provider firewall and Windows Firewall. Cheap, but brittle when your ISP changes your address.<\/li><li><strong>Non-standard port.<\/strong> Reduces log noise from broad scans by a large factor but is not a security control; treat it as tidying, not defence.<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">If you must expose RDP directly, do it with NLA enforced and with the allowlist as narrow as you can tolerate. The <a href=\"https:\/\/windows-vps.org\/secure-remote-desktop-rdp-setup-windows-server\">secure RDP setup walkthrough for Windows Server<\/a> covers the firewall scoping and certificate steps for that configuration.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Layer Two: Network Level Authentication<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">NLA moves authentication to the connection phase, before a session is allocated and before the login screen is drawn. It uses CredSSP and requires a Kerberos or NTLM handshake, which means most brute-force scripts cannot reach the stage where they submit passwords. On Windows Server it is enabled by default, but it can be disabled by group policy or by a misconfigured remote app.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Confirm it is required, not merely supported:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>Get-ItemProperty 'HKLM:\\SYSTEM\\CurrentControlSet\\Control\\Terminal Server\\WinStations\\RDP-Tcp' -Name UserAuthentication<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A value of <code>1<\/code> means NLA is required. <code>0<\/code> means it is not, and the server will accept unauthenticated connections that land directly on the logon screen. Also check the policy path <em>Computer Configuration &rarr; Administrative Templates &rarr; Windows Components &rarr; Remote Desktop Services &rarr; Remote Desktop Session Host &rarr; Security &rarr; Require user authentication for remote connections by using Network Level Authentication<\/em>, because group policy will overwrite the local registry setting on the next refresh.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Layer Three: Account Lockout Without Locking Yourself Out<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Account lockout is a blunt instrument, and it is also the fastest way to lock yourself out of your own VPS. The settings that trade brute-force resistance against availability are threshold, duration, and observation window. A reasonable starting point for a small server is a threshold of 5 failed attempts, a 15-minute duration, and a 15-minute observation window \u2014 enough to blunt a password spray against a single account without turning a typo into a support incident.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The critical safeguard is a second, unprivileged-except-for-RDP path in: a break-glass local account with a long random password stored offline, allowed to log on via RDP but not a member of Domain Admins. Verify it works before you enable lockout. Then verify it again after a group policy refresh.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Layer Four: Rate Limiting the Source, Not the Account<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Account lockout punishes the target. Rate limiting punishes the source, and that is what you want against a distributed spray. Linux operators reach for fail2ban; on Windows the equivalent patterns are Windows Firewall dynamic rules, a PowerShell watchdog, or the built-in <code>Block-RdpConnection<\/code>-style approaches in third-party tools. A minimal, dependency-free watchdog is a scheduled task that runs every five minutes, parses the last window of 4625 events, and adds a Windows Firewall block rule for any source address that exceeded a threshold.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pseudo-code for that job: query <code>Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4625; StartTime=(Get-Date).AddMinutes(-10)}<\/code>, extract <code>IpAddress<\/code> from each event&#8217;s XML, group and count, then for any address over the limit check whether a rule named <code>RDP-Block-&lt;ip&gt;<\/code> already exists and create it with <code>New-NetFirewallRule -Direction Inbound -RemoteAddress $ip -Action Block<\/code> if not. Expire rules older than 24 hours on the same schedule.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Two cautions. First, use a threshold high enough that a legitimate user fumbling a password twice is not blocked \u2014 30+ failures in 10 minutes is a reasonable floor. Second, never block a range that includes your own management address; a static egress IP for your office and a documented exception list prevent the worst outcome.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Layer Five: Make the Credential Useless<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The layers above reduce the number of guesses reaching the authentication stack. The final layer makes a successful guess worthless. Rename or disable the built-in Administrator account and use named administrative accounts instead; require long passwords (16+ characters) for any account permitted to RDP; and enable MFA at the RDP layer using an RD Gateway with Azure MFA\/NPS extension or a third-party credential provider. For a single-admin VPS, the 80% solution is a renamed admin account, a 20-character password in a password manager, NLA enforced, and RDP reachable only from a VPN or allowlist.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Control<\/th><th>Effort<\/th><th>Effect on brute-force volume<\/th><\/tr><\/thead><tbody><tr><td>Remove public 3389 (VPN \/ allowlist)<\/td><td>Medium<\/td><td>Near-total<\/td><\/tr><tr><td>Require NLA<\/td><td>Low<\/td><td>High \u2014 blocks pre-auth attempts<\/td><\/tr><tr><td>Account lockout 5\/15\/15<\/td><td>Low<\/td><td>Medium against single-account spray<\/td><\/tr><tr><td>Source rate-limit watchdog<\/td><td>Medium<\/td><td>High against distributed attempts<\/td><\/tr><tr><td>MFA \/ RD Gateway<\/td><td>High<\/td><td>Very high \u2014 defeats valid passwords<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Verification and Ongoing Monitoring<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">After each change, re-run the 4625 baseline and compare. You should see the absolute count fall sharply once NLA and network restrictions are in place, and the surviving events should be concentrated on the accounts you deliberately left reachable. Alert on successful logons (4624 type 10) from addresses outside your expected set; that is the signal that matters more than the noise.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Keep the whole configuration in version control as a PowerShell script so a rebuild reproduces it. Hardening that lives only in a GUI is hardening you will lose the first time the instance is replaced. If you are standing up a new instance and want the RDP path correct from the first boot, the <a href=\"https:\/\/windows-vps.org\/\">Windows VPS hosting options<\/a> page describes the standard network configurations, and the <a href=\"https:\/\/windows-vps.org\/contact\">hosting support team<\/a> can confirm whether your provider firewall can do the allowlisting for you.<\/p>\n\n","protected":false},"excerpt":{"rendered":"<p>RDP brute-force traffic is relentless and largely automated. An exposed Windows Server on a public IP will typically see its first credential-guessing attempts within hours of going live, and the pattern is repetitive: a few thousand attempts against Administrator from a handful of \/24s, then a pause, then a shift to the RDP port if &#8230; <a title=\"Defending RDP Against Brute Force: NLA, Lockout Policy, and Source Rate Limiting\" class=\"read-more\" href=\"https:\/\/windows-vps.org\/blog\/rdp-brute-force-defense-nla-lockout-source-rate-limiting\/\" aria-label=\"Read more about Defending RDP Against Brute Force: NLA, Lockout Policy, and Source Rate Limiting\">Read more<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"iawp_total_views":1,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-908","post","type-post","status-publish","format-standard","hentry","category-reviews"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.1 (Yoast SEO v26.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Defending RDP Against Brute Force: NLA, Lockout Policy, and Source Rate Limiting - Windows VPS Blog<\/title>\n<meta name=\"description\" content=\"RDP brute-force traffic is relentless and largely automated. An exposed Windows Server on a public IP will typically see its first credential-guessing\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/windows-vps.org\/blog\/rdp-brute-force-defense-nla-lockout-source-rate-limiting\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Defending RDP Against Brute Force: NLA, Lockout Policy, and Source Rate Limiting\" \/>\n<meta property=\"og:description\" content=\"Defending RDP Against Brute Force: NLA, Lockout Policy, and Source Rate Limiting\" \/>\n<meta property=\"og:url\" content=\"https:\/\/windows-vps.org\/blog\/rdp-brute-force-defense-nla-lockout-source-rate-limiting\/\" \/>\n<meta property=\"og:site_name\" content=\"Windows VPS Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-21T23:13:37+00:00\" \/>\n<meta name=\"author\" content=\"windows-vps\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@myxiechengxuan\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"windows-vps\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/windows-vps.org\/blog\/rdp-brute-force-defense-nla-lockout-source-rate-limiting\/\",\"url\":\"https:\/\/windows-vps.org\/blog\/rdp-brute-force-defense-nla-lockout-source-rate-limiting\/\",\"name\":\"Defending RDP Against Brute Force: NLA, Lockout Policy, and Source Rate Limiting - Windows VPS Blog\",\"isPartOf\":{\"@id\":\"https:\/\/windows-vps.org\/blog\/#website\"},\"datePublished\":\"2026-10-21T23:13:37+00:00\",\"author\":{\"@id\":\"https:\/\/windows-vps.org\/blog\/#\/schema\/person\/44caceed916d0db318aa08d5623a7a58\"},\"description\":\"RDP brute-force traffic is relentless and largely automated. An exposed Windows Server on a public IP will typically see its first credential-guessing\",\"breadcrumb\":{\"@id\":\"https:\/\/windows-vps.org\/blog\/rdp-brute-force-defense-nla-lockout-source-rate-limiting\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/windows-vps.org\/blog\/rdp-brute-force-defense-nla-lockout-source-rate-limiting\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/windows-vps.org\/blog\/rdp-brute-force-defense-nla-lockout-source-rate-limiting\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/windows-vps.org\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Defending RDP Against Brute Force: NLA, Lockout Policy, and Source Rate Limiting\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/windows-vps.org\/blog\/#website\",\"url\":\"https:\/\/windows-vps.org\/blog\/\",\"name\":\"Windows VPS Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/windows-vps.org\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/windows-vps.org\/blog\/#\/schema\/person\/44caceed916d0db318aa08d5623a7a58\",\"name\":\"windows-vps\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/windows-vps.org\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/3f2573db5afcd1a6ab9abcc5d48fc8e42584bc87ab9d98cc156e5b2097766dd9?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/3f2573db5afcd1a6ab9abcc5d48fc8e42584bc87ab9d98cc156e5b2097766dd9?s=96&d=mm&r=g\",\"caption\":\"windows-vps\"},\"sameAs\":[\"https:\/\/windows-vps.org\/blog\",\"https:\/\/x.com\/myxiechengxuan\"],\"url\":\"https:\/\/windows-vps.org\/blog\/author\/myxiechengxuan\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Defending RDP Against Brute Force: NLA, Lockout Policy, and Source Rate Limiting - Windows VPS Blog","description":"RDP brute-force traffic is relentless and largely automated. An exposed Windows Server on a public IP will typically see its first credential-guessing","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/windows-vps.org\/blog\/rdp-brute-force-defense-nla-lockout-source-rate-limiting\/","og_locale":"en_US","og_type":"article","og_title":"Defending RDP Against Brute Force: NLA, Lockout Policy, and Source Rate Limiting","og_description":"Defending RDP Against Brute Force: NLA, Lockout Policy, and Source Rate Limiting","og_url":"https:\/\/windows-vps.org\/blog\/rdp-brute-force-defense-nla-lockout-source-rate-limiting\/","og_site_name":"Windows VPS Blog","article_published_time":"2026-10-21T23:13:37+00:00","author":"windows-vps","twitter_card":"summary_large_image","twitter_creator":"@myxiechengxuan","twitter_misc":{"Written by":"windows-vps","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/windows-vps.org\/blog\/rdp-brute-force-defense-nla-lockout-source-rate-limiting\/","url":"https:\/\/windows-vps.org\/blog\/rdp-brute-force-defense-nla-lockout-source-rate-limiting\/","name":"Defending RDP Against Brute Force: NLA, Lockout Policy, and Source Rate Limiting - Windows VPS Blog","isPartOf":{"@id":"https:\/\/windows-vps.org\/blog\/#website"},"datePublished":"2026-10-21T23:13:37+00:00","author":{"@id":"https:\/\/windows-vps.org\/blog\/#\/schema\/person\/44caceed916d0db318aa08d5623a7a58"},"description":"RDP brute-force traffic is relentless and largely automated. An exposed Windows Server on a public IP will typically see its first credential-guessing","breadcrumb":{"@id":"https:\/\/windows-vps.org\/blog\/rdp-brute-force-defense-nla-lockout-source-rate-limiting\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/windows-vps.org\/blog\/rdp-brute-force-defense-nla-lockout-source-rate-limiting\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/windows-vps.org\/blog\/rdp-brute-force-defense-nla-lockout-source-rate-limiting\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/windows-vps.org\/blog\/"},{"@type":"ListItem","position":2,"name":"Defending RDP Against Brute Force: NLA, Lockout Policy, and Source Rate Limiting"}]},{"@type":"WebSite","@id":"https:\/\/windows-vps.org\/blog\/#website","url":"https:\/\/windows-vps.org\/blog\/","name":"Windows VPS Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/windows-vps.org\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/windows-vps.org\/blog\/#\/schema\/person\/44caceed916d0db318aa08d5623a7a58","name":"windows-vps","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/windows-vps.org\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/3f2573db5afcd1a6ab9abcc5d48fc8e42584bc87ab9d98cc156e5b2097766dd9?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/3f2573db5afcd1a6ab9abcc5d48fc8e42584bc87ab9d98cc156e5b2097766dd9?s=96&d=mm&r=g","caption":"windows-vps"},"sameAs":["https:\/\/windows-vps.org\/blog","https:\/\/x.com\/myxiechengxuan"],"url":"https:\/\/windows-vps.org\/blog\/author\/myxiechengxuan\/"}]}},"_links":{"self":[{"href":"https:\/\/windows-vps.org\/blog\/wp-json\/wp\/v2\/posts\/908","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/windows-vps.org\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/windows-vps.org\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/windows-vps.org\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/windows-vps.org\/blog\/wp-json\/wp\/v2\/comments?post=908"}],"version-history":[{"count":1,"href":"https:\/\/windows-vps.org\/blog\/wp-json\/wp\/v2\/posts\/908\/revisions"}],"predecessor-version":[{"id":911,"href":"https:\/\/windows-vps.org\/blog\/wp-json\/wp\/v2\/posts\/908\/revisions\/911"}],"wp:attachment":[{"href":"https:\/\/windows-vps.org\/blog\/wp-json\/wp\/v2\/media?parent=908"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/windows-vps.org\/blog\/wp-json\/wp\/v2\/categories?post=908"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/windows-vps.org\/blog\/wp-json\/wp\/v2\/tags?post=908"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}