Vsftpd 上傳報 553 Could not create file,權限、擁有者、磁碟空間全正常?九成是 **SELinux 阻擋 ftp 寫入**。本文 30 秒定位、一鍵解鎖、永久生效。
# 客戶端
ftp> put test.txt
local: test.txt remote: test.txt
553 Could not create file
# 伺服器端
ls -ld /var/ftp/pub
# drwxr-xr-x 2 ftp ftp 4096 Mar 20 10:00 /var/ftp/pub
# 權限、擁有者全對,磁碟也有空間
getsebool -a | grep ftp
# allow_ftpd_anon_write --> off
# allow_ftpd_full_access --> off ← 關鍵!
# ftpd_connect_db --> off
# ...
allow_ftpd_full_access 控制 ftpd 是否可**無限制讀寫**所有標準檔案類型。預設 off 導致即使 DAC 權限允許,SELinux 仍拒絕寫入。
# 1. 開啟布林值(-P 寫入 policy,重啟不失效)
setsebool -P allow_ftpd_full_access on
# 2. 驗證
getsebool allow_ftpd_full_access
# allow_ftpd_full_access --> on
# 3. 重啟 vsftpd 確保生效
systemctl restart vsftpd
ftp> put test.txt
200 PORT command successful
150 Ok to send data
226 Transfer complete
ftp> ls
-rw-r--r-- 1 ftp ftp 12 Mar 20 10:05 test.txt
setsebool -P allow_ftpd_anon_write on
# 僅允許匿名用戶寫入標記為 public_content_rw_t 的目錄
# 暫時(重啟失效)
setenforce 0
# 永久(需重啟)
sed -i 's/^SELINUX=.*/SELINUX=permissive/' /etc/selinux/config
# 或 disabled
| 誤區 | 正確做法 |
|---|---|
| 以為是 vsftpd.conf 權限設定錯 | DAC 權限正確時,553 多半是 SELinux |
只設 setsebool allow_ftpd_full_access on 忘記 -P | 重啟後失效,**必加 -P** |
| 直接關閉 SELinux | 失去整體防護,**精準開啟布林值**即可 |
| 目錄標籤錯誤 | 確認 ls -Z /var/ftp/pub 顯示 public_content_rw_t 或 var_t |
結語: Vsftpd 553 錯誤,檢查完 DAC 權限無果時,**直接 setsebool -P allow_ftpd_full_access on**。精準開啟 SELinux 布林值,既解決問題又保留防護,才是運維正解。