{"id":14193,"date":"2025-12-27T12:07:13","date_gmt":"2025-12-27T06:37:13","guid":{"rendered":"https:\/\/www.youstable.com\/blog\/?p=14193"},"modified":"2025-12-27T12:07:15","modified_gmt":"2025-12-27T06:37:15","slug":"create-ftp-on-linux","status":"publish","type":"post","link":"https:\/\/www.youstable.com\/blog\/create-ftp-on-linux","title":{"rendered":"How to Create FTP on Linux Server in 2026? &#8211; (Step by Step Guide)"},"content":{"rendered":"\n<p><strong>To create FTP on a Linux server<\/strong>, install the vsftpd package, add an FTP user, harden vsftpd.conf (disable anonymous, chroot users, enable passive mode), open firewall and passive ports, enable TLS for FTPS, then start and test the service with a client like FileZilla. Use SFTP when security or compliance is a priority.<\/p>\n\n\n\n<p>In this guide, you\u2019ll learn how to create FTP on a Linux server securely using vsftpd. We\u2019ll cover <strong>Ubuntu\/Debian and RHEL\/CentOS\/Rocky<\/strong>, add users, configure passive mode, enable FTPS, handle firewalls and SELinux, and troubleshoot common errors. As a hosting team at YouStable, we deploy this setup daily on production servers.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"what-youll-need\"><strong>What You\u2019ll Need<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>A Linux server (Ubuntu\/Debian or RHEL\/CentOS\/Rocky\/AlmaLinux)<\/li>\n\n\n\n<li>Root or sudo access<\/li>\n\n\n\n<li>Open ports: 21\/TCP and a passive range (e.g., 30000\u201331000\/TCP)<\/li>\n\n\n\n<li>A domain or server IP<\/li>\n\n\n\n<li>Optional: A TLS certificate (self-signed or from <a href=\"https:\/\/www.youstable.com\/blog\/what-is-lets-encrypt-on-linux-server\/\">Let\u2019s Encrypt<\/a>) for FTPS<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"ftp-vs-sftp-vs-ftps-what-to-choose\"><strong>FTP vs SFTP vs FTPS: What to Choose<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>FTP (port 21):<\/strong> Unencrypted; fine for trusted internal networks, not recommended over the internet.<\/li>\n\n\n\n<li><strong>FTPS (FTP over TLS)<\/strong>: Adds encryption to FTP; works with most GUI clients and legacy workflows.<\/li>\n\n\n\n<li><strong>SFTP (SSH File Transfer): <\/strong>Different protocol <a href=\"https:\/\/www.youstable.com\/blog\/how-to-connect-to-server-via-ssh\/\"><strong>via SSH<\/strong><\/a> (port 22), simpler through firewalls and typically more secure by design. Preferred for modern setups.<\/li>\n<\/ul>\n\n\n\n<p>We\u2019ll configure vsftpd with TLS (FTPS). If you only need secure file transfer and you already have SSH, consider SFTP as a simpler, safer alternative.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"step-by-step-install-and-configure-vsftpd\"><strong>Step-by-Step: Install and Configure vsftpd<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"step-1-install-vsftpd\"><strong>Step 1 \u2014 Install vsftpd<\/strong><\/h3>\n\n\n\n<p><strong>Ubuntu\/Debian:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt update\nsudo apt install -y vsftpd<\/code><\/pre>\n\n\n\n<p><strong>RHEL\/CentOS\/Rocky\/AlmaLinux:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo dnf install -y vsftpd\n# or on older systems:\n# sudo <a href=\"https:\/\/www.youstable.com\/blog\/install-yum-on-linux\/\">yum install<\/a> -y vsftpd<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"step-2-create-an-ftp-user-and-directory\"><strong>Step 2 \u2014 Create an FTP User and Directory<\/strong><\/h3>\n\n\n\n<p>Create a dedicated system user for FTP uploads. Avoid using root.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Create user and set password\nsudo adduser ftpuser\n# or on RHEL-based:\n# sudo useradd -m ftpuser &amp;&amp; sudo passwd ftpuser\n\n# Create an uploads directory and set ownership\nsudo mkdir -p \/home\/ftpuser\/uploads\nsudo chown ftpuser:ftpuser \/home\/ftpuser\/uploads\nsudo chmod 755 \/home\/ftpuser\nsudo chmod 755 \/home\/ftpuser\/uploads<\/code><\/pre>\n\n\n\n<p>Tip: vsftpd\u2019s chroot mode requires the user\u2019s home directory not be writable. We keep the home non-writable and create a writable subdirectory like uploads.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"step-3-secure-vsftpd-configuration\"><strong>Step 3 \u2014 Secure vsftpd Configuration<\/strong><\/h3>\n\n\n\n<p>Back up the default configuration, then apply a hardened baseline.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo cp \/etc\/vsftpd.conf \/etc\/vsftpd.conf.bak\nsudo nano \/etc\/vsftpd.conf<\/code><\/pre>\n\n\n\n<p><strong>Add or update these lines:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>listen=YES\nlisten_ipv6=NO\n\nanonymous_enable=NO\nlocal_enable=YES\nwrite_enable=YES\n\n# Chroot users to home; ensure home is not writable (use subdirs for writes)\nchroot_local_user=YES\nallow_writeable_chroot=NO\n\n# Passive mode for NAT\/cloud environments\npasv_enable=YES\npasv_min_port=30000\npasv_max_port=31000\n\n# Security hardening\nuser_sub_token=$USER\nlocal_root=\/home\/$USER\nhide_ids=YES\nuse_localtime=YES\nutf8_filesystem=YES\n\n# Logging\nxferlog_enable=YES\nxferlog_std_format=NO\nlog_ftp_protocol=YES\nvsftpd_log_file=\/var\/log\/vsftpd.log\n\n# Restrict which users can log in (create userlist file)\nuserlist_enable=YES\nuserlist_deny=NO\nuserlist_file=\/etc\/vsftpd.userlist<\/code><\/pre>\n\n\n\n<p><strong>Register the allowed user:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>echo \"ftpuser\" | sudo tee -a \/etc\/vsftpd.userlist<\/code><\/pre>\n\n\n\n<p><strong>Key notes:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>chroot_local_user=YES locks users into their home directory.<\/li>\n\n\n\n<li>allow_writeable_chroot=NO avoids security warnings; keep home non-writable but use writable subfolders.<\/li>\n\n\n\n<li>Passive mode is mandatory behind NAT and most cloud networks.<\/li>\n\n\n\n<li>userlist_deny=NO means only users listed can log in.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"step-4-firewall-and-passive-ports\"><strong>Step 4 \u2014 Firewall and Passive Ports<\/strong><\/h3>\n\n\n\n<p>Open port 21 and the passive range you set (30000\u201331000 in this example). Also allow these in your cloud security group (AWS, Azure, GCP).<\/p>\n\n\n\n<p><strong>UFW (Ubuntu\/Debian):<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo ufw allow 21\/tcp\nsudo ufw allow 30000:31000\/tcp\nsudo ufw reload\nsudo ufw status<\/code><\/pre>\n\n\n\n<p><strong>firewalld (RHEL-based):<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo firewall-cmd --permanent --add-port=21\/tcp\nsudo firewall-cmd --permanent --add-port=30000-31000\/tcp\nsudo firewall-cmd --reload\nsudo firewall-cmd --list-all<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"step-5-enable-tls-ftps\"><strong>Step 5 \u2014 Enable TLS (FTPS)<\/strong><\/h3>\n\n\n\n<p>Generate a certificate (use Let\u2019s Encrypt for production if you have a domain). <\/p>\n\n\n\n<p><strong>Here we create a self-signed cert:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \\\n  -keyout \/etc\/ssl\/private\/vsftpd.key \\\n  -out \/etc\/ssl\/certs\/vsftpd.crt \\\n  -subj \"\/C=US\/ST=State\/L=City\/O=Company\/OU=IT\/CN=$(hostname -f)\"<\/code><\/pre>\n\n\n\n<p><strong>Add TLS settings to \/etc\/vsftpd.conf:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ssl_enable=YES\nrsa_cert_file=\/etc\/ssl\/certs\/vsftpd.crt\nrsa_private_key_file=\/etc\/ssl\/private\/vsftpd.key\nallow_anon_ssl=NO\nforce_local_logins_ssl=YES\nforce_local_data_ssl=YES\nssl_tlsv1=YES\nssl_tlsv1_1=NO\nssl_tlsv1_2=YES\nrequire_ssl_reuse=NO\nssl_ciphers=HIGH<\/code><\/pre>\n\n\n\n<p><strong>Note:<\/strong> require_ssl_reuse=NO improves compatibility with many clients.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"step-6-start-and-enable-vsftpd\"><strong>Step 6 \u2014 Start and Enable vsftpd<\/strong><\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo systemctl enable --now vsftpd\nsudo systemctl status vsftpd<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"step-7-selinux-considerations-rhel-based\"><strong>Step 7 \u2014 SELinux Considerations (RHEL-based)<\/strong><\/h3>\n\n\n\n<p>If SELinux is enforcing, allow user home directories for FTP and mark ports if needed.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Allow FTP to read\/write user home directories\nsudo setsebool -P ftp_home_dir on\n\n# If you need full access (less strict):\n# sudo setsebool -P ftpd_full_access on\n\n# Label user home directories correctly (usually default is fine)\nsudo restorecon -R \/home\/ftpuser\n\n# If passive ports are custom, label them (if not recognized)\n# Install tools:\nsudo dnf install -y policycoreutils-python-utils\n# Then add passive ports:\nsudo semanage port -a -t ftp_port_t -p tcp 30000-31000 || \\\nsudo semanage port -m -t ftp_port_t -p tcp 30000-31000<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"step-8-test-with-cli-and-filezilla\"><strong>Step 8 \u2014 Test with CLI and FileZilla<\/strong><\/h3>\n\n\n\n<p><strong>Command line (lftp recommended for FTPS):<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>lftp -e \"set ftp:ssl-force true; set ftp:passive-mode true; ls; bye\" \\\n  -u ftpuser ftp:\/\/YOUR_SERVER_IP<\/code><\/pre>\n\n\n\n<p><strong>FileZilla:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Host:<\/strong> your domain or IP<\/li>\n\n\n\n<li><strong>Port:<\/strong> 21<\/li>\n\n\n\n<li><strong>Protocol:<\/strong> FTP \u2013 File Transfer Protocol<\/li>\n\n\n\n<li><strong>Encryption: <\/strong>Require explicit FTP over TLS<\/li>\n\n\n\n<li><strong>Logon Type:<\/strong> Normal (username\/password)<\/li>\n\n\n\n<li><strong>Transfer Settings:<\/strong> Passive mode<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"optional-per-user-rules-bandwidth-limits-and-anonymous-read-only\"><strong>Optional: Per-User Rules, Bandwidth Limits, and Anonymous Read-Only<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"allow-only-specific-users\"><strong>Allow Only Specific Users<\/strong><\/h3>\n\n\n\n<p>Already enabled via userlist. Add users as needed:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>echo \"anotheruser\" | sudo tee -a \/etc\/vsftpd.userlist<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"per-user-configuration\"><strong>Per-User Configuration<\/strong><\/h3>\n\n\n\n<p>Create files under \/etc\/vsftpd\/user_conf\/USERNAME to override settings for a specific user.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo mkdir -p \/etc\/vsftpd\/user_conf\necho \"local_root=\/var\/www\/project1\" | sudo tee \/etc\/vsftpd\/user_conf\/ftpuser<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"anonymous-read-only-not-recommended-on-internet\"><strong>Anonymous Read-Only (Not Recommended on Internet)<\/strong><\/h3>\n\n\n\n<p>If you must serve public files, enable anonymous read-only carefully:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>anonymous_enable=YES\nanon_upload_enable=NO\nanon_mkdir_write_enable=NO\nanon_root=\/var\/ftp\/pub<\/code><\/pre>\n\n\n\n<p><strong>Set permissions:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo mkdir -p \/var\/ftp\/pub\nsudo chown -R ftp:ftp \/var\/ftp\/pub\nsudo chmod -R 755 \/var\/ftp\/pub<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"security-hardening-best-practices\"><strong>Security Hardening Best Practices<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Prefer SFTP when possible; it\u2019s simpler and <a href=\"https:\/\/www.youstable.com\/blog\/how-to-monitor-secure-ssh-on-linux-server\/\">secure over SSH<\/a>.<\/li>\n\n\n\n<li>Use FTPS only with TLS enforced (force_local_logins_ssl=YES and force_local_data_ssl=YES).<\/li>\n\n\n\n<li>Disable anonymous access on public servers.<\/li>\n\n\n\n<li>Use strong, unique <a href=\"https:\/\/www.youstable.com\/blog\/ssh-keys-vs-password-authentication\/\">passwords or SSH keys<\/a> (for SFTP).<\/li>\n\n\n\n<li>Restrict logins to an allowlist with userlist_enable and userlist_deny=NO.<\/li>\n\n\n\n<li>Keep home dirs non-writable; use subfolders for uploads.<\/li>\n\n\n\n<li>Enable and monitor logs: \/var\/log\/vsftpd.log.<\/li>\n\n\n\n<li><a href=\"https:\/\/www.youstable.com\/blog\/install-fail2ban-on-linux\/\">Install Fail2Ban<\/a> to block brute-force attempts.<\/li>\n\n\n\n<li>Patch regularly: keep OS and vsftpd up to date.<\/li>\n\n\n\n<li>Back up configuration and test restores.<\/li>\n<\/ul>\n\n\n\n<p><strong>Basic Fail2Ban jail (example; adjust to your distro):<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Install Fail2Ban\nsudo apt install -y fail2ban  # Debian\/Ubuntu\n# sudo dnf install -y fail2ban  # RHEL-based\n\n# Create a simple jail for vsftpd\nsudo tee \/etc\/fail2ban\/jail.d\/vsftpd.local &gt;\/dev\/null &lt;&lt;'EOF'\n&#91;vsftpd]\nenabled = true\nport    = ftp,ftp-data,ftps,30000:31000\nfilter  = vsftpd\nlogpath = \/var\/log\/vsftpd.log\nmaxretry = 5\nbantime = 3600\nEOF\n\nsudo systemctl enable --now fail2ban<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"common-errors-and-fixes\"><strong>Common Errors and Fixes<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Connection timed out:<\/strong> Open port 21 and passive range in OS firewall and cloud security groups. Ensure pasv_min_port\/pasv_max_port are configured.<\/li>\n\n\n\n<li><strong>530 Login incorrect:<\/strong> Verify user exists, password is correct, and user is in \/etc\/vsftpd.userlist when userlist_deny=NO. Check PAM config at \/etc\/pam.d\/vsftpd.<\/li>\n\n\n\n<li><strong>500 OOPS: vsftpd: <\/strong>refusing to run with writable root inside chroot: Keep \/home\/USER non-writable. Set allow_writeable_chroot=NO and use a writable subdirectory.<\/li>\n\n\n\n<li><strong>FTPS handshake fails:<\/strong> Ensure require_ssl_reuse=NO and TLS ports are open; client should use \u201cRequire explicit FTP over TLS.\u201d<\/li>\n\n\n\n<li><strong>Stuck listing directories:<\/strong> Force passive mode in the client and ensure passive ports are allowed.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"sftp-alternative-recommended-for-most\"><strong>SFTP Alternative (Recommended for Most)<\/strong><\/h2>\n\n\n\n<p>If you don\u2019t need traditional FTP compatibility, SFTP is easier to secure and firewall. It uses SSH, supports key-based auth, and avoids separate passive ports. You can chroot SFTP users via OpenSSH\u2019s internal-sftp subsystem.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Example SFTP-only group with chroot\nsudo groupadd sftpusers\nsudo usermod -aG sftpusers ftpuser\nsudo nano \/etc\/ssh\/sshd_config\n\n# Add at the bottom:\nMatch Group sftpusers\n    ChrootDirectory \/home\/%u\n    ForceCommand internal-sftp\n    PasswordAuthentication yes\n    X11Forwarding no\n    AllowTcpForwarding no\n\nsudo chmod 755 \/home\/ftpuser\nsudo systemctl restart ssh<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"when-managed-hosting-helps\"><strong>When Managed Hosting Helps<\/strong><\/h2>\n\n\n\n<p>Running FTP\/FTPS reliably involves OS updates, TLS, firewalls, SELinux, and ongoing log monitoring. If you\u2019d rather focus on your website or apps, YouStable\u2019s managed Linux VPS and cloud servers come pre-hardened with SFTP\/FTPS options, automated backups, and 24\u00d77 support from engineers who do this daily.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"faqs\"><strong>FAQ&#8217;s<\/strong><\/h2>\n\n\n<div id=\"rank-math-faq\" class=\"rank-math-block\">\n<div class=\"rank-math-list \">\n<div id=\"faq-question-1765956419163\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \" class=\"rank-math-question \" id=\"is-ftp-or-sftp-better-for-a-linux-server\"><strong>Is FTP or SFTP better for a Linux server?<\/strong><\/h3>\n<div class=\"rank-math-answer \">\n\n<p>SFTP is generally better: it\u2019s encrypted by default, simpler to firewall (port 22 only), and integrates with SSH keys. Use FTPS (vsftpd with TLS) if you need legacy FTP compatibility with encryption. Avoid plain FTP over the internet.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1765956427493\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \" class=\"rank-math-question \" id=\"which-ports-must-be-open-for-ftp-passive-mode\"><strong>Which ports must be open for FTP passive mode?<\/strong><\/h3>\n<div class=\"rank-math-answer \">\n\n<p>Open TCP 21 plus a passive port range you define (e.g., 30000\u201331000). Allow these in both the OS firewall (UFW\/firewalld) and any cloud\/network security groups. Configure pasv_min_port and pasv_max_port in vsftpd.conf to match.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1765956434311\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \" class=\"rank-math-question \" id=\"how-do-i-allow-only-certain-users-to-log-in-via-ftp\"><strong>How do I allow only certain users to log in via FTP?<\/strong><\/h3>\n<div class=\"rank-math-answer \">\n\n<p>Enable userlist in vsftpd.conf: userlist_enable=YES, userlist_deny=NO, userlist_file=\/etc\/vsftpd.userlist. Then add allowed usernames (one per line) to \/etc\/vsftpd.userlist. Restart vsftpd to apply changes.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1765956441123\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \" class=\"rank-math-question \" id=\"how-do-i-fix-refusing-to-run-with-writable-root-inside-chroot\"><strong>How do I fix \u201crefusing to run with writable root inside chroot\u201d?<\/strong><\/h3>\n<div class=\"rank-math-answer \">\n\n<p>Ensure the user\u2019s home directory is not writable (chmod 755 \/home\/USER). Keep uploads in a writable subdirectory like \/home\/USER\/uploads with proper ownership. Set allow_writeable_chroot=NO to maintain security.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1765956450203\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \" class=\"rank-math-question \" id=\"can-i-use-lets-encrypt-for-ftps-with-vsftpd\"><strong>Can I use Let\u2019s Encrypt for FTPS with vsftpd?<\/strong><\/h3>\n<div class=\"rank-math-answer \">\n\n<p>Yes. Point rsa_cert_file to \/etc\/letsencrypt\/live\/yourdomain\/fullchain.pem and rsa_private_key_file to \/etc\/letsencrypt\/live\/yourdomain\/privkey.pem. Ensure file permissions allow vsftpd to read them, then restart vsftpd. Renewals are automatic with certbot.<\/p>\n<p>With the above steps, you can create FTP on a Linux server that\u2019s fast, secure, and production-ready. If you prefer a turnkey setup with expert monitoring, YouStable\u2019s managed hosting team can implement and maintain FTPS\/SFTP for you.<\/p>\n\n<\/div>\n<\/div>\n<\/div>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>To create FTP on a Linux server, install the vsftpd package, add an FTP user, harden vsftpd.conf (disable anonymous, chroot [&hellip;]<\/p>\n","protected":false},"author":21,"featured_media":16348,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"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":""}},"footnotes":""},"categories":[350],"tags":[],"class_list":["post-14193","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-knowledgebase"],"acf":[],"featured_image_src":"https:\/\/www.youstable.com\/blog\/wp-content\/uploads\/2025\/12\/How-to-Create-FTP-on-Linux-Server.jpg","author_info":{"display_name":"Sanjeet Chauhan","author_link":"https:\/\/www.youstable.com\/blog\/author\/sanjeet"},"_links":{"self":[{"href":"https:\/\/www.youstable.com\/blog\/wp-json\/wp\/v2\/posts\/14193","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.youstable.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.youstable.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.youstable.com\/blog\/wp-json\/wp\/v2\/users\/21"}],"replies":[{"embeddable":true,"href":"https:\/\/www.youstable.com\/blog\/wp-json\/wp\/v2\/comments?post=14193"}],"version-history":[{"count":4,"href":"https:\/\/www.youstable.com\/blog\/wp-json\/wp\/v2\/posts\/14193\/revisions"}],"predecessor-version":[{"id":14520,"href":"https:\/\/www.youstable.com\/blog\/wp-json\/wp\/v2\/posts\/14193\/revisions\/14520"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.youstable.com\/blog\/wp-json\/wp\/v2\/media\/16348"}],"wp:attachment":[{"href":"https:\/\/www.youstable.com\/blog\/wp-json\/wp\/v2\/media?parent=14193"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.youstable.com\/blog\/wp-json\/wp\/v2\/categories?post=14193"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.youstable.com\/blog\/wp-json\/wp\/v2\/tags?post=14193"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}