| 需求項目 | 規格 |
|---|---|
| 作業系統 | RHEL 6.4 (x86_64) |
| FTP 軟體 | vsftpd 2.2.2 |
| 匿名登入 | 禁止 |
| 本地用戶 | 允許,並限制在各自家目錄 |
| 用戶家目錄 | 統一指向 /data/ftp |
| 下載速度限制 | 150 KB/s |
| 測試帳號 | obama / 123456 |
[root@ftp-server ~]# rpm -q vsftpd
vsftpd-2.2.2-11.el6.x86_64
/etc/vsftpd/vsftpd.conf# 備份
cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak
# 關鍵參數(行號僅供參考,請搜尋關鍵字修改)
anonymous_enable=NO # 第 12 行:禁止匿名
chroot_local_user=YES # 第 120 行:限制用戶在家目錄
local_root=/data/ftp # 第 121 行:指定統一家目錄
local_max_rate=150000 # 第 122 行:限速 150 KB/s (單位 Bytes/sec)
# 建立測試用戶
useradd obama
echo "123456" | passwd --stdin obama
# 建立統一家目錄
mkdir -p /data/ftp
# 檢查目錄權限(預設 root:root 755,用戶無寫入權限)
ls -ld /data/ftp
# drwxr-xr-x. 2 root root 4096 Apr 16 05:35 /data/ftp
# 建立測試檔案(512 MB)
dd if=/dev/zero of=/data/ftp/film.avi bs=1M count=512
service vsftpd start
chkconfig vsftpd on
[root@client ~]# ftp 192.168.100.1
Connected to 192.168.100.1.
220 (vsFTPd 2.2.2)
Name (192.168.100.1:root): obama
331 Please specify the password.
Password:
500 OOPS: cannot change directory:/home/obama
Login failed.
錯誤分析: 雖設定 local_root=/data/ftp,但 vsftpd 仍嘗試切換至 /home/obama,提示 cannot change directory,典型的 SELinux 阻擋 徵兆。
# 查詢 FTP 相關布林值
getsebool -a | grep ftp
# 輸出片段:
# ftp_home_dir --> off ← 關鍵項關閉
# allow_ftpd_full_access --> off
# ...
# 開啟 ftp_home_dir 允許用戶存取家目錄
setsebool -P ftp_home_dir=1
# 驗證已生效
getsebool ftp_home_dir
# ftp_home_dir --> on
[root@client ~]# ftp 192.168.100.1
Connected to 192.168.100.1.
220 (vsFTPd 2.2.2)
Name (192.168.100.1:root): obama
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (192,168,100,2,123,195).
150 Here comes the directory listing.
-rw-r--r-- 1 0 0 536870912 Apr 16 12:38 film.avi
226 Directory send OK.
# 下載測試驗證限速
[root@client ~]# wget ftp://obama:123456@192.168.100.1/film.avi
# 觀察下載速度應穩定在 ~150 KB/s
| 知識點 | 說明 |
|---|---|
| local_root vs chroot | local_root 指定用戶登入後的根目錄;chroot_local_user=YES 強制用戶無法跳出該目錄。兩者配合實現用戶隔離。 |
| local_max_rate 單位 | Bytes/秒,非 KB/s。150 KB/s = 150 × 1024 = 153,600,配置 150000 略低於理論值,實測約 146 KB/s,屬正常誤差。 |
| SELinux ftp_home_dir | 控制 FTP 進程是否可讀取用戶家目錄。關閉時,即使 DAC 權限正確,MAC 仍會阻擋,導致 500 OOPS: cannot change directory。 |
| setsebool -P | -P 表示永久生效(寫入政策檔),重開機不失效。無 -P 僅運行時生效。 |
| 被動模式防火牆 | RHEL 6 預設 iptables 需開放 TCP 21 及被動埠口範圍(pasv_min_port-pasv_max_port)。 |
local_root=/data/ftp/$USER 搭配腳本自動建立目錄,或啟用 user_config_dir 為每用戶指定 local_root。/data/ftp 屬 root:root 755,用戶無寫入權。若需上傳,須 chown obama:obama /data/ftp 或建立子目錄授權。ssl_enable=YES、憑證配置,強制 FTPS。xferlog_enable=YES、log_ftp_protocol=YES 記錄完整指令流。max_clients=100、max_per_ip=5、idle_session_timeout=600。本實戰完整展示了 RHEL 6 環境下 vsftpd 從配置、帳號建立、SELinux 排查到驗證限速的全流程。SELinux 是 RHEL/CentOS 系列 FTP 部署最常見的「隱形阻礙」,掌握 getsebool/setsebool 診斷流程可大幅減少排錯時間。