IIS FTP Server on Windows VPS: Setup, FTPS Encryption, and User Isolation

Moving files between your workstation and a Windows VPS is a daily task, and IIS ships a fully supported FTP server that most administrators never configure properly. This guide walks through installing the IIS FTP role, creating an isolated site with correct NTFS permissions, locking it down with FTPS, and using PowerShell and FTP over TLS from the client side. The goal is a file-transfer channel that is encrypted, least-privilege, and scriptable rather than a plaintext port 21 open to the internet.

Why IIS FTP Instead of RDP Drag-and-Drop

Copying files through an RDP session works, but it routes data through the remote clipboard/redirect channel, breaks on large transfers, and gives every file the permissions of the interactive user. A dedicated FTP endpoint separates duties: developers push content over FTPS, the web application pool reads it from disk, and neither party needs interactive logon rights. For the hosting context this site covers, see the Windows VPS hosting plans on windows-vps.org to understand what baseline storage and bandwidth your plan provides before you expose a transfer service.

Step 1: Install the FTP Server Role

Install the role with PowerShell (elevated session). This pulls in the management console, the service, and the Web Management Tools dependency.

Install-WindowsFeature Web-Ftp-Server, Web-Ftp-Service, Web-Ftp-Ext -IncludeManagementTools

Confirm the service is running and set to automatic start:

Get-Service FTPSVC | Select-Object Name, Status, StartType
Set-Service FTPSVC -StartupType Automatic
Get-NetFirewallRule -DisplayName "*FTP*" | Select-Object DisplayName, Enabled, Direction

Step 2: Create an Isolated FTP Site

Use IIS Manager: Sites → Add FTP Site. Give it a name, point the physical path at a dedicated folder (for example D:\ftp\sites\app1), bind to your public IP on port 21, and start it immediately. Then switch to the SSL settings and require SSL — never leave Allow or No SSL selected on a public endpoint.

SettingRecommended valueWhy
SSL policyRequire SSLBlocks plaintext credential capture
AuthenticationBasic (over TLS only)Works with isolated users and clients
AuthorizationRead/Write for one local groupLeast privilege, no Everyone access
Passive port range50000–50100, firewall openedActive mode rarely works through NAT
Idle timeout120 secondsReleases dead sessions

Step 3: Isolated Users and NTFS Permissions

IIS has a built-in FTP User Isolation feature. If you set isolation to User name physical directory, an account named deploy is automatically jailed to a folder called deploy under the root — it cannot walk up the tree. Create the local account, grant it only Modify on its own folder, and add it to the FTP authorization rule instead of granting Everyone access.

$pw = Read-Host "Password for deploy" -AsSecureString
New-LocalUser -Name "deploy" -Password $pw -PasswordNeverExpires -Description "FTPS content account"
New-Item -ItemType Directory -Force -Path "D:\ftp\sites\app1\deploy"
$acl = Get-Acl "D:\ftp\sites\app1\deploy"
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule("deploy","Modify","ContainerInherit,ObjectInherit","None","Allow")
$acl.SetAccessRule($rule); Set-Acl "D:\ftp\sites\app1\deploy" $acl

Step 4: Generate a Self-Signed or CA Certificate

FTPS needs a certificate for the site binding. A self-signed certificate is fine for internal use but will trigger client warnings; use a public CA certificate if third parties connect. Create a self-signed one in one line:

New-SelfSignedCertificate -DnsName "ftp.yourdomain.com" -CertStoreLocation "cert:\LocalMachine\My" -NotAfter (Get-Date).AddYears(2)

Then bind it in IIS Manager under the FTP site’s FTP SSL Settings by selecting the certificate thumbprint shown by Get-ChildItem Cert:\LocalMachine\My.

Step 5: Connect From the Client

In FileZilla or WinSCP, enter the host (the VPS public IP or FQDN), port 21, the deploy credentials, and explicitly select Require explicit FTP over TLS. Windows PowerShell cannot do implicit FTPS, so script transfers with WinSCP.com or curl instead:

curl.exe --ftp-ssl --ftp-pasv -u deploy -T .\app.zip ftp://ftp.yourdomain.com/deploy/app.zip

Common FTP Errors and What They Mean

SymptomCauseFix
530 Login authentication failedBad credentials or User Isolation mismatchVerify account name matches folder name, reset password
Connection timed outPassive ports blockedOpen the 50000–50100 range in Windows Firewall and the provider firewall
425 Can’t open data connectionClient in active mode behind NATSwitch client to passive mode
TLS handshake failureCertificate not bound or expiredRe-bind a valid cert under FTP SSL Settings

Which Articles This Applies To and What It Costs

Running IIS FTP costs nothing beyond the VPS plan itself, but the operational overhead is real: a certificate to renew, a passive port range to keep open, and a log stream to monitor. If you only need occasional file drops, an SFTP endpoint over the existing SSH service is lighter to maintain. If you need structure — multiple isolated tenants, per-user jailed roots, and audit trails that map to accounts — IIS FTP with the isolation feature is the better fit.

Size the storage for the queue rather than the payload: larger uploads complete faster over the same link if the disk can absorb the write while the next file streams in.  

Hardening Checklist

  • Require SSL/TLS for all connections; disable unencrypted basic auth.
  • Restrict the passive port range and open only that range in the firewall.
  • Enable FTP logging and ship logs off-box; audit 530 and 550 responses.
  • Use IP restrictions on the site when only known offices upload content.
  • Prefer SFTP (port 22) when the same job can be done over SSH — it is a different protocol and generally simpler to firewall.

Configured this way, IIS FTP becomes a controlled deployment channel rather than a liability. If you would rather not run the FTP role at all, the same file workflows can be handled over RDP with mapped drives or over a managed Windows VPS plan from windows-vps.org that includes preconfigured transfer tooling.

Leave a Comment