安裝配置vsftpd做FTP服務,我們的Web應用使用git管理進行迭代,公共檔案軟體儲存使用開源網盤Seafile來管理,基本夠用。想不到FTP的使用的場景,感覺它好像老去了,雖然現在基本沒有用到這個工具,但剛好公司公司刷一個硬體需要使用FTP來下載配置檔案,於是研究使用了一下,記錄了一下使用過程。?
原文儲存在這裡,這裡持續更新修正,我會在我使用過程中把一些問題記錄下來
安裝
在安裝前檢視是否已安裝vsftpd
# 檢視是否已安裝 方法一
[root@localhost ~]# rpm -q vsftpd
vsftpd-3.0.2-21.el7.x86_64
# 檢視是否已安裝 方法二
[root@localhost ~]# vsftpd -v
vsftpd: version 3.0.2
# 安裝 vsftpd
[root@localhost ~]# yum -y install vsftpd
檢視位置
[root@localhost ~]# whereis vsftpd
vsftpd: /usr/sbin/vsftpd /etc/vsftpd /usr/share/man/man8/vsftpd.8.gz
啟動vsftpd服務
systemctl start vsftpd.service
關閉firewall和SELinux
setenforce 0 # 設定SELinux 成為permissive模式 (關閉SELinux)
setenforce 1 # 設定SELinux 成為enforcing模式 (開啟SELinux)
# 或者修改配置
vi /etc/selinux/config
# SELINUX=enforcing
# 註釋掉
# SELINUXTYPE=targeted
# 註釋掉
SELINUX=disabled
# 增加
:wq! #儲存退出
setenforce 0
或者設定SELinux
getsebool -a | grep ftp
setsebool -P ftpd_full_access on
systemctl stop firewalld.service
#停止firewall
systemctl disable firewalld.service
#禁止firewall開機啟動
如果你不願意關閉防火牆,需要防火牆新增FTP服務。
firewall-cmd --permanent --zone=public --add-service=ftp
firewall-cmd --reload
修改配置檔案
配置檔案/etc/vsftpd/vsftpd.conf
anonymous_enable=NO # 不允許匿名訪問,禁用匿名登入
chroot_local_user=YES # 啟用限定使用者在其主目錄下
use_localtime=YES # 使用本地時(自行新增)
chroot_list_enable=YES
local_enable=YES # 允許使用本地帳戶進行FTP使用者登入驗證
allow_writeable_chroot=YES # 如果啟用了限定使用者在其主目錄下需要新增這個配置,解決報錯 500 OOPS: vsftpd: refusing to run with writable root inside chroot()
xferlog_enable=YES # 啟用上傳和下載的日誌功能,預設開啟。
local_umask=022 # 設定本地使用者預設檔案掩碼022
# FTP上本地的檔案許可權,預設是077,不過vsftpd安裝後的配置檔案裡預設是022
虛擬使用者高階引數
當virtual_use_local_privs=YES 時,虛擬使用者和本地使用者有相同的許可權;
當virtual_use_local_privs=NO 時,虛擬使用者和匿名使用者有相同的許可權,預設是NO。
當virtual_use_local_privs=YES,write_enable=YES時,虛擬使用者具有寫許可權(上傳、下載、刪除、重新命名)。
當virtual_use_local_privs=NO,write_enable=YES,anon_world_readable_only=YES,
anon_upload_enable=YES時,虛擬使用者不能瀏覽目錄,只能上傳檔案,無其他許可權。
當virtual_use_local_privs=NO,write_enable=YES,anon_world_readable_only=NO,
anon_upload_enable=NO時,虛擬使用者只能下載檔案,無其他許可權。
當virtual_use_local_privs=NO,write_enable=YES,anon_world_readable_only=NO,
anon_upload_enable=YES時,虛擬使用者只能上傳和下載檔案,無其他許可權。
當virtual_use_local_privs=NO,write_enable=YES,anon_world_readable_only=NO,
anon_mkdir_write_enable=YES時,虛擬使用者只能下載檔案和建立資料夾,無其他許可權。
當virtual_use_local_privs=NO,write_enable=YES,anon_world_readable_only=NO,
anon_other_write_enable=YES時,虛擬使用者只能下載、刪除和重新命名檔案,無其他許可權。
匿名登入
安裝完預設情況下是開啟匿名登入的,對應的是 /var/ftp
目錄,這時只要服務啟動了,就可以直接連上FTP了。預設使用者名稱是ftp
,密碼是空的。如果你在配置裡面配置了anonymous_enable=NO
,匿名就無法登入。
$ ftp 192.168.188.114
Connected to 192.168.188.114.
220 (vsFTPd 3.0.2)
Name (192.168.188.114:kennywang): ftp
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
229 Entering Extended Passive Mode (|||47867|).
150 Here comes the directory listing.
-rw-r--r-- 1 0 0 12 Jan 18 06:31 README.md
drwxr-xr-x 2 0 0 6 Nov 05 19:43 pub
226 Directory send OK.
多使用者配置
多使用者配置需要自己手工新增配置,下面內容到vsftpd.conf末尾
#
#
use_localtime=YES # 使用本地時(自行新增)
listen_port=21
chroot_local_user=YES # 啟用限定使用者在其主目錄下
idle_session_timeout=300
data_connection_timeout=120 # 資料連線超時時間
guest_enable=YES # 設定啟用虛擬使用者功能
guest_username=ftpuser # 指定虛擬使用者的宿主使用者 ftpuser(就是我們後面會新建這個使用者)
# guest_username=www
# 如果ftp目錄是指向網站根目錄,用來上傳網站程式,
# 可以指定虛擬使用者的宿主使用者為nginx執行賬戶www,可以避免很多許可權設定問題
user_config_dir=/etc/vsftpd/vuser_conf # 虛擬使用者配置檔案目錄
virtual_use_local_privs=YES # NO時,虛擬使用者和匿名使用者有相同的許可權,預設是NO
pasv_min_port=10060 # 被動模式最小埠號10060
pasv_max_port=10090 # 被動模式最大埠號10090
accept_timeout=5
connect_timeout=1
建立宿主使用者
新建系統使用者ftpuser,使用者目錄為/home/vsftpd
, 使用者登入終端設為/bin/false(即使之不能登入系統)
# 方法一
# 建立使用者 ftpuser 指定 `/home/vsftpd` 目錄
useradd -g root -M -d /home/vsftpd -s /sbin/nologin ftpuser
# 設定使用者 ftpuser 的密碼
passwd ftpuser
# 把 /home/vsftpd 的所有權給ftpuser.root
chown -R ftpuser.root /home/vsftpd
# 方法二
useradd ftpuser -d /home/vsftpd -s /bin/false
chown ftpuser:ftpuser /home/vsftpd -R
# 如果虛擬使用者的宿主使用者為www,需要這樣設定
# www目錄是你應用的目錄
chown www:www /home/www -R
刪除使用者 userdel ftpuser
建立虛擬使用者檔案
touch /etc/vsftpd/vuser_passwd
# 編輯虛擬使用者名稱單檔案:(
# 第一行賬號,第二行密碼,注意:不能使用root做使用者名稱,系統保留)
vi /etc/vsftpd/vuser_passwd
# 編輯內容,下面是 vuser_passwd 內容
wcj
123456
hss
123456
#儲存退出
生成虛擬使用者資料檔案
db_load -T -t hash -f /etc/vsftpd/vuser_passwd /etc/vsftpd/vuser_passwd.db
chmod 600 /etc/vsftpd/vuser_passwd.db
建立使用者配置
mkdir /etc/vsftpd/vuser_conf # 建立虛擬使用者個人vsftp的配置檔案
cd /etc/vsftpd/vuser_conf # 進入目錄
touch hss wcj # 這裡建立兩個虛擬使用者配置檔案
每一個檔案配置檔案都差不多,只是引數local_root
不一樣。
local_root=/home/vsftpd/hss # 使用者 hss 配置目錄,這個地方不一樣
write_enable=YES # 允許本地使用者對FTP伺服器檔案具有寫許可權
anon_world_readable_only=NO
anon_upload_enable=YES # 允許匿名使用者上傳檔案(須將全域性的write_enable=YES,預設YES)
anon_mkdir_write_enable=YES # 允許匿名使用者建立目錄
anon_other_write_enable=YES # 允許匿名使用者刪除和重新命名許可權(自行新增)
建立使用者目錄
每個使用者目錄資料夾是有root使用者建立的,也就是上面local_root
配置目錄,其許可權應設定為755。因為許可權的問題在該資料夾內無法直接上傳檔案。而如果設定為777則無法訪問,這是由於vsftpd的安全性設定。解決上傳問題的方法是在local_root資料夾內新建一個upload的資料夾,許可權設定為777,可將檔案上傳到該資料夾。
mkdir -p /home/vsftpd/hss # 每個使用者對於一個目錄,建立兩個目錄“hss”、“wcj”
# 下面是目錄結構
/home/vsftpd
├── hss
│ ├── filename.md
│ └── upload
└── wcj
└── filename.md
# 賦予其許可權
chmod -R 777 /var/vsftpd/hss/upload/
# 在/var/ftp下新建一個目錄來實現匿名使用者上傳
mkdir /var/ftp/upload
vsftpd中幾種使用者的區分:
本地使用者:使用者在FTP伺服器擁有賬號,且該賬號為本地使用者的賬號,可以通過自己的賬號和口令進行授權登入,登入目錄為自己的home目錄$HOME
虛擬使用者:使用者在FTP伺服器上擁有賬號,但該賬號只能用於檔案傳輸服務。登入目錄為某一特定的目錄,通常可以上傳和下載
匿名使用者:使用者在FTP伺服器上沒有賬號,登入目錄為/var/ftp
最後重啟vsftpd伺服器
systemctl restart vsftpd.service
服務運維
systemctl restart vsftpd.service # 重啟服務
systemctl start vsftpd.service # 啟動服務
systemctl status vsftpd.service # 服務狀態檢視
FTP命令
ftp> ascii # 設定以ASCII方式傳送檔案(預設值)
ftp> bell # 每完成一次檔案傳送,報警提示.
ftp> binary # 設定以二進位制方式傳送檔案.
ftp> bye # 終止主機FTP程式,並退出FTP管理方式.
ftp> case # 當為ON時,用MGET命令拷貝的檔名到本地機器中,全部轉換為小寫字母.
ftp> cd # 同UNIX的CD命令.
ftp> cdup # 返回上一級目錄.
ftp> chmod # 改變遠端主機的檔案許可權.
ftp> close # 終止遠端的FTP程式,返回到FTP命令狀態, 所有的巨集定義都被刪除.
ftp> delete # 刪除遠端主機中的檔案.
ftp> dir [remote-directory] [local-file] # 列出當前遠端主機目錄中的檔案.如果有本地檔案,就將結果寫至本地檔案.
ftp> get [remote-file] [local-file] # 從遠端主機中傳送至本地主機中.
ftp> help [command] # 輸出命令的解釋.
ftp> lcd # 改變當前本地主機的工作目錄,如果預設,就轉到當前使用者的HOME目錄.
ftp> ls [remote-directory] [local-file] # 同DIR.
ftp> macdef # 定義巨集命令.
ftp> mdelete [remote-files] # 刪除一批檔案.
ftp> mget [remote-files] # 從遠端主機接收一批檔案至本地主機.
ftp> mkdir directory-name # 在遠端主機中建立目錄.
ftp> mput local-files # 將本地主機中一批檔案傳送至遠端主機.
ftp> open host [port] # 重新建立一個新的連線.
ftp> prompt # 互動提示模式.
ftp> put local-file [remote-file] # 將本地一個檔案傳送至遠端主機中.
ftp> pwd # 列出當前遠端主機目錄.
ftp> quit # 同BYE.
ftp> recv remote-file [local-file] # 同GET.
ftp> rename [from] [to] # 改變遠端主機中的檔名.
ftp> rmdir directory-name # 刪除遠端主機中的目錄.
ftp> send local-file [remote-file] # 同PUT.
ftp> status # 顯示當前FTP的狀態.
ftp> system # 顯示遠端主機系統型別.
ftp> user user-name [password] [account] # 重新以別的使用者名稱登入遠端主機.
ftp> ? [command] # 同HELP. [command]指定需要幫助的命令名稱。如果沒有指定 command,ftp 將顯示全部命令的列表。
ftp> ! # 從 ftp 子系統退出到外殼。
關閉FTP連線
bye
exit
quit
下載檔案
ftp> get readme.txt # 下載 readme.txt 檔案
ftp> mget *.txt # 下載
上傳檔案
ftp> put /path/readme.txt # 上傳 readme.txt 檔案
ftp> mput *.txt # 可以上傳多個檔案
狀態碼
-
230 – 登入成功
-
200 – 命令執行成功
-
150 – 檔案狀態正常,開啟資料連線埠
-
250 – 目錄切換操作完成
-
226 – 關閉資料連線埠,請求的檔案操作成功