Do these 3 things before closing this tab:
1Clear out junk files and repair common Windows errors2Scan for outdated or missing drivers - takes under a minute3Repair Windows errors before they cause bigger problemsA vsftpd 530 Login incorrect response does not prove that the password is wrong. It means authentication or an account-access policy rejected the session. For a local Linux account, verify local_enable=YES, the PAM service selected by pam_service_name, the account’s lock, expiry and shell state, and any user-list rules before changing credentials again. Use the logs while reproducing one login; they identify which gate failed.
Need a server to try this on? Antihost offers Linux VPS plans with NVMe storage, full root access and a 14-day free trial.
What the 530 response actually tells you
FTP status 530 is a deliberately broad failure response. vsftpd can send it after a password check fails, but it can also use the same response when a PAM rule denies the account, the account is locked or expired, the login shell is not permitted, or a user-list policy blocks the name before password validation. FileZilla and other clients usually display only the final 530 text, so repeatedly typing the same password rarely supplies useful evidence.
As an Amazon Associate I earn from qualifying purchases.
The Tool Desk
Outbyte Driver Updater FREEScan for outdated or missing drivers - takes under a minuteDriver Scan →Outbyte PC Repair FREERepair Windows errors before they cause bigger problemsFix Now →Treat the response as an authentication-or-policy checkpoint. First establish which configuration the daemon loaded, then inspect PAM and the account, and only after those gates pass investigate filesystem isolation. A chroot problem normally produces a separate 500 OOPS message rather than a password error.
Use this order for a first repair attempt
- Confirm the running service and configuration path. Run
systemctl status vsftpd. Check the unit and its launch arguments withsystemctl cat vsftpd, then verify that the file being read is the one you edited, commonly/etc/vsftpd.conf(some distributions use a different path). - Enable the authentication source you intend to use. For ordinary Linux users from
/etc/passwdor a directory service, the configuration must containlocal_enable=YES. The Debian vsftpd manual specifies that this is required for any non-anonymous login, including virtual users. Setwrite_enable=YESonly when the account must upload, delete or otherwise modify files; it is not needed merely to authenticate. - Watch the daemon and authentication logs during one test. In one terminal run
journalctl -u vsftpd -f. In another, attempt one login. Also inspect the distribution’s PAM/authentication log and/var/log/vsftpd.logwhen that file is configured. The log line often identifies a PAM denial, a locked account or a user-list rejection that the client hides. - Inspect PAM and account state. Check
/etc/pam.d/vsftpd, or the file named bypam_service_name. Then verify that the user exists, is not locked or expired, has the expected shell, and is not excluded by an access rule. - Read user-list and chroot settings as a separate policy. A known-good password can still be rejected by
userlist_enable, and a successful authentication can still be followed by a chroot refusal. Change one setting at a time and retest.
Confirm vsftpd is reading the settings you changed
Check service health
systemctl status vsftpd should show an active service. If it is failed, fix the startup error before troubleshooting credentials. A syntax mistake, duplicate directive or wrong permissions on the configuration can prevent the intended settings from taking effect. systemctl cat vsftpd shows the unit definition, including any command-line option that points to an alternate configuration file.
#1 Best Overall
After an edit, restart or reload according to the service’s normal operating procedure and verify the result with systemctl status vsftpd. Do not assume that editing a similarly named file changed the live daemon. If several configuration files exist, record the exact path used by the service and make all subsequent checks against it.
Check the local-login switch
local_enable=YES
This directive permits local-user authentication. If it is absent or set to NO, every local username can fail even when the Linux password works for console, SSH or another service. This switch is independent of upload permission: leave write_enable=NO for a read-only FTP service, or set it to YES only for a deliberately writable use case.
Do not “fix” a login by enabling anonymous access. Anonymous FTP is a different authentication path and can expose data unintentionally.
Check PAM before resetting a password
vsftpd delegates much of local authentication and account authorization to Pluggable Authentication Modules (PAM). The directive pam_service_name tells vsftpd which PAM service definition to use. Inspect that named file; on many Linux installations it is /etc/pam.d/vsftpd.
Common PAM failure patterns
- Wrong service name:
pam_service_namepoints to a file that does not exist or to a policy intended for another service. - Missing or misordered module: a required module is not installed, has the wrong control flag, or is evaluated before a rule that should allow the account.
- Directory-service policy: LDAP, SSSD, winbind or another identity provider can deny an account even though a local password appears correct.
- Account restrictions: PAM may enforce expiry, access groups, time windows, denied users or shell restrictions. The FTP client may still receive only 530.
Reproduce one failure while following both journalctl -u vsftpd and the authentication log used by your distribution. A PAM message such as “account locked,” “authentication failure” or an access-module denial is more actionable than the client’s generic text. Avoid replacing the PAM stack with a copied example: PAM control flags determine whether a failed rule is fatal, and an apparently small edit can change policy for every FTP login.
Validate the Linux account itself
Confirm the name resolves
Check the account through the same identity mechanism the server uses, for example with getent passwd username. This tests local files and, where configured, directory services. If it returns nothing, vsftpd cannot authenticate that name through the expected source. Watch for spelling, case and a client that silently prepends a domain or email-style suffix.
Check lock and expiry state
Use your distribution’s account tools, such as passwd -S username for a concise password status and chage -l username for ageing and expiry information. An account can have the right password and still be denied because it is locked, expired, not yet active, or past a password-age limit. Directory accounts have equivalent status controls in the directory service; inspect those records rather than changing the local password.
Unlocking or extending an account is an administrative decision. Apply the smallest change that restores an intended account, document it, and retest. Do not disable expiry or account controls globally just to make one FTP login succeed.
Check the login shell
Inspect the shell field returned by getent passwd username. When shell checking is enabled, vsftpd or the associated policy can reject a user whose shell is not listed in /etc/shells. This commonly affects service accounts assigned a non-interactive shell for security reasons.
Do not add an arbitrary shell to /etc/shells or globally relax shell checks without understanding the consequence: the file is also used by other programs to decide which shells are valid. If the account is intended for FTP only, choose an account policy that provides the required file access without granting an unintended interactive login.
Free tools Windows power users keep installed
One-click scans. No signup required.
Understand user-list allow and deny semantics
When userlist_enable=YES, vsftpd consults the file named by userlist_file. The commonly used default is /etc/vsftpd.user_list, but always read the value in the active configuration. The meaning of that file depends on userlist_deny:
| Settings | Effect | What to check |
|---|---|---|
userlist_enable=NO |
The user-list mechanism is disabled. | Look elsewhere for the denial. |
userlist_enable=YES, userlist_deny=YES |
Names in userlist_file are denied; names not in it may continue to authentication. |
Remove the intended account from the deny list or correct its spelling. |
userlist_enable=YES, userlist_deny=NO |
Only names in userlist_file are accepted. |
Add the account deliberately; every unlisted user is rejected. |
Some configurations also use ftpusers or a distribution-specific deny file through PAM. Inspect those files and the PAM stack rather than assuming that changing vsftpd.user_list is sufficient. A user-list rejection can happen before password entry, which explains why a confirmed password still yields 530.
Rank #4
Keep chroot failures separate from authentication failures
chroot_local_user, chroot_list_enable and chroot_list_file control which local users are placed in a filesystem jail and how exceptions are interpreted. They do not replace password authentication. Troubleshoot them after PAM and account gates are working.
How the list interpretation changes
- With
chroot_local_user=NO, local users normally are not jailed; whenchroot_list_enable=YES, users inchroot_list_fileare the exceptions that are jailed. - With
chroot_local_user=YES, local users normally are jailed; when the list feature is enabled, users inchroot_list_fileare the exceptions that are not jailed.
Because the exception direction flips, read the two options together and test with a non-privileged account. A typo in chroot_list_file can make a user appear to receive different treatment from another account even though both authenticate successfully.
Recommended Free Tools
Fix the writable-root refusal safely
If the jail’s root directory is writable by the FTP user, vsftpd can stop with:
500 OOPS: vsftpd: refusing to run with writable root inside chroot()
The safer layout is a non-writable jail root owned by root, with a separate child directory that has the permissions needed for uploads. This preserves the boundary between the directory that defines the jail and the directory where files are written.
Best Value
allow_writeable_chroot=YES can suppress the refusal, but it is a deliberate security trade-off, not a universal login fix. The Debian vsftpd documentation warns that chrooting local users has security implications, especially when those users have upload permission or shell access. Decide whether the account needs a jail, whether it needs writes, and who owns each directory before enabling this option.
Use logs to identify the failing gate
Run a single controlled test rather than making several changes between attempts. A useful sequence is:
- Open
journalctl -u vsftpd -f. - Open the system’s PAM or authentication log in a second terminal.
- Connect with one known account and record the exact username and time.
- Capture the server’s response to the
USERandPASScommands, without publishing the password. - Match the timestamp to the vsftpd and PAM entries, then change only the setting implicated by those entries.
When command-level detail is needed, enable vsftpd protocol logging temporarily using the logging directives documented for your installed version. Disable verbose protocol logging after diagnosis and protect log files, because usernames, paths and operational details can be sensitive. If no server-side entry appears, confirm that the connection is reaching this daemon and that a firewall, proxy or alternate FTP service is not returning the response.
Configuration choices and their consequences
| Decision | Option or source | Operational result | Evidence to expect |
|---|---|---|---|
| Authentication source | Local accounts through PAM | Uses Linux account state, shell policy and PAM modules. | vsftpd and PAM logs identify account or module denials. |
| Authentication source | Directory-backed PAM | Identity and lock/expiry state may be controlled outside /etc/passwd. |
Directory or SSSD/LDAP-related messages accompany the FTP failure. |
| Authentication source | Virtual users | Still requires the appropriate vsftpd/PAM configuration; local_enable=YES is required for non-anonymous logins according to the Debian manual. |
PAM service and virtual-user database entries show whether the identity was found. |
| Access control | Deny list | With userlist_deny=YES, listed names are blocked. |
The rejected name appears in the configured user-list file or related PAM deny file. |
| Access control | Allow list | With userlist_deny=NO, only listed names are allowed. |
An unlisted but valid account receives the same client-facing 530. |
| Filesystem isolation | No local-user chroot | Users are not jailed by these options; filesystem permissions still apply. | Authentication can succeed without a chroot message. |
| Filesystem isolation | Local-user chroot | Users are jailed according to the two chroot switches and exception list. | A writable root can produce the distinct 500 refusal. |
| Write requirement | Read-only | Keep write_enable=NO when downloads are the only requirement. |
Successful login does not imply upload permission. |
| Write requirement | Upload-enabled | Requires write_enable=YES plus filesystem permissions and a safe jail layout. |
Authentication logs show success; file-operation logs reveal permission failures. |
FileZilla-specific checks
FileZilla reports the server’s FTP reply, so a line such as “530 Login incorrect” still points to server-side authentication or policy. In the site entry, verify that you are connecting to the intended host and FTP service, not an SFTP profile or a different server. Use the exact Linux or virtual-user name expected by the PAM configuration; do not assume that a desktop login name, email address or domain-qualified name maps automatically.
Open FileZilla’s message log and note the sequence around USER, PASS and the 530 response. Test once, then correlate the timestamp with journalctl and the PAM log. If the server log shows the account was denied before password verification, changing FileZilla’s password field cannot resolve it. If the server accepts authentication and then sends a 500 chroot refusal, correct the jail ownership and list semantics instead.
Recovery patterns for common symptoms
Every local account receives 530
- Verify the active configuration path and set
local_enable=YES. - Check that
pam_service_namenames the intended, readable PAM file. - Watch PAM logs for a module or directory-service failure affecting all users.
- Inspect
userlist_enableanduserlist_deny; an allow-list mode with no entries can reject everyone.
One account receives 530 while another works
- Compare lock and expiry state with
passwd -Sandchage -l. - Compare shell fields and verify the required shell appears in
/etc/shellswhen shell checking is active. - Search every configured user-list and PAM deny rule for the exact username.
- Check directory-service group or account restrictions if the user is not local.
Authentication succeeds, then the session fails
- Read the exact server reply: a chroot layout problem commonly says
500 OOPS, not 530. - Inspect ownership and write permissions on the jail root and its writable child directory.
- Re-evaluate the interaction of
chroot_local_userandchroot_list_enablebefore changingallow_writeable_chroot.
After the fix: make the result repeatable
Record the final configuration path, PAM service name, user-list mode and chroot policy. Keep a test account separate from administrative identities, and give it only the filesystem permissions required for its role. If uploads are enabled, retain a non-writable jail root and a dedicated writable subdirectory. Remove temporary protocol logging, restart or reload the daemon as appropriate, and perform one final login while confirming that the expected log entries appear.
Quick wins for a faster PC:
Scan for outdated or missing drivers - takes under a minuteDriver Scan →Clear out junk files and repair common Windows errorsFree Scan →The durable fix is the one that explains the original 530 in the logs: the correct local-login switch, a functioning PAM policy, a permitted account, an intentional allow/deny list, or a separate chroot correction. A password reset without that evidence can leave the real policy failure untouched.
Quick Recap
Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.




