Linux中FTP配置與vsftpd服務部署指南
一、FTP 核心概念
1、基本定義
- 文件傳輸協議(FTP),基于 C/S模式 工作。
- 控制端口:
21
(身份驗證與指令傳輸)
數據端口:20
(主動模式數據傳輸)
2、工作模式對比
- 主動模式(standard):
- 客戶端從一個隨機非特權端口N(>1024)連接到服務器的控制端口(21)
- 其中Prot命令包含了客戶端的IP地址和數據端口(N+1)
- 服務器收到這條PORT命令,從它的數據端口(20)主動發起連接到客戶端指定的IP地址和端口(N+1)
- 需要服務端與客戶端重新建立一個新的連接來傳輸數據
- 客戶端從一個隨機非特權端口N(>1024)連接到服務器的控制端口(21)
- 被動模式(passive):
- 客戶端從一個隨機非特權端口N(>1024)連接到服務器的控制端口(21)
- 其中Pasv命令包含了客戶端的數據端口(N+1)
- 此時服務端會隨機生成一個高端端口P(P>1024),并發送PORT命令給客戶端(使用控制端口)
- 其中Prot命令包含了服務端的IP地址和數據端口P
- 客戶端從數據端口N+1發起一個請求連接服務端數據端口P,這時產生了數據連接
- 不需要服務端與客戶端重新建立一個新的連接來傳輸數據
- 客戶端從一個隨機非特權端口N(>1024)連接到服務器的控制端口(21)
模式 | 連接發起方 | 端口使用 | 相同點 |
---|---|---|---|
主動模式 | 服務端 → 客戶端 | 服務端數據端口20 → 客戶端高端口N+1 | 服務端控制端口為21 |
被動模式 | 客戶端 → 服務端 | 客戶端高端口N+1 → 服務端隨機高端口p | 服務端控制端口為21 |
二、FTP服務器主配置文件參數
參數 | 默認值 | 功能說明 | 注意事項 |
---|---|---|---|
anonymous_enable | NO | 控制匿名用戶訪問權限 | YES表示允許匿名訪問FTP服務器 |
local_enable | YES | 控制FTP用戶是否可以訪問FTP服務器 | SELinux啟用時需注意調整ftp_home_dir 的bool值(RHEL7+ 無需配置) |
write_enable | YES | 控制FTP用戶對FTP服務器的可寫權限 | 必須啟用后,其他寫操作參數才生效 |
local_umask | 022 | FTP用戶創建目錄或文件時的umask值 | 創建目錄權限 755,文件權限 644 |
anon_upload_enable | 注釋 | 控制匿名用戶上傳文件的權限 | SELinux啟用時需注意調整 ftpd_anon_write 和 ftpd_full_access 的bool值 |
anon_mkdir_write_enable | 注釋 | 控制匿名用戶創建目錄的權限 | 需同時啟用 write_enable=YES |
anon_other_write_enable | 無 | 允許匿名用戶重命名/刪除文件 | 高風險操作,謹慎啟用 |
dirmessage_enable | YES | 顯示說明性文件 | 用戶進入目錄時自動顯示 |
xferlog_enable | YES | 控制文件在傳輸過程中是否被日志記錄 | 日志默認位置:/var/log/xferlog |
connect_from_port_20 | YES | 強制使用20端口進行數據傳輸 | 僅主動模式生效 |
chown_uploads | 注釋 | 默認匿名用戶上傳文件的所有者為FTP | 需配合 chown_username 使用 |
chown_username | 注釋 | 匿名用戶上傳文件的所有者將變成該FTP用戶 | 例:chown_username=whoever |
xferlog_file | 注釋 | 設置FTP服務日志文件位置 | 例:xferlog_file=/var/log/xferlog |
xferlog_std_format | YES | 設置標準的FTP Xferlog模式 | 兼容 wu-ftpd 日志格式 |
idle_session_timeout | 600 | 控制連接空閑超時(秒) | 超時自動斷開連接 |
data_connection_timeout | 120 | 數據傳輸連接空閑超時(秒) | 超時自動斷開數據連接 |
nopriv_user | 注釋 | 指定非特權運行用戶 | 例:nopriv_user=ftpsecure |
ftpd_banner | 注釋 | 成功連接FTP服務器時的提示語 | 例:ftpd_banner=Welcome to My FTP service |
deny_email_enable | 注釋 | 禁止下載文件到指定的郵箱地址中 | 需配合 banned_email_file 使用 |
banned_email_file | 注釋 | 設置電子郵箱地址 | 例:banned_email_file=/etc/vsftpd/banned_emails |
chroot_local_user | 注釋 | 控制FTP用戶能否離開自己的FTP主目錄 | YES表示禁止FTP用戶離開自己的FTP主目錄 |
chroot_list_enable | 注釋 | 控制列表中的FTP用戶能否離開自己的FTP主目錄 | 需配合 chroot_list_file 使用 |
chroot_list_file | 注釋 | FTP用戶列表文件,每一行一個用戶名 | 默認:/etc/vsftpd/chroot_list |
ls_recurse_enable | 注釋 | 控制FTP用戶是否能使用類似 ls -R命令 | 默認是禁止的,YES表示允許使用 |
listen | NO | 控制是否偵聽ipv4套接字 | 與 listen_ipv6 互斥 |
listen_ipv6 | YES | 控制是否偵聽ipv6套接字 | 啟用時兼容 IPv4 連接 |
pam_service_name | vsftpd | 設置PAM認證文件的名稱 | 默認:/etc/pam.d/vsftpd |
userlist_enable | YES | 啟用用戶列表控制 | 需配合 /etc/vsftpd/user_list 文件 |
tcp_wrappers | YES | 啟用 TCP Wrappers 主機訪問控制 | 通過 /etc/hosts.{allow,deny} 管理 |
pasv_min_port | 無 | 被動模式最小端口號 | 建議設置高端口范圍(例:10000) |
pasv_max_port | 無 | 被動模式最大端口號 | 需在防火墻放行該端口范圍(例:11000) |
allow_writeable_chroot | 無 | 允許 chroot 環境下的可寫主目錄 | 避免 500 錯誤(替代 chmod u-w /home/user ) |
三、配置場景示例
服務端下載:
yum -y install vsftpd
客戶端下載:
yum -y install lftp
1、匿名用戶
-
設置允許匿名用戶訪問FTP服務器:
vim /etc/vsftpd/vsftpd.confpasv_enable=YES # 啟用passive被動模式pasv_min_port=10000 # 開啟最低的pasv端口,建議采用大于1024的高端口pasv_max_port=11000 # 開啟最高的pasv端口systemctl restart vsftpd
centos7默認允許,不用做修改;centos8修改如上
-
設置允許匿名用戶訪問FTP服務器時能夠在/var/ftp/pub目錄下進行文件上傳:
vim /etc/vsftpd/vsftpd.confwrite_enable=YESanon_upload_enable=YESsystemctl restart vsftpdsetfacl -m u:ftp:rwx /var/ftp/pub
-
設置允許匿名用戶訪問FTP服務器時能夠在/var/ftp/pub目錄下創建目錄:
vim /etc/vsftpd/vsftpd.confwrite_enable=YESanon_mkdir_write_enable=YESsystemctl restart vsftpdsetfacl -m u:ftp:rwx /var/ftp/pub
-
設置允許匿名用戶訪問FTP服務器時能夠對/var/ftp/pub目錄中的文件或目錄進行重命名或刪除操作:
vim /etc/vsftpd/vsftpd.confwrite_enable=YESanon_other_write_enable=YESsystemctl restart vsftpdsetfacl -m u:ftp:rwx /var/ftp/pub
2、FTP目錄
創建用戶:
useradd ftpuser1
useradd ftpuser2
useradd ftpuser3for i in ftpuser{1..3}>do echo 123321 | passwd --stdin $i>done
-
設置允許FTP用戶訪問FTP服務器:
-
local_enable=YES
write_enable=YES
這兩個值為默認設置 -
通過FTP用戶訪問FTP服務器時,默認訪問的主目錄為FTP用戶家目錄
-
此時FTP用戶可以在自己的家目錄下上傳文件、下載文件、創建目錄、重命名文件或者目錄、刪除文件或目錄,同時FTP用戶可以切換至其他目錄中訪問
vim /etc/vsftpd/vsftpd.conflocal_enable=YESwrite_enable=YESsystemctl restart vsftpd
-
-
設置FTP用戶訪問FTP服務器時,將所有FTP用戶訪問的目錄限制在自己的主目錄中,不允許FTP用戶訪問其他目錄:
vim /etc/vsftpd/vsftpd.confchroot_local_user=YESsystemctl restart vsftpd
發現提示登錄失敗
這是因為如果用戶被限定在了其主目錄下,則該用戶的主目錄不能再具有寫權限了!
但是用戶主目錄此時任然具有寫權限,所以提示該錯誤
解決方法一:
chmod u-w /home/ftpuser1
使用命令
chmod u-w /home/ftpuser1
去除用戶主目錄的寫權限可以解決問題,但不合理,不推薦使用
解決方法二:
vim /etc/vsftpd/vsftpd.confallow_writeable_chroot=YESsystemctl restart vsftpd
-
設置FTP用戶訪問FTP服務器時,將部分FTP用戶訪問的目錄限制在自己的主目錄中,其他FTP用戶仍然可以訪問其他目錄:
vim /etc/vsftpd/vsftpd.confchroot_list_enable=YESchroot_list_file=/etc/vsftpd/chroot_listvim /home/ftpuser1chroot_listftpuser1systemctl restart vsftpd
- 當
chroot_local_enable=NO
時chroot_list_enable=YES
代表只限制/etc/vsftpd/chroot_list
文件中定義的FTP用戶,其他的ftp用戶不受限chroot_list_enable=NO
所有的FTP用戶均不受限
- 當
-
設置FTP用戶訪問FTP服務器時,部分FTP用戶可以訪問其他目錄,其他FTP用戶訪問的目錄仍然限制在自己的家目錄中:
vim /etc/vsftpd/vsftpd.confchroot_local_user=YESchroot_list_enable=YESchroot_list_file=/etc/vsftpd/chroot_listvim /home/ftpuser1chroot_listftpuser1systemctl restart vsftpd
- 當
chroot_local_enable=YES
時chroot_list_enable=YES
代表/etc/vsftpd/chroot_list
文件中定義的FTP用戶不受限,其他的ftp用戶受限chroot_list_enable=NO
代表所有的FTP用戶受限
- 當
-
僅允許:
vim /etc/vsftpd/vsftpd.confuserlist_deny=NOvim /etc/vsftpd/user_listftpuser1systemctl restart vsftpd
/etc/vsftpd/ftpusers
和/etc/vsftpd/user_list
文件默認禁用這些用戶訪問ftp服務器將
userlist_deny=NO
寫入/etc/vsftpd/vsftpd.conf
后/etc/vsftpd/ftpusers
為黑名單/etc/vsftpd/user_list
為白名單- 兩者名單列表沖突時,拒絕優先