vsftpd (Very Secure FTP Daemon) 是 Linux 企業級首選 FTP 服務,支援本地/虛擬用戶、SSL/TLS 加密、寬頻限制、虛擬路徑映射。本文從安裝、服務管理、核心配置檔解析、虛擬用戶建立、匿名上傳、歡迎訊息、虛擬路徑掛載、日誌啟用、連線/速度限制、chroot 限制、IP 綁定、完整生產級配置範例十大面向,助您快速部署安全合規的 FTP 服務。
yum install -y vsftpd
systemctl enable --now vsftpd
systemctl status vsftpd
# 防火牆開放 21/20 被動模式埠範圍
firewall-cmd --permanent --add-service=ftp
firewall-cmd --permanent --add-port=30000-31000/tcp # 被動模式範例
firewall-cmd --reload
| 參數 | 建議值 | 說明 |
|---|---|---|
anonymous_enable | NO | 禁止匿名登入 (安全) |
local_enable | YES | 允許本地/虛擬用戶 |
write_enable | YES | 允許上傳/刪除/重命名 |
local_umask | 022 | 上傳檔案權限 755 |
dirmessage_enable | YES | 顯示目錄 .message 內容 |
xferlog_enable | YES | 啟用傳輸日誌 |
xferlog_file | /var/log/vsftpd.log | 日誌路徑 |
xferlog_std_format | YES | 標準 xferlog 格式 |
chroot_local_user | YES | 限制用戶於家目錄 (防目錄遍歷) |
chroot_list_enable | YES | 啟用例外名單 |
chroot_list_file | /etc/vsftpd/chroot_list | 不受 chroot 限制的用戶 |
max_clients | 100 | 最大並發連線數 |
max_per_ip | 5 | 單 IP 最大連線數 |
local_max_rate | 81920 | 本地用戶限速 80 KB/s |
anon_max_rate | 81920 | 匿名用戶限速 80 KB/s |
listen | YES | 獨立模式監聽 IPv4 |
listen_ipv6 | NO | 關閉 IPv6 (視需求) |
pasv_enable | YES | 啟用被動模式 |
pasv_min_port | 30000 | 被動模式埠範圍起 |
pasv_max_port | 31000 | 被動模式埠範圍迄 |
pasv_address | 公網 IP | NAT 環境下必填 |
yum install -y db4-utils
# 文字檔:每兩行一組 user/pass
cat > /etc/vsftpd/virt_users.txt <<'EOF'
user1
pass1
user2
pass2
EOF
# 生成 Berkeley DB
db_load -T -t hash -f /etc/vsftpd/virt_users.txt /etc/vsftpd/virt_users.db
chmod 600 /etc/vsftpd/virt_users.db
cat > /etc/pam.d/vsftpd.virtual <<'EOF'
auth required pam_userdb.so db=/etc/vsftpd/virt_users
account required pam_userdb.so db=/etc/vsftpd/virt_users
EOF
# 建立系統掛名用戶 (無 shell、無家目錄)
useradd -r -s /sbin/nologin -d /var/empty vsftpd_virt
# vsftpd.conf 新增/修改:
guest_enable=YES
guest_username=vsftpd_virt
virtual_use_local_privs=YES
pam_service_name=vsftpd.virtual
user_config_dir=/etc/vsftpd/user_conf
mkdir -p /etc/vsftpd/user_conf
cat > /etc/vsftpd/user_conf/user1 <<'EOF'
local_root=/var/ftp/user1
write_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
EOF
mkdir -p /var/ftp/user1
chown -R vsftpd_virt:vsftpd_virt /var/ftp/user1
將既有目錄 (如 /home/data) 映射至 FTP 家目錄下,不佔用額外空間:
mkdir -p /var/ftp/user1/data
mount --bind /home/data /var/ftp/user1/data
# 開機自動掛載寫入 /etc/fstab
/home/data /var/ftp/user1/data none bind 0 0
anonymous_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
anon_umask=022
mkdir -p /var/ftp/anonymous
chmod 777 /var/ftp/anonymous
chown ftp:ftp /var/ftp/anonymous
# 全域歡迎訊息
ftpd_banner=Welcome to My FTP Service
# 目錄進入訊息 (.message 檔)
echo "Welcome to user1's folder!" > /var/ftp/user1/.message
# 即時追蹤傳輸日誌
tail -f /var/log/vsftpd.log
# 範例輸出:
# Mon Jan 01 10:00:00 2024 [pid 1234] [user1] OK UPLOAD: /file.txt, 1024 bytes
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
xferlog_file=/var/log/vsftpd.log
xferlog_std_format=YES
idle_session_timeout=600
data_connection_timeout=120
ftpd_banner=Welcome to Secure FTP
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
listen=YES
listen_port=21
pasv_enable=YES
pasv_min_port=30000
pasv_max_port=31000
pasv_address=203.0.113.10
max_clients=200
max_per_ip=10
local_max_rate=1048576
anon_max_rate=1048576
guest_enable=YES
guest_username=vsftpd_virt
virtual_use_local_privs=YES
pam_service_name=vsftpd.virtual
user_config_dir=/etc/vsftpd/user_conf
ssl_enable=YES
rsa_cert_file=/etc/ssl/certs/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.key
force_local_data_ssl=YES
force_local_logins_ssl=YES
| 現象 | 原因 | 解決 |
|---|---|---|
| 500 OOPS: vsftpd: refusing to run with writable root inside chroot() | 家目錄對虛擬用戶可寫,且 chroot_local_user=YES | chown root:root /var/ftp/user1 或設定 allow_writeable_chroot=YES (vsftpd 3.0+) |
| 被動模式無法連線 | 防火牆未開放 pasv_min/max_port | firewall-cmd --add-port=30000-31000/tcp |
| 虛擬用戶登入失敗 | PAM 配置錯誤、db 檔權限、vsftpd.conf guest_username 不存在 | 檢查 /var/log/secure、確認 db_load 產出、系統用戶存在 |
| 上傳檔案權限不是 755 | local_umask 設定錯誤 | 設定 local_umask=022 (777-022=755) |