Setting up an FTP server on Ubuntu yourself is a pretty standard way to move files around.Setting up an FTP server on Ubuntu yourself is a pretty standard way to move files around. You'll typically grab a package like vsftpd or ProFTPD, install it, lock down the security settings, create some user accounts, and poke a hole in your firewall to let traffic through.
Why Ubuntu Is a Solid Foundation for Your FTP Server
Before we jump into the terminal commands, let's talk about why so many people choose Ubuntu for this job. When you're managing projects for clients or handling important files, you need an operating system that's rock-solid. Ubuntu has built its reputation on being dependable and secure, making it a go-to for anything that involves sensitive data.
A huge part of that reliability comes from its Long-Term Support (LTS) releases. These versions come with a guarantee of five years of free security patches and updates. This means your server stays safe from new threats without you needing to perform major, risky upgrades all the time. It’s a set-it-and-forget-it kind of peace of mind.
The Power of Community and Software Access
Beyond just being stable, Ubuntu's massive software library makes life a lot easier. Installing an FTP server on Ubuntu, whether you pick vsftpd or ProFTPD, is dead simple. A quick apt-get command is all it takes to get the software up and running. No more hunting for obscure packages or compiling things from source.
The fact that Ubuntu is so popular in the server world is a massive advantage. As of December 2025, Ubuntu powers 13.7% of all Linux-based web servers globally, making it the undisputed leader. You can find more details on the Linux server market share over at Commandlinux.com.
What this really means is that when you hit a wall—a confusing config option or a weird error—someone else has probably already been there, solved it, and written about it online. That community support is a lifesaver and can shave hours off your troubleshooting time.
The Manual Route vs a Managed Solution
Rolling your own FTP server gives you total control, but that control comes with responsibility. You're on the hook for everything: creating users, setting up SSL/TLS encryption, configuring firewall rules, and keeping it all updated. This guide will walk you through exactly how to do that, but it's good to know there's another way.
I've been in the trenches with server setups for years, and while the DIY approach is powerful, it's not always the most efficient use of your time. This is especially true when you just need a secure, reliable way to transfer files without the headache of ongoing server administration.
Here’s a quick breakdown of what you're getting into with a manual setup versus letting a service handle it for you.
Manual FTP Setup vs Managed SFTP with WPJack
| Feature | Manual FTP Server (DIY) | Managed SFTP (WPJack) |
|---|---|---|
| Initial Setup Time | Hours to days, depending on experience and security needs. | Minutes. The SFTP server is ready when the server is built. |
| Security | Your responsibility. Requires manual TLS/SSL & firewall setup. | Handled for you. Secure by default with isolated users. |
| User Management | Manual creation and permission setting via command line. | Simple, one-click user creation from a web panel. |
| Ongoing Maintenance | You must apply all security patches and software updates. | Fully managed and automatically updated by the platform. |
| Technical Skill | Requires strong Linux command-line and networking knowledge. | Minimal. Perfect for developers and agencies, not sysadmins. |
| Best For | Sysadmins who need full, granular control over the environment. | Anyone who values speed, security, and simplicity. |
Platforms like WPJack offer a different path. You get a pre-configured, optimized Ubuntu stack where a secure SFTP server is ready to go the moment you spin up a machine. It completely sidesteps the manual setup and the risk of misconfiguration. If you're managing virtual machines for clients, this kind of managed solution can free up a ton of your time.
Alright, let's get our hands dirty and build an actual FTP server on Ubuntu. We'll be using vsftpd, which stands for "Very Secure FTP Daemon." It’s my go-to and the default in Ubuntu's repositories for a reason: it's light, incredibly stable, and was built from the ground up with security in mind.

Getting VSFTPD Installed
First thing's first—we need to get the software onto our server. Like most things in Ubuntu, this part is dead simple. Pop open your terminal and fire off these commands to update your package list and install vsftpd.
sudo apt update
sudo apt install vsftpd
That's it. The vsftpd service should start up automatically right after it's installed. I always like to double-check its status just to be sure everything is running smoothly before I start tweaking things.
sudo systemctl status vsftpd
If you see a green "active (running)" message, you're golden. If not, a quick sudo systemctl start vsftpd will get it going, and sudo systemctl enable vsftpd will make sure it starts up every time you reboot.
Diving into the Configuration File
The heart of your new FTP server lives in one single file: /etc/vsftpd.conf. This is where we'll set the rules and tell the server exactly how to behave. Before you touch anything, do yourself a favor and make a backup. Trust me, it can save you a huge headache later if a change goes wrong.
sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.original
With a safety net in place, open the file with your editor of choice. I'm a nano guy, but you can use whatever you're comfortable with.
sudo nano /etc/vsftpd.conf
You'll see a lot of lines, most of them commented out with a #. We're just going to change a few key settings to get a secure and functional server up and running.
Setting Up a Secure Foundation
By default, vsftpd is already pretty locked down, which is great. Our first move is to dial in a few essential settings to make sure it's secure but still useful for our team or clients.
Here are the non-negotiable first steps:
Disable Anonymous Access: Unless you're running a public file archive (and you're probably not), you almost never want anonymous users sniffing around. Find this line and make absolutely sure it's set to
NO.anonymous_enable=NOAllow Local User Logins: This is what lets actual users with accounts on your server log in. It's the whole point, really. Uncomment this line or set it to
YES.local_enable=YESPermit File Uploads: What good is an FTP server if you can't upload anything? Find the
write_enabledirective, uncomment it, and set it toYES.write_enable=YES
These three settings are the absolute baseline for a standard, user-authenticated FTP server. Get these right, and you've got a solid foundation.
Pro Tip: I've seen countless people get stuck here. After you save and close the
/etc/vsftpd.conffile, your changes do nothing until you restart the service. You must run this command to apply your new rules.
sudo systemctl restart vsftpd
Understanding Your Configuration
Every line in vsftpd.conf has a purpose. For example, listen=YES (or listen_ipv6=YES on newer systems) tells the daemon to run in standalone mode, which is standard practice. Another one you'll see is connect_from_port_20=YES, which is related to the old-school "active" FTP mode—we'll touch on that later.
Right now, you have a working server where your local Ubuntu users can log in with their system passwords to manage files. It's a solid start, but we haven't locked users into their own directories or configured things like encryption. We'll get to that next.
If this level of manual server configuration feels a bit tedious, especially when you're managing multiple WordPress sites, it might be worth checking out how to provision a web server and install WordPress with minimal effort. Platforms like WPJack automate all of this, giving you a secure SFTP server right out of the box without you ever having to touch a config file.
Securing FTP Transfers with SSL and TLS Encryption
Alright, you've got a functional FTP server on Ubuntu, but we need to tackle a major security hole right now. Standard FTP is a bit like sending a postcard—anyone who intercepts it can read everything. That means usernames, passwords, and your files are all sent in plain text. It's a massive risk, especially if you're handling sensitive client data.
The fix is to enable FTP over SSL/TLS, which you'll often see called FTPS. This wraps your entire FTP session in strong encryption, just like the lock icon on your banking website. For any professional setup, this is absolutely non-negotiable. We'll get this done by creating our own self-signed certificate using OpenSSL.

Generating Your SSL Certificate
First things first, we need to generate the certificate and private key vsftpd will use to encrypt connections. It looks like a long command, but don't worry, I'll break down exactly what's happening.
Jump into your terminal and run this:
sudo openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /etc/ssl/private/vsftpd.pem -out /etc/ssl/private/vsftpd.pem
So, what's this monster of a command actually doing?
openssl req -x509: This tells OpenSSL to create a self-signed certificate.-nodes: This part is important. It skips adding a passphrase to the private key. While a passphrase adds security, it also means you'd have to type it in every timevsftpdrestarts, which is a real pain for a server.-days 3650: We're setting the certificate to be valid for 10 years, so you can set it and forget it.-newkey rsa:2048: This generates a fresh 2048-bit RSA private key, a strong industry standard.-keyoutand-out: We're pointing both options to the same file (/etc/ssl/private/vsftpd.pem), which handily combines the private key and public certificate into one file forvsftpd.
OpenSSL will then ask you for details like your country, city, and so on. Since this is just a self-signed certificate for our own server, feel free to put in placeholder info or just hit Enter to accept the defaults.
Updating VSFTPD to Use Encryption
Now that our certificate is ready, we need to tell our FTP server on Ubuntu to actually use it. This means jumping back into the /etc/vsftpd.conf file to add a few lines.
Let's open it up for editing again:
sudo nano /etc/vsftpd.conf
I always like to scroll to the very bottom of the file to add custom settings. It just keeps things clean and separate from the default configuration.
Paste these lines in:
SSL/TLS Configuration
ssl_enable=YES
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
ssl_tlsv1_2=YES
ssl_sslv2=NO
ssl_sslv3=NO
rsa_cert_file=/etc/ssl/private/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.pem
These settings are critical for locking things down:
ssl_enable=YES: The main switch to turn on SSL/TLS.force_local_data_ssl=YESandforce_local_logins_ssl=YES: These are the key players. They force both logins (credentials) and data transfers to be encrypted. Any unencrypted connection attempts will be flat-out rejected.ssl_tlsv1_2=YES: We're specifically enabling a modern, secure protocol (TLS v1.2) and disabling the old, vulnerable ones like SSLv2 and SSLv3.rsa_cert_fileandrsa_private_key_file: These just pointvsftpdto the certificate and key file we just created.
Once you've added the new lines, save the file and close the editor. Now, for the changes to take effect, we have to restart the service.
sudo systemctl restart vsftpd
And that's it! Your server will now enforce encrypted FTPS connections. To be absolutely sure your defenses are solid after making these changes, it’s a good idea to consider professional penetration testing services to proactively find any hidden weaknesses. This gives you peace of mind that your data is properly protected against real-world threats.
How to Create and Manage Dedicated FTP Users
One of the biggest security blunders you can make is using your main server account for FTP. Seriously, don't do it. If someone compromises that login, they've got the keys to the entire kingdom. The right way—the only way—is to create separate, locked-down users just for FTP.
This is all about the principle of least privilege. It’s a foundational concept in server security. You only give users access to the specific files and folders they absolutely need, and nothing more. This simple rule stops accidents in their tracks and dramatically shrinks the blast radius if an account ever gets compromised.
Our goal here is to set up what's known as a "chroot jail." It sounds intense, but it's a brilliant way to isolate users. Imagine putting a user inside a virtual box; once they're in their home directory, they can't browse around the rest of the server. It's an incredibly effective way to keep users walled off from each other and from your critical system files.
Creating Your First Dedicated FTP User
Let's get practical. Say you've got a client, "acme_corp," who needs to upload files for their website. We'll create a dedicated user for them called acme_ftp.
First up, we'll create the user with adduser. The -m flag is important as it creates a home directory. But the real security magic is -s /usr/sbin/nologin, which stops this user from ever logging in via SSH. This account is for FTP and FTP alone.
sudo adduser --home /var/www/acme_corp --shell /usr/sbin/nologin acme_ftp
The system will then prompt you to set a strong password. Nail that down, and then you can just press Enter to skip through the optional user info fields.
Okay, the user exists, but now we hit a common stumbling block: permissions. vsftpd is super picky about security. It will flat-out refuse a login if the user's chroot jail directory is writable by them.
To get around this, we'll just remove the write permission from the user's top-level directory:
sudo chmod a-w /var/www/acme_corp
But wait, where do they upload files? Simple. We create a new folder inside their home directory that they do have write access to.
sudo mkdir /var/www/acme_corp/filessudo chown acme_ftp:acme_ftp /var/www/acme_corp/files
This little permissions dance keeps vsftpd happy and gives your user a dedicated spot to drop their files. Problem solved.
Enabling the Chroot Jail in VSFTPD
With our user ready to go, the final piece of the puzzle is telling our FTP server on Ubuntu to lock them in their jail. This just takes a few quick edits to our /etc/vsftpd.conf file.
Pop open the configuration file one more time:
sudo nano /etc/vsftpd.conf
Head to the bottom of the file and paste in these settings to get the chroot environment working:
Chroot Jail Configuration
chroot_local_user=YES
allow_writeable_chroot=YES
user_sub_token=$USER
local_root=/var/www/$USER
Here’s a quick rundown of what’s happening:
chroot_local_user=YES: This is the master switch. It tellsvsftpdto jail all local users.allow_writeable_chroot=YES: This is a newer setting that can help with some permission headaches, but honestly, thechmodtrick we did earlier is still the best way to handle it.user_sub_token=$USER&local_root=/var/www/$USER: These two work together beautifully. They dynamically set the root directory based on the username. Whenacme_ftplogs in,$USERbecomesacme_ftp, and their root is automatically set to/var/www/acme_ftp.
Once you've added those lines, save the file and give the service a final restart to make the changes stick.
sudo systemctl restart vsftpd
And that's it! The next time acme_ftp logs in, they'll be dropped straight into /var/www/acme_corp with no way to navigate out. They can see what's in that folder but can only upload new content into the files subdirectory we created.
Setting up FTP on Ubuntu has changed a lot over the years, shifting from tedious manual setups to slick cloud-based workflows. The numbers back this up, too. Projections show that by 2026, Ubuntu will power 13.7% of Linux web servers and a whopping 33.9% of all general deployments, highlighting its central role in file sharing worldwide. You can dig deeper into these Linux server market trends to see what this means for developers.
This isolated user setup is a game-changer for securely managing access for different clients or team members, making it a must-have skill for anyone running a server with multiple users.
Configuring Your Firewall for Passive FTP Mode
If you've just set up an FTP server on Ubuntu and can't connect, I can almost guarantee it's a firewall issue. It usually comes down to the classic conflict between active and passive FTP modes, which can leave you staring at a frustrating "connection timed out" error. Let's get this sorted.
Back in the day, active mode FTP was the only game in town. The client would tell the server which port to connect back to for transferring files. This is a massive headache for any modern network because firewalls see that unsolicited connection from the server as a potential attack and slam the door shut.
This is exactly where passive mode comes to the rescue. Instead of the server trying to connect back to you, your client initiates both connections—one for commands and another for data. For this to work, we just need to tell vsftpd which ports it can use for data and then open that specific range in the firewall.
Defining a Passive Port Range
First things first, let's pop back into our vsftpd config file. We need to define a small, specific range of ports for these passive connections. For a small or medium-sized server, a range of 100 ports is more than enough.
Open up the configuration file again:
sudo nano /etc/vsftpd.conf
Now, scroll to the bottom and add these two lines. This tells vsftpd to use any port between 40000 and 40100 for passive data transfers.
Passive Mode Configuration
pasv_min_port=40000
pasv_max_port=40100
By setting a tight range like this, we're avoiding the bad practice of leaving thousands of ports wide open. It’s a simple but important security step.
Don’t forget to restart the vsftpd service to make the changes stick.
sudo systemctl restart vsftpd
Updating UFW Firewall Rules
With vsftpd ready, it's time to tell Ubuntu's Uncomplicated Firewall (UFW) about our new setup. We need to make sure the standard FTP control ports (20 and 21) are open, along with our new passive port range.
Run these commands one by one in your terminal:
sudo ufw allow 20/tcp
sudo ufw allow 21/tcp
sudo ufw allow 40000:40100/tcp
The first two commands handle the standard FTP traffic. The third one is the key to making passive mode work, opening our entire 40000-40100 range for incoming TCP connections. Once that's done, you can double-check that the rules are active with sudo ufw status. This is my go-to first step for troubleshooting connection problems.
This flowchart gives you a high-level view of the process you'd follow for a new user, from creation to connection.
As you can see, getting the user set up correctly before they even try to connect is just as important as the firewall rules.
From my experience, properly setting up passive mode and the firewall solves over 90% of common FTP connectivity issues. It’s what lets clients behind home routers and office firewalls reliably connect to your server every time.
These firewall settings are a core part of managing a server. If you want to understand how this connects to your server's public identity, our guide on what a server address is helps tie it all together, explaining how the world finds your server in the first place.
Understanding SFTP as a More Secure Alternative
While setting up an FTPS server is a great security step up, it's worth knowing about its modern successor: SFTP, or SSH File Transfer Protocol. It’s a common mix-up to think SFTP is just another flavor of FTP. The reality is, they are completely different protocols built on entirely different foundations.
The biggest win with SFTP is that it doesn't use the fussy, wide-open port ranges that traditional FTP needs. Instead, it piggybacks on the same secure shell (SSH) connection you already use to manage your server. This gives you a couple of massive advantages right out of the gate.
- Dramatically Simpler Firewall Rules: SFTP operates over a single port—typically port 22—which you almost certainly have open for SSH access anyway. This completely sidesteps the headache of configuring passive port ranges and complex firewall rules.
- Rock-Solid Authentication: Because SFTP uses SSH, you can leverage SSH key-based authentication. This is leagues more secure than relying on passwords alone and makes your server significantly tougher to crack with brute-force attacks.
Why Managed Platforms Default to SFTP
The shift toward SFTP on Ubuntu servers makes perfect sense when you look at how dominant Linux is in web hosting. A staggering 96.3% of the top one million web servers run on Linux, and Ubuntu is a huge part of that ecosystem. You can dig into more of the numbers in these Linux market statistics and trends to get the full scope.
This is exactly why managed platforms like WPJack make SFTP the standard, no-questions-asked default. When you spin up a server with WPJack, a secure SFTP environment is provisioned for you automatically.
You get isolated, chrooted user accounts and key-based authentication from the get-go, without ever needing to touch a single configuration file. It’s not just about saving time; it's about enforcing security best practices from day one and avoiding the common pitfalls of a manual setup.
Common Questions About Ubuntu FTP Servers
Even after following a guide, you'll probably have a few questions. I know I did when I first started. Let's walk through some of the common snags people hit when setting up an FTP server on Ubuntu.
FTP vs. FTPS vs. SFTP: What's the Difference?
This is, without a doubt, the most frequent point of confusion. It's easy to lump them all together, but they are fundamentally different, especially when it comes to security.
- FTP (File Transfer Protocol): This is the old-school original. It gets the job done and it's fast, but it sends everything—including your username and password—in plain text. Anyone listening in can see your credentials.
- FTPS (FTP over SSL/TLS): Think of this as standard FTP with a modern security upgrade. It wraps the entire connection in an encryption layer, protecting your login details and files from prying eyes.
- SFTP (SSH File Transfer Protocol): This one's the odd one out because it's not actually FTP. It's a completely separate protocol that runs over the secure SSH connection you already use to manage your server (usually on port 22). It's the modern, secure standard.
The big takeaway here is that SFTP is not just a secure version of FTP. It’s a different beast entirely, leveraging the rock-solid security of SSH. It's why most managed platforms, like WPJack, default to SFTP out of the box.
How Do I Fix the VSFTPD "Writable Root" Error?
Ah, the dreaded 500 OOPS: vsftpd: refusing to run with writable root inside chroot() error. If you're setting up chroot jails, you've almost certainly run into this. It feels like a bug, but it's actually a critical security feature. vsftpd is stopping you from giving a user write access to the top level of their own sandboxed directory.
Luckily, the fix is pretty simple. You just need to revoke the write permission on the user's home directory itself. Then, inside that directory, you create a new subfolder (say, uploads or files) and give the user write permissions there. This keeps vsftpd happy and still gives your user a place to upload their files.
Can I Use SSH Keys with VSFTPD?
Short answer: Nope.
VSFTPD is built for the classic username and password login. It doesn't know how to talk to the SSH authentication system, so SSH keys are off the table.
If you're looking for the superior security of key-based authentication, you need to be using SFTP. Because SFTP is part of the standard OpenSSH server that comes with Ubuntu, it supports SSH keys right out of the box. It’s a much more secure way to handle file transfers than relying on passwords.
Juggling server configs, user permissions, and firewall rules can quickly eat up your day. WPJack was built to handle all of that for you. It provisions a secure, performance-tuned Ubuntu server with SFTP ready to go in minutes. You can skip the command line entirely and manage all your WordPress sites from one clean dashboard. Take a look at how we simplify server management at https://wpjack.com.
Free Tier includes 1 server and 2 sites.