{"id":5497,"date":"2025-11-13T18:23:40","date_gmt":"2025-11-13T18:23:40","guid":{"rendered":"https:\/\/thumbtube.com\/blog\/?p=5497"},"modified":"2025-11-13T18:37:29","modified_gmt":"2025-11-13T18:37:29","slug":"wp-fail2ban-rules-blocked-legitimate-ssh-to-ftp-hooks-during-deployments-and-the-regex-change-that-stopped-the-auto-blocks","status":"publish","type":"post","link":"https:\/\/thumbtube.com\/blog\/wp-fail2ban-rules-blocked-legitimate-ssh-to-ftp-hooks-during-deployments-and-the-regex-change-that-stopped-the-auto-blocks\/","title":{"rendered":"WP fail2ban Rules Blocked Legitimate SSH-to-FTP Hooks During Deployments and the Regex Change That Stopped the Auto Blocks"},"content":{"rendered":"<p>Deploying WordPress websites often involves a set of automated scripts. These scripts can connect through SSH, copy files, run setup commands, and even use FTP when needed. All this magic makes going live smooth and predictable.<\/p>\n<p>But recently, some developers noticed something odd. Their deployments kept failing\u2014right at the SSH-to-FTP hook step. The culprit? <em>WP fail2ban<\/em>, doing its job a little too well.<\/p>\n<h3>TL;DR<\/h3>\n<p>The WP fail2ban plugin blocked valid SSH-to-FTP deployment hooks, mistaking them for brute force attacks. Automated deployment scripts were getting flagged and banned. After investigating, developers found the issue was in the regex pattern used to detect threats. Updating the regex fixed it and made sure real attacks are still blocked, but valid connections are safe.<\/p>\n<h2>What is WP fail2ban?<\/h2>\n<p><strong>WP fail2ban<\/strong> is a security plugin for WordPress. It works with <em>fail2ban<\/em>, a system tool that watches your logs. When it sees something suspicious\u2014like too many failed logins\u2014it can block the IP.<\/p>\n<p>This is great for stopping attackers who try to guess passwords or exploit known vulnerabilities. It\u2019s part of a layered defense system for websites. But as with all automated defense tools, things can go sideways.<\/p>\n<h2>The Problem with Deployments<\/h2>\n<p>Let\u2019s say you use an awesome deployment script. It connects to your server using SSH. Then it switches to FTP to upload some assets. It might even call a custom WordPress hook to finish the job.<\/p>\n<p>In a perfect world, this goes smoothly. But what started happening was that these deployments were being <em>auto-blocked<\/em> by the server. Yikes.<\/p>\n<h2>fail2ban Cries Wolf<\/h2>\n<p>The fail2ban system uses <strong>regex patterns<\/strong> to scan log files. It looks for certain phrases that signal an attack. For example, 5 failed logins from the same IP? Blocked. An FTP login that doesn\u2019t quite look right? Suspicious.<\/p>\n<p>The problem was that certain <em>automated, legitimate FTP connections<\/em> looked like brute force attempts to the regex that WP fail2ban was using.<\/p>\n<p>This was especially true when the FTP command was called right after an SSH connection. The logs just looked sketchy to the regex\u2014even though a human would see it\u2019s a normal deployment.<\/p>\n<img loading=\"lazy\" decoding=\"async\" width=\"1080\" height=\"720\" src=\"https:\/\/thumbtube.com\/blog\/wp-content\/uploads\/2025\/10\/a-close-up-of-a-typewriter-with-the-word-wordpress-printed-on-it-broken-image-links-wordpress-database-replace.jpg\" class=\"attachment-full size-full\" alt=\"\" srcset=\"https:\/\/thumbtube.com\/blog\/wp-content\/uploads\/2025\/10\/a-close-up-of-a-typewriter-with-the-word-wordpress-printed-on-it-broken-image-links-wordpress-database-replace.jpg 1080w, https:\/\/thumbtube.com\/blog\/wp-content\/uploads\/2025\/10\/a-close-up-of-a-typewriter-with-the-word-wordpress-printed-on-it-broken-image-links-wordpress-database-replace-300x200.jpg 300w, https:\/\/thumbtube.com\/blog\/wp-content\/uploads\/2025\/10\/a-close-up-of-a-typewriter-with-the-word-wordpress-printed-on-it-broken-image-links-wordpress-database-replace-1024x683.jpg 1024w, https:\/\/thumbtube.com\/blog\/wp-content\/uploads\/2025\/10\/a-close-up-of-a-typewriter-with-the-word-wordpress-printed-on-it-broken-image-links-wordpress-database-replace-768x512.jpg 768w\" sizes=\"(max-width: 1080px) 100vw, 1080px\" \/>\n<h2>Identifying the Misfire<\/h2>\n<p>Several dev teams began seeing strange bans on their IP addresses. After checking their deployment logs and server logs, the pattern became clear:<\/p>\n<ul>\n<li>Connect via SSH \u2705<\/li>\n<li>Run deploy script \u2705<\/li>\n<li>Switch to FTP to send media files \u2705<\/li>\n<li>Connection drops mid-deploy \u274c<\/li>\n<li>Check server \u2192 BLOCKED IP \u2757\ufe0f<\/li>\n<\/ul>\n<p>The FTP activity, seen out of context, matched WP fail2ban\u2019s pattern for brute-force FTP login attempts. It wasn\u2019t malicious, but it <em>looked<\/em> close enough to trigger a block.<\/p>\n<h2>Diving into the Regex<\/h2>\n<p>Regex (short for Regular Expression) is powerful. It\u2019s used to match patterns in text. In the case of fail2ban, the regex reads log entries and looks for &#8220;bad behavior.&#8221;<\/p>\n<p>Here&#8217;s a simplified example of a regex pattern gone rogue:<\/p>\n<pre><code>Failed password.*for.*from (.*) port<\/code><\/pre>\n<p>This matches a standard failed SSH login. But if a deployed FTP user logs in quickly and fails once (or appears to), the log might look similar. The pattern sees &#8220;failed,&#8221; &#8220;password,&#8221; and &#8220;from IP&#8221;\u2014and boom, banished!<\/p>\n<p>The real regex that WP fail2ban used was more complex, but the idea was the same: legit behavior closely mimics malicious patterns sometimes.<\/p>\n<h2>Enter the Fix: A Better Regex<\/h2>\n<p>The root fix was to update the regex so it would still catch real threats but ignore safe deployment steps.<\/p>\n<p>Developers rewrote the regex to be more precise. It now checks for patterns that only occur in truly failed login attempts. It ignores legit system behaviors like:<\/p>\n<ul>\n<li>Successful, quick FTP logins<\/li>\n<li>Automated logins that follow a specific deploy tag<\/li>\n<li>IP addresses already whitelisted by the user<\/li>\n<\/ul>\n<p>Additionally, the new regex includes timing checks and log context. This way, it won\u2019t flag a single failed attempt if it\u2019s followed by a successful one in the same session.<\/p>\n<h2>The New Behavior<\/h2>\n<p>With the updated regex, here\u2019s what happens now:<\/p>\n<ul>\n<li>Deployment script connects via SSH \u2705<\/li>\n<li>Switches to FTP \u2705<\/li>\n<li>Uploads files \u2705<\/li>\n<li>Continuously logged and monitored, but <em>not blocked<\/em> \u2705<\/li>\n<\/ul>\n<p>If a real hacker tries to fake this behavior, they&#8217;d need to mimic the exact pattern of a working deployment. That\u2019s hard\u2014and even then, fail2ban now asks, \u201cHmm, is this really an attack?\u201d<\/p>\n<h2>Lessons Learned<\/h2>\n<p>This issue taught us a few important things about automation and security:<\/p>\n<ol>\n<li><strong>Regex can be too sensitive<\/strong> \u2013 Even a small oversight can cause bans for legit users.<\/li>\n<li><strong>Logs have context<\/strong> \u2013 A line in isolation can look dangerous, but patterns over time tell the real story.<\/li>\n<li><strong>Test security during deployments<\/strong> \u2013 If you deploy automatically, make sure nothing in the security stack blocks it.<\/li>\n<li><strong>Whitelisting carefully<\/strong> \u2013 Sometimes, giving known IPs or deploy servers a pass is a safer way to go.<\/li>\n<\/ol>\n<h2>How to Protect Your Deployments<\/h2>\n<p>If you\u2019re managing a WordPress site with automated deployments, here are a few steps to stay safe and efficient:<\/p>\n<ul>\n<li>Update to the latest WP fail2ban version that includes the new regex.<\/li>\n<li>Review your <code>\/etc\/fail2ban\/jail.local<\/code> file and adjust bans for your deployment IP addresses.<\/li>\n<li>Add &#8220;deploy&#8221; tags or comments in your scripts to help create log trail clues.<\/li>\n<li>Check logs regularly to spot unnecessary bans.<\/li>\n<\/ul>\n<p>If you\u2019re unsure about your regex configs, now\u2019s a great time to brush up on regex\u2014or ask your devops folks to help fine-tune it.<\/p>\n<img loading=\"lazy\" decoding=\"async\" width=\"1080\" height=\"608\" src=\"https:\/\/thumbtube.com\/blog\/wp-content\/uploads\/2025\/12\/a-group-of-white-cubes-floating-in-the-air-minecraft-folder-structure-kubejs-scripts.jpg\" class=\"attachment-full size-full\" alt=\"\" srcset=\"https:\/\/thumbtube.com\/blog\/wp-content\/uploads\/2025\/12\/a-group-of-white-cubes-floating-in-the-air-minecraft-folder-structure-kubejs-scripts.jpg 1080w, https:\/\/thumbtube.com\/blog\/wp-content\/uploads\/2025\/12\/a-group-of-white-cubes-floating-in-the-air-minecraft-folder-structure-kubejs-scripts-300x169.jpg 300w, https:\/\/thumbtube.com\/blog\/wp-content\/uploads\/2025\/12\/a-group-of-white-cubes-floating-in-the-air-minecraft-folder-structure-kubejs-scripts-1024x576.jpg 1024w, https:\/\/thumbtube.com\/blog\/wp-content\/uploads\/2025\/12\/a-group-of-white-cubes-floating-in-the-air-minecraft-folder-structure-kubejs-scripts-768x432.jpg 768w\" sizes=\"(max-width: 1080px) 100vw, 1080px\" \/>\n<h2>The Bigger Picture<\/h2>\n<p>Security tools are awesome. They save our sites from daily attacks. But they\u2019re not perfect. Sometimes, we need to tweak them to understand the difference between \u201cbad guy creeping in\u201d and \u201cdev trying to push to live.\u201d<\/p>\n<p>The goal isn\u2019t to weaken security\u2014it\u2019s to build <em>smart security<\/em>. And smart means knowing the context.<\/p>\n<h2>Final Thoughts<\/h2>\n<p>Automation is only as good as the systems watching it. WP fail2ban is still a rock-solid line of defense\u2014it just needed to be taught the difference between foe and friend.<\/p>\n<p>If you\u2019ve been hitting walls during deployment, check your logs and regex rules. It might just be a robot misunderstanding another robot.<\/p>\n<p>After all, even machines need a little empathy.<\/p>\n<p>Happy deploying, and may your scripts always complete <em>without being blocked<\/em>!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Deploying WordPress websites often involves a set of automated scripts. These scripts can connect through &#8230; <\/p>\n<p class=\"read-more-container\"><a title=\"WP fail2ban Rules Blocked Legitimate SSH-to-FTP Hooks During Deployments and the Regex Change That Stopped the Auto Blocks\" class=\"read-more button\" href=\"https:\/\/thumbtube.com\/blog\/wp-fail2ban-rules-blocked-legitimate-ssh-to-ftp-hooks-during-deployments-and-the-regex-change-that-stopped-the-auto-blocks\/#more-5497\" aria-label=\"Read more about WP fail2ban Rules Blocked Legitimate SSH-to-FTP Hooks During Deployments and the Regex Change That Stopped the Auto Blocks\">Read More<\/a><\/p>\n","protected":false},"author":78,"featured_media":5453,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[],"class_list":["post-5497","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-guides","infinite-scroll-item","generate-columns","tablet-grid-50","mobile-grid-100","grid-parent","grid-25","no-featured-image-padding"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v23.4 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>WP fail2ban Rules Blocked Legitimate SSH-to-FTP Hooks During Deployments and the Regex Change That Stopped the Auto Blocks - ThumbTube<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/thumbtube.com\/blog\/wp-fail2ban-rules-blocked-legitimate-ssh-to-ftp-hooks-during-deployments-and-the-regex-change-that-stopped-the-auto-blocks\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"WP fail2ban Rules Blocked Legitimate SSH-to-FTP Hooks During Deployments and the Regex Change That Stopped the Auto Blocks - ThumbTube\" \/>\n<meta property=\"og:description\" content=\"Deploying WordPress websites often involves a set of automated scripts. These scripts can connect through ... Read More\" \/>\n<meta property=\"og:url\" content=\"https:\/\/thumbtube.com\/blog\/wp-fail2ban-rules-blocked-legitimate-ssh-to-ftp-hooks-during-deployments-and-the-regex-change-that-stopped-the-auto-blocks\/\" \/>\n<meta property=\"og:site_name\" content=\"ThumbTube\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-13T18:23:40+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-11-13T18:37:29+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/thumbtube.com\/blog\/wp-content\/uploads\/2025\/11\/an-at-symbol-is-seen-on-a-reflective-surface-divi-restricted-user-custom-roles-wordpress-backend-1.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1080\" \/>\n\t<meta property=\"og:image:height\" content=\"720\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Ethan Martinez\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Ethan Martinez\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/thumbtube.com\/blog\/wp-fail2ban-rules-blocked-legitimate-ssh-to-ftp-hooks-during-deployments-and-the-regex-change-that-stopped-the-auto-blocks\/\",\"url\":\"https:\/\/thumbtube.com\/blog\/wp-fail2ban-rules-blocked-legitimate-ssh-to-ftp-hooks-during-deployments-and-the-regex-change-that-stopped-the-auto-blocks\/\",\"name\":\"WP fail2ban Rules Blocked Legitimate SSH-to-FTP Hooks During Deployments and the Regex Change That Stopped the Auto Blocks - ThumbTube\",\"isPartOf\":{\"@id\":\"https:\/\/thumbtube.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/thumbtube.com\/blog\/wp-fail2ban-rules-blocked-legitimate-ssh-to-ftp-hooks-during-deployments-and-the-regex-change-that-stopped-the-auto-blocks\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/thumbtube.com\/blog\/wp-fail2ban-rules-blocked-legitimate-ssh-to-ftp-hooks-during-deployments-and-the-regex-change-that-stopped-the-auto-blocks\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/thumbtube.com\/blog\/wp-content\/uploads\/2025\/11\/an-at-symbol-is-seen-on-a-reflective-surface-divi-restricted-user-custom-roles-wordpress-backend-1.jpg\",\"datePublished\":\"2025-11-13T18:23:40+00:00\",\"dateModified\":\"2025-11-13T18:37:29+00:00\",\"author\":{\"@id\":\"https:\/\/thumbtube.com\/blog\/#\/schema\/person\/4fe17b14e96eaa537d646cb9ae441583\"},\"breadcrumb\":{\"@id\":\"https:\/\/thumbtube.com\/blog\/wp-fail2ban-rules-blocked-legitimate-ssh-to-ftp-hooks-during-deployments-and-the-regex-change-that-stopped-the-auto-blocks\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/thumbtube.com\/blog\/wp-fail2ban-rules-blocked-legitimate-ssh-to-ftp-hooks-during-deployments-and-the-regex-change-that-stopped-the-auto-blocks\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/thumbtube.com\/blog\/wp-fail2ban-rules-blocked-legitimate-ssh-to-ftp-hooks-during-deployments-and-the-regex-change-that-stopped-the-auto-blocks\/#primaryimage\",\"url\":\"https:\/\/thumbtube.com\/blog\/wp-content\/uploads\/2025\/11\/an-at-symbol-is-seen-on-a-reflective-surface-divi-restricted-user-custom-roles-wordpress-backend-1.jpg\",\"contentUrl\":\"https:\/\/thumbtube.com\/blog\/wp-content\/uploads\/2025\/11\/an-at-symbol-is-seen-on-a-reflective-surface-divi-restricted-user-custom-roles-wordpress-backend-1.jpg\",\"width\":1080,\"height\":720},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/thumbtube.com\/blog\/wp-fail2ban-rules-blocked-legitimate-ssh-to-ftp-hooks-during-deployments-and-the-regex-change-that-stopped-the-auto-blocks\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/thumbtube.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"WP fail2ban Rules Blocked Legitimate SSH-to-FTP Hooks During Deployments and the Regex Change That Stopped the Auto Blocks\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/thumbtube.com\/blog\/#website\",\"url\":\"https:\/\/thumbtube.com\/blog\/\",\"name\":\"ThumbTube\",\"description\":\"Blog\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/thumbtube.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/thumbtube.com\/blog\/#\/schema\/person\/4fe17b14e96eaa537d646cb9ae441583\",\"name\":\"Ethan Martinez\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/thumbtube.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/993fbfe1588a77db452e8ea37ed7fcba?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/993fbfe1588a77db452e8ea37ed7fcba?s=96&d=mm&r=g\",\"caption\":\"Ethan Martinez\"},\"description\":\"I'm Ethan Martinez, a tech writer focused on cloud computing and SaaS solutions. I provide insights into the latest cloud technologies and services to keep readers informed.\",\"url\":\"https:\/\/thumbtube.com\/blog\/author\/ethan\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"WP fail2ban Rules Blocked Legitimate SSH-to-FTP Hooks During Deployments and the Regex Change That Stopped the Auto Blocks - ThumbTube","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:\/\/thumbtube.com\/blog\/wp-fail2ban-rules-blocked-legitimate-ssh-to-ftp-hooks-during-deployments-and-the-regex-change-that-stopped-the-auto-blocks\/","og_locale":"en_US","og_type":"article","og_title":"WP fail2ban Rules Blocked Legitimate SSH-to-FTP Hooks During Deployments and the Regex Change That Stopped the Auto Blocks - ThumbTube","og_description":"Deploying WordPress websites often involves a set of automated scripts. These scripts can connect through ... Read More","og_url":"https:\/\/thumbtube.com\/blog\/wp-fail2ban-rules-blocked-legitimate-ssh-to-ftp-hooks-during-deployments-and-the-regex-change-that-stopped-the-auto-blocks\/","og_site_name":"ThumbTube","article_published_time":"2025-11-13T18:23:40+00:00","article_modified_time":"2025-11-13T18:37:29+00:00","og_image":[{"width":1080,"height":720,"url":"https:\/\/thumbtube.com\/blog\/wp-content\/uploads\/2025\/11\/an-at-symbol-is-seen-on-a-reflective-surface-divi-restricted-user-custom-roles-wordpress-backend-1.jpg","type":"image\/jpeg"}],"author":"Ethan Martinez","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Ethan Martinez","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/thumbtube.com\/blog\/wp-fail2ban-rules-blocked-legitimate-ssh-to-ftp-hooks-during-deployments-and-the-regex-change-that-stopped-the-auto-blocks\/","url":"https:\/\/thumbtube.com\/blog\/wp-fail2ban-rules-blocked-legitimate-ssh-to-ftp-hooks-during-deployments-and-the-regex-change-that-stopped-the-auto-blocks\/","name":"WP fail2ban Rules Blocked Legitimate SSH-to-FTP Hooks During Deployments and the Regex Change That Stopped the Auto Blocks - ThumbTube","isPartOf":{"@id":"https:\/\/thumbtube.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/thumbtube.com\/blog\/wp-fail2ban-rules-blocked-legitimate-ssh-to-ftp-hooks-during-deployments-and-the-regex-change-that-stopped-the-auto-blocks\/#primaryimage"},"image":{"@id":"https:\/\/thumbtube.com\/blog\/wp-fail2ban-rules-blocked-legitimate-ssh-to-ftp-hooks-during-deployments-and-the-regex-change-that-stopped-the-auto-blocks\/#primaryimage"},"thumbnailUrl":"https:\/\/thumbtube.com\/blog\/wp-content\/uploads\/2025\/11\/an-at-symbol-is-seen-on-a-reflective-surface-divi-restricted-user-custom-roles-wordpress-backend-1.jpg","datePublished":"2025-11-13T18:23:40+00:00","dateModified":"2025-11-13T18:37:29+00:00","author":{"@id":"https:\/\/thumbtube.com\/blog\/#\/schema\/person\/4fe17b14e96eaa537d646cb9ae441583"},"breadcrumb":{"@id":"https:\/\/thumbtube.com\/blog\/wp-fail2ban-rules-blocked-legitimate-ssh-to-ftp-hooks-during-deployments-and-the-regex-change-that-stopped-the-auto-blocks\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/thumbtube.com\/blog\/wp-fail2ban-rules-blocked-legitimate-ssh-to-ftp-hooks-during-deployments-and-the-regex-change-that-stopped-the-auto-blocks\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/thumbtube.com\/blog\/wp-fail2ban-rules-blocked-legitimate-ssh-to-ftp-hooks-during-deployments-and-the-regex-change-that-stopped-the-auto-blocks\/#primaryimage","url":"https:\/\/thumbtube.com\/blog\/wp-content\/uploads\/2025\/11\/an-at-symbol-is-seen-on-a-reflective-surface-divi-restricted-user-custom-roles-wordpress-backend-1.jpg","contentUrl":"https:\/\/thumbtube.com\/blog\/wp-content\/uploads\/2025\/11\/an-at-symbol-is-seen-on-a-reflective-surface-divi-restricted-user-custom-roles-wordpress-backend-1.jpg","width":1080,"height":720},{"@type":"BreadcrumbList","@id":"https:\/\/thumbtube.com\/blog\/wp-fail2ban-rules-blocked-legitimate-ssh-to-ftp-hooks-during-deployments-and-the-regex-change-that-stopped-the-auto-blocks\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/thumbtube.com\/blog\/"},{"@type":"ListItem","position":2,"name":"WP fail2ban Rules Blocked Legitimate SSH-to-FTP Hooks During Deployments and the Regex Change That Stopped the Auto Blocks"}]},{"@type":"WebSite","@id":"https:\/\/thumbtube.com\/blog\/#website","url":"https:\/\/thumbtube.com\/blog\/","name":"ThumbTube","description":"Blog","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/thumbtube.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/thumbtube.com\/blog\/#\/schema\/person\/4fe17b14e96eaa537d646cb9ae441583","name":"Ethan Martinez","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/thumbtube.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/993fbfe1588a77db452e8ea37ed7fcba?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/993fbfe1588a77db452e8ea37ed7fcba?s=96&d=mm&r=g","caption":"Ethan Martinez"},"description":"I'm Ethan Martinez, a tech writer focused on cloud computing and SaaS solutions. I provide insights into the latest cloud technologies and services to keep readers informed.","url":"https:\/\/thumbtube.com\/blog\/author\/ethan\/"}]}},"_links":{"self":[{"href":"https:\/\/thumbtube.com\/blog\/wp-json\/wp\/v2\/posts\/5497"}],"collection":[{"href":"https:\/\/thumbtube.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/thumbtube.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/thumbtube.com\/blog\/wp-json\/wp\/v2\/users\/78"}],"replies":[{"embeddable":true,"href":"https:\/\/thumbtube.com\/blog\/wp-json\/wp\/v2\/comments?post=5497"}],"version-history":[{"count":1,"href":"https:\/\/thumbtube.com\/blog\/wp-json\/wp\/v2\/posts\/5497\/revisions"}],"predecessor-version":[{"id":5503,"href":"https:\/\/thumbtube.com\/blog\/wp-json\/wp\/v2\/posts\/5497\/revisions\/5503"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/thumbtube.com\/blog\/wp-json\/wp\/v2\/media\/5453"}],"wp:attachment":[{"href":"https:\/\/thumbtube.com\/blog\/wp-json\/wp\/v2\/media?parent=5497"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/thumbtube.com\/blog\/wp-json\/wp\/v2\/categories?post=5497"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/thumbtube.com\/blog\/wp-json\/wp\/v2\/tags?post=5497"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}