{"id":1682,"date":"2017-06-23T18:12:02","date_gmt":"2017-06-23T12:42:02","guid":{"rendered":"https:\/\/pheonixsolutions.com\/blog\/?p=1682"},"modified":"2026-09-07T15:39:56","modified_gmt":"2026-09-07T10:09:56","slug":"add-pureftp-service-fail2ban-ubuntu","status":"publish","type":"post","link":"https:\/\/pheonixsolutions.com\/blog\/add-pureftp-service-fail2ban-ubuntu\/","title":{"rendered":"Add PureFTP service to Fail2ban &#8211; Ubuntu"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Introduction<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This guide explains how to add PureFTPd service to Fail2ban on Ubuntu, so that repeated failed login attempts against your FTP server automatically get blocked instead of left open to brute-force attacks. If you&#8217;re running Pure-FTPd on a public-facing Ubuntu server, this is one of the simplest, highest-value hardening steps you can take \u2014 and it takes only a few minutes to set up.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Fail2ban works by scanning log files for patterns that indicate malicious activity \u2014 like repeated failed login attempts \u2014 and automatically banning the offending IP address for a configurable period of time, usually by adding a temporary firewall rule. By default, Fail2ban ships with filters for many common services, but FTP protection via Pure-FTPd isn&#8217;t always enabled out of the box, which is exactly what this guide walks through fixing.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">By the end of this post, Fail2ban will be actively monitoring your Pure-FTPd logs and automatically banning IPs that repeatedly fail to authenticate.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Implementation<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">I. Prerequisites<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Before you add PureFTPd service to Fail2ban on Ubuntu, make sure you have:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>An Ubuntu host with Pure-FTPd already installed and running<\/li>\n\n\n\n<li>Fail2ban installed and running<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">If Fail2ban isn&#8217;t installed yet, follow our guide on installing Fail2ban on Ubuntu before continuing with the steps below.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">II. Understand How Fail2ban Protects Services<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Before making changes, it helps to understand what&#8217;s actually happening under the hood. Fail2ban is made up of two main components that work together for each protected service:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>A filter<\/strong> \u2014 a regular expression pattern that tells Fail2ban what a &#8220;failed login&#8221; looks like in a specific service&#8217;s log file<\/li>\n\n\n\n<li><strong>A jail<\/strong> \u2014 a configuration block that ties a filter to a specific log file, port, and set of ban rules (like how many failures trigger a ban, and for how long)<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Fail2ban ships with a pre-built filter for Pure-FTPd (<code>pure-ftpd.conf<\/code>), but it isn&#8217;t enabled by default. The steps below activate it by creating a matching jail configuration.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">III. Copy the Pure-FTPd Filter File<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Fail2ban includes a default filter definition for Pure-FTPd, but under a slightly different filename than what we&#8217;ll reference in the jail configuration. Copy it to a new filename for clarity and consistency with the jail name we&#8217;ll use:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">cp \/etc\/fail2ban\/filter.d\/pure-ftpd.conf \/etc\/fail2ban\/filter.d\/pureftpd.conf\n<\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>Note:<\/strong> This step is mostly about naming consistency \u2014 you could reference <code>pure-ftpd<\/code> directly in your jail configuration instead and skip the copy. Renaming it to <code>pureftpd<\/code> here just keeps the filter name matching the jail name we&#8217;ll define next, which makes the configuration easier to read and maintain later.<\/p>\n<\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\">IV. Configure the PureFTPd Jail<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Open Fail2ban&#8217;s local jail configuration file. Using <code>jail.local<\/code> instead of editing <code>jail.conf<\/code> directly is important \u2014 <code>jail.conf<\/code> gets overwritten on Fail2ban updates, while <code>jail.local<\/code> is preserved and takes precedence:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">vi \/etc\/fail2ban\/jail.local\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Add the following block:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">[pureftpd]\nenabled  = true\nport     = ftp\nfilter   = pureftpd\nlogpath  = \/var\/log\/syslog\nmaxretry = 3\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Here&#8217;s what each line configures:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Setting<\/th><th>Purpose<\/th><\/tr><\/thead><tbody><tr><td><code>enabled<\/code><\/td><td>Turns this jail on<\/td><\/tr><tr><td><code>port<\/code><\/td><td>The service port to apply firewall bans against (<code>ftp<\/code> maps to port 21)<\/td><\/tr><tr><td><code>filter<\/code><\/td><td>The filter file to use for pattern matching (references <code>pureftpd.conf<\/code> from Step III)<\/td><\/tr><tr><td><code>logpath<\/code><\/td><td>The log file Fail2ban monitors for failed login patterns<\/td><\/tr><tr><td><code>maxretry<\/code><\/td><td>The number of failed attempts allowed before an IP is banned<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>Tip:<\/strong> You can also add a <code>bantime<\/code> setting (in seconds) to control how long an IP stays banned, and <code>findtime<\/code> to control the window of time <code>maxretry<\/code> failures need to occur within. If omitted, Fail2ban uses the defaults defined elsewhere in your configuration (commonly a 10-minute ban with Fail2ban&#8217;s out-of-the-box defaults, though this varies by version and prior configuration).<\/p>\n<\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\">V. Verify the Log Path Matches Your System<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The <code>logpath<\/code> value above assumes Pure-FTPd logs to <code>\/var\/log\/syslog<\/code>, which is common on Ubuntu when Pure-FTPd is configured to log via syslog. However, this can vary depending on how Pure-FTPd was installed and configured. Confirm the actual log location before restarting Fail2ban:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sudo grep -i pure-ftpd \/var\/log\/syslog | tail -5\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">If you see recent Pure-FTPd log entries, the path is correct. If not, check your Pure-FTPd configuration for a custom log path \u2014 commonly <code>\/var\/log\/pure-ftpd\/<\/code> \u2014 and update the <code>logpath<\/code> value in your jail configuration to match.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">VI. Restart Fail2ban<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Apply the new configuration by restarting the Fail2ban service:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sudo systemctl restart fail2ban\n<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">VII. Verify the PureFTPd Jail Is Active<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Confirm that Fail2ban picked up the new jail:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">fail2ban-client status\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">You should see <code>pureftpd<\/code> listed among the active jails. For more detail on that specific jail \u2014 including how many IPs are currently banned \u2014 run:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">fail2ban-client status pureftpd\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This shows the filter and log file in use, along with any currently banned IP addresses.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">VIII. Test the Configuration<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">It&#8217;s worth confirming the jail actually works rather than assuming it does. From a separate machine (not one you rely on for legitimate access, in case something goes wrong), attempt to log in to the FTP server with an incorrect password several times in a row \u2014 enough to exceed the <code>maxretry<\/code> value you configured.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Then check the jail status again:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">fail2ban-client status pureftpd\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">You should see the test IP address listed under &#8220;Banned IP list.&#8221; If it isn&#8217;t showing up, double-check the log path from Step V and confirm Pure-FTPd is actually logging failed attempts in the format Fail2ban&#8217;s filter expects.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">IX. Unban an IP (If Needed)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">If you ever need to manually remove a ban \u2014 for example, after confirming a legitimate user was mistakenly blocked \u2014 use:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sudo fail2ban-client set pureftpd unbanip &lt;IP_ADDRESS>\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Replace <code>&lt;IP_ADDRESS&gt;<\/code> with the actual banned address.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">X. Common Troubleshooting Issues<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>The pureftpd jail doesn&#8217;t appear in <code>fail2ban-client status<\/code>:<\/strong> Double-check that <code>enabled = true<\/code> is actually set under the <code>[pureftpd]<\/code> block, and confirm there are no syntax errors elsewhere in <code>jail.local<\/code> \u2014 a single misplaced line can sometimes prevent the entire file from loading correctly.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Fail2ban restarts successfully but never bans anything:<\/strong> This almost always comes down to the <code>logpath<\/code> not matching where Pure-FTPd is actually writing its logs, or the filter&#8217;s regex pattern not matching your specific Pure-FTPd log format\/version. Re-check Step V, and consider testing the filter directly with <code>fail2ban-regex<\/code>:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">fail2ban-regex \/var\/log\/syslog \/etc\/fail2ban\/filter.d\/pureftpd.conf\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This command shows exactly how many lines matched the filter pattern, which is useful for confirming whether the issue is the log path or the filter itself.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Legitimate users are getting banned too easily:<\/strong> Consider raising <code>maxretry<\/code> slightly, or increasing <code>findtime<\/code> so that occasional typos don&#8217;t trigger a ban as quickly as a genuine brute-force attempt would.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">XI. Customizing Ban Actions<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">By default, Fail2ban bans IPs using firewall rules (via <code>iptables<\/code>, <code>nftables<\/code>, or <code>firewalld<\/code>, depending on your system configuration), which simply drops traffic from the offending address. But Fail2ban&#8217;s &#8220;actions&#8221; are configurable, and it&#8217;s worth knowing what else is available:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Send an email notification on ban:<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Fail2ban can notify you whenever a ban occurs, which is useful for keeping an eye on attack patterns without manually checking status output. This requires a working mail setup on your server, then adding an action like:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">[pureftpd]\nenabled  = true\nport     = ftp\nfilter   = pureftpd\nlogpath  = \/var\/log\/syslog\nmaxretry = 3\naction   = %(action_mw)s\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The <code>action_mw<\/code> action bans the IP and sends an email with a <code>whois<\/code> report about it \u2014 useful context for understanding whether an attack is coming from a known hosting provider, residential ISP, or a known malicious range.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Increase ban time for repeat offenders:<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Newer versions of Fail2ban support &#8220;recidive&#8221; jails, which specifically watch Fail2ban&#8217;s own log for IPs that get banned repeatedly across any jail, and apply a much longer ban the second time around. This is a more advanced setup, but worth exploring once your basic PureFTPd jail is confirmed working, since it meaningfully raises the cost of persistent attackers without added maintenance once configured.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">XII. Reviewing Fail2ban Logs<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Beyond checking jail status, Fail2ban keeps its own log file that records every ban, unban, and filter match \u2014 useful for auditing activity over time or diagnosing why a particular IP wasn&#8217;t banned when you expected it to be.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sudo tail -f \/var\/log\/fail2ban.log\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Watching this file live while intentionally triggering a few failed logins (as in the testing step above) is one of the most reliable ways to confirm the entire pipeline \u2014 from log line, to filter match, to ban action \u2014 is working end to end.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You can also filter the log for just PureFTPd-related entries:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sudo grep pureftpd \/var\/log\/fail2ban.log\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This shows a clean history of every match and ban action taken specifically by this jail, which is helpful when you want to confirm the jail has actually been active over time, not just enabled in configuration.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">XIII. Best Practices for FTP and Fail2ban Security<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">A few additional steps worth considering alongside this Fail2ban configuration:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Prefer SFTP\/FTPS over plain FTP where possible.<\/strong> Plain FTP transmits credentials unencrypted, so even with Fail2ban blocking brute-force attempts, credentials sent over an unencrypted connection remain vulnerable to interception on an untrusted network.<\/li>\n\n\n\n<li><strong>Set a reasonable <code>bantime<\/code>.<\/strong> A longer ban time (hours, rather than minutes) meaningfully raises the cost of a brute-force attempt without much downside for legitimate users, who rarely fail login three times in a row anyway.<\/li>\n\n\n\n<li><strong>Monitor banned IPs periodically.<\/strong> Reviewing <code>fail2ban-client status pureftpd<\/code> occasionally can reveal patterns \u2014 like the same IP range attacking repeatedly \u2014 that might warrant a broader firewall rule.<\/li>\n\n\n\n<li><strong>Keep Fail2ban and Pure-FTPd updated.<\/strong> Both filter patterns and known vulnerabilities change over time; staying current ensures the filter continues to match actual log formats and that known security issues are patched.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">XIV. Conclusion<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Adding Pure-FTPd to Fail2ban on Ubuntu is a quick, high-value change: copy the filter, define a jail with a sensible <code>maxretry<\/code> threshold, confirm the log path matches your actual Pure-FTPd configuration, and restart the service. Once verified with a real test, Fail2ban will automatically block IP addresses that repeatedly fail to authenticate \u2014 cutting down on brute-force login attempts without requiring any ongoing manual effort.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For more background on Fail2ban&#8217;s configuration options and available filters, see the official Fail2ban documentation.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Frequently Asked Questions<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Does Fail2ban work with FTPS or only plain FTP?<\/strong> Fail2ban itself works at the log-monitoring level, so it can protect FTPS the same way, as long as Pure-FTPd&#8217;s failed-login log format matches what the filter expects. The <code>port<\/code> setting in your jail may need adjusting if FTPS uses a different port than standard FTP in your configuration.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>How long should I set the ban time for?<\/strong> There&#8217;s no universal answer, but many admins use anywhere from 1 hour to 24 hours for a first offense, with some Fail2ban configurations supporting escalating ban times for repeat offenders. Longer bans meaningfully deter automated attacks with minimal impact on real users, who rarely need to retry logins that many times.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Can I protect multiple services with Fail2ban at the same time?<\/strong> Yes \u2014 Fail2ban supports running many independent jails simultaneously, each targeting a different service (SSH, FTP, a web application login form, etc.), all defined in the same <code>jail.local<\/code> file as separate <code>[jail-name]<\/code> blocks.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What happens if I ban my own IP address by accident during testing?<\/strong> Use the <code>fail2ban-client set &lt;jail-name&gt; unbanip &lt;IP_ADDRESS&gt;<\/code> command from Step IX to remove the ban immediately, assuming you still have another way to access the server (like a separate SSH session or your hosting provider&#8217;s console) while it&#8217;s in effect.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Why does my jail show as enabled but never actually bans any IPs, even during a real attack?<\/strong> This is almost always a mismatch between what the filter&#8217;s regex expects and what your Pure-FTPd version actually writes to the log. Log formats can differ slightly between Pure-FTPd versions and configurations (for example, whether it logs via syslog, a dedicated log file, or a custom format string). Running <code>fail2ban-regex<\/code> against your actual log file, as shown in the troubleshooting section, is the fastest way to confirm whether the filter is matching anything at all \u2014 if it reports zero matches against lines you know represent failed logins, the filter pattern itself likely needs adjusting for your specific Pure-FTPd version.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Talk to Our Technology Experts<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Hardening your server against brute-force attacks? Our team can help with firewall configuration, server hardening, and ongoing security monitoring.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/pheonixsolutions.com\/contact\">Connect with our technology experts.<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Related Articles<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/pheonixsolutions.com\/blog\/block-wordpress-login-attacks-csf\/\">Block WordPress Login Attacks on CSF<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/pheonixsolutions.com\/blog\/change-ssh-default-port-disable-ssh-root-login\/\">Change SSH Default Port and Disable SSH Root Login<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduction This guide explains how to add PureFTPd service to Fail2ban on Ubuntu, so that repeated failed login attempts against [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[1022],"tags":[348,274],"class_list":["post-1682","post","type-post","status-publish","format-standard","hentry","category-web-architecture","tag-fail2ban","tag-ubuntu","psol-cat-web-architecture"],"jetpack_publicize_connections":[],"jetpack_shortlink":"https:\/\/wp.me\/phn2x7-r8","jetpack_sharing_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/pheonixsolutions.com\/blog\/wp-json\/wp\/v2\/posts\/1682","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pheonixsolutions.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/pheonixsolutions.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/pheonixsolutions.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/pheonixsolutions.com\/blog\/wp-json\/wp\/v2\/comments?post=1682"}],"version-history":[{"count":3,"href":"https:\/\/pheonixsolutions.com\/blog\/wp-json\/wp\/v2\/posts\/1682\/revisions"}],"predecessor-version":[{"id":11443,"href":"https:\/\/pheonixsolutions.com\/blog\/wp-json\/wp\/v2\/posts\/1682\/revisions\/11443"}],"wp:attachment":[{"href":"https:\/\/pheonixsolutions.com\/blog\/wp-json\/wp\/v2\/media?parent=1682"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/pheonixsolutions.com\/blog\/wp-json\/wp\/v2\/categories?post=1682"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/pheonixsolutions.com\/blog\/wp-json\/wp\/v2\/tags?post=1682"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}