530 Login incorrect 是 vsftpd 最常見的登錄失敗錯誤,但其背後可能隱藏 PAM 認證鏈斷裂、用戶訪問控制列表誤攔截、配置指令缺失 等多種根因。本文系統梳理三大核心成因、對應修復方案、完整配置文件模板與驗證腳本,助你 10 分鐘定位解決。
530 Login incorrect.
# FTP 協議碼:530 Not logged in.
# 含義:認證失敗(用戶名/密碼錯、賬號被禁、認證模組失效)
/var/log/secure 或 /var/log/vsftpd.log 顯示 pam_authenticate failedvsftpd 編譯支援 PAM,但 /etc/pam.d/vsftpd 文件缺失、內容錯誤、或 vsftpd.conf 未指定 pam_service_name。
# 1. 確保 PAM 配置文件存在
ls -l /etc/pam.d/vsftpd
# 2. 若缺失,從源碼包複製或手動創建
cp /path/to/vsftpd-source/RedHat/vsftpd.pam /etc/pam.d/vsftpd
# 或
cat > /etc/pam.d/vsftpd <<'EOF'
#%PAM-1.0
session optional pam_keyinit.so force revoke
auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
auth required pam_shells.so
auth include password-auth
account include password-auth
session required pam_loginuid.so
session include password-auth
EOF
# /etc/vsftpd/vsftpd.conf
pam_service_name=vsftpd # 必須與 /etc/pam.d/ 下文件名一致
vsftpd 有兩個黑/白名單文件,配置不當導致合法用戶被拒:
| 文件 | 默認行為 | 控制參數 | 典型內容 |
|---|---|---|---|
/etc/vsftpd/ftpusers | 黑名單:列表用戶禁止登錄 | 無(硬編碼讀取) | root, daemon, bin, sys, nobody... |
/etc/vsftpd/user_list | 視 userlist_enable 與 userlist_deny 而定 | userlist_enable=YES userlist_deny=YES(默認黑名單)/NO(白名單) | 同 ftpusers 或允許名單 |
# 1. 檢查用戶是否在黑名單
grep "^username$" /etc/vsftpd/ftpusers
grep "^username$" /etc/vsftpd/user_list
# 2. 檢查配置參數
grep -E 'userlist_enable|userlist_deny|userlist_file' /etc/vsftpd/vsftpd.conf
# 3. 修正策略
# 方案 A:從黑名單移除用戶
sed -i '/^username$/d' /etc/vsftpd/ftpusers
sed -i '/^username$/d' /etc/vsftpd/user_list
# 方案 B:改為白名單模式 (僅允許名單內用戶)
# vsftpd.conf:
userlist_enable=YES
userlist_deny=NO
userlist_file=/etc/vsftpd/allowed_users
# 然後將允許登錄的用戶寫入 allowed_users
/etc/vsftpd/vsftpd.conf 模板# 基礎運行
listen=YES
listen_ipv6=NO
background=YES
# 訪問控制
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
# 目錄限制 (安全關鍵)
chroot_local_user=YES
allow_writeable_chroot=YES # 允許 chroot 目錄可寫 (需 3.0+)
# 日誌
xferlog_enable=YES
xferlog_std_format=YES
xferlog_file=/var/log/vsftpd.log
dual_log_enable=YES
vsftpd_log_file=/var/log/vsftpd.log
# 端口與連接
connect_from_port_20=YES
idle_session_timeout=600
data_connection_timeout=120
accept_timeout=60
connect_timeout=60
# PAM 認證 (核心)
pam_service_name=vsftpd
# 用戶列表控制
userlist_enable=YES
userlist_deny=NO
userlist_file=/etc/vsftpd/allowed_users
# 性能
max_clients=200
max_per_ip=20
local_max_rate=0
# 被動模式 (防火牆/NAT 環境必配)
pasv_enable=YES
pasv_min_port=40000
pasv_max_port=40100
pasv_address=YOUR_PUBLIC_IP # 或留空自動檢測
# TLS/SSL 加密 (強烈建議)
ssl_enable=YES
rsa_cert_file=/etc/ssl/certs/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.key
ssl_sslv2=NO
ssl_sslv3=NO
ssl_tlsv1=YES
force_local_logins_ssl=YES
force_local_data_ssl=YES
#!/bin/bash
# diagnose-vsftpd-530.sh
USER="$1"
[[ -z "$USER" ]] && { echo "Usage: $0 "; exit 1; }
echo "=== 1. 檢查用戶是否存在 ==="
id "$USER" || echo "User not exist"
echo -e "\n=== 2. 檢查黑名單 ==="
for f in /etc/vsftpd/ftpusers /etc/vsftpd/user_list; do
[[ -f "$f" ]] && grep -H "^$USER$" "$f" && echo "FOUND in $f (BLOCKED)"
done
echo -e "\n=== 3. 檢查 PAM 配置 ==="
[[ -f /etc/pam.d/vsftpd ]] && echo "PAM config exists" || echo "MISSING: /etc/pam.d/vsftpd"
grep pam_service_name /etc/vsftpd/vsftpd.conf
echo -e "\n=== 4. 檢查 Shell 合法性 (pam_shells) ==="
grep "^$(getent passwd "$USER" | cut -d: -f7)$" /etc/shells || echo "User shell not in /etc/shells"
echo -e "\n=== 5. 測試認證 (需 root) ==="
# 模擬 PAM 認證
su -s /bin/bash -c "exit" "$USER" 2>&1 | head -5
echo -e "\n=== 6. vsftpd 進程與端口 ==="
ss -ltnp | grep :21
systemctl status vsftpd --no-pager
# 允許 FTP 讀取用戶家目錄
setsebool -P ftp_home_dir on
# 允許 FTP 完全訪問 (較寬鬆)
setsebool -P allow_ftpd_full_access on
# 允許 FTP 守護進程連接網絡
setsebool -P ftpd_connect_db on # 如用數據庫認證
# 查看 FTP 相關布爾值
getsebool -a | grep ftp
# 即時跟蹤
tail -f /var/log/vsftpd.log /var/log/secure | grep -i -e 530 -e pam -e auth
# 歷史分析
grep "530" /var/log/vsftpd.log | tail -20
grep "pam_authenticate" /var/log/secure | tail -20
排查順序: 1) 確認用戶存在且 Shell 合法 → 2) 檢查黑名單 → 3) 確認
pam_service_name指向正確 PAM 文件 → 4) 檢查 PAM 文件內容 → 5) SELinux 布爾值 → 6) 端口/防火牆/被動模式。按順序排查,通常第 3 步即可解決 80% 問題。