1. ftp簡介
1.1 文件傳輸協議
- File Transfer Protocol,文件傳輸協議
- C/S架構
- ftp是明文傳輸
1.2 兩路ftp連接
- 當傳輸數據時,會新建立一個連接,而非使用此前建立的命令連接。
- 命令連接:傳輸命令
- 數據連接:傳輸數據
1.3 文本模式&二進制模式
- 文本模式:
- 文本傳輸是使用ASCII字符,並由回車鍵和換行符分開,二進制不用轉換或格式化就可以傳輸字符
- 二進制模式比文本模式更快,並且可以傳輸所有ASCII值,所以一般將FTP設置成二進制模式
- 二進制模式:
- 二進制模式用來傳輸可執行文件、壓縮文件、圖片文件
- 如果用ASCII模式傳送,會顯示一堆亂碼,必須重新用BINARY模式傳
- 注意:用HTML和文本編寫的文件必須用ASCII模式上傳,用BINARY模式上傳會破壞文件,導致文件執行出錯
2. ftp的兩種工作模式
2.1 主動模式(PORT)
1)工作圖示&分析

- FTP客戶端通過向FTP服務器端發送PORT命令,告訴服務器該客戶端傳輸數據的臨時端口
- 當需要傳送數據時,服務器通過TCP的20端口與客戶端的臨時端口建立數據傳輸通道,完成數據傳輸
- 在建立連接的過程中,由服務器主動發起連接,因此被稱為主動方式
2)工作原理
- Server:20/tcp端口連接客戶端命令連接使用的向后的第一個可用端口
- 客戶端在一個隨機端口上向服務端的21/tcp端口發起請求,服務端響應后,連接成功
- 客戶端向服務端發起一個GET請求后,服務端便會通過自己的20/tcp端口,向客戶端之前的那個隨機端口+1的端口傳輸數據,如果隨機端口+1的端口被其他程序占用,那么會使用再次+1的端口,以此類推,直到找到一個合適的端口
- 傳輸完畢后發送數據的一方主動關閉數據連接
2.2 被動模式(PASV)
1)工作圖示&分析

- FTP客戶端通過向FTP服務器端發送PASV命令,告訴服務器進入被動模式,服務器選擇臨時端口並告知客戶端
- 當需要傳送數據時,客戶端主動與服務器的臨時端口號建立數據傳輸通道,完成數據傳輸
- 在整個過程中,由於服務器總是被動接收客戶端的數據連接,因此被稱為被動方式
2)工作原理
- Server:打開一個隨機端口,並等待客戶端連接
- 客戶端在一個隨機端口上向服務端的21/tcp端口發起請求后,服務端會進行響應
- 告訴客戶端這里已經開放了某個端口,可以連接了
- 服務端響應時不會直接發送端口號,而是會發送兩個數字,如173,26,(表示打開的端口除以256所得到的商和余數,這里表示44314)
- 客戶端收到服務端的端口后,就連接服務端的端口進行數據傳輸
3. vsftp詳解
3.1 vsftp概述
1)概述
- vsftp是安全的FTP程序
- URL的格式
- SCHEME://username:password@HOST:PORT/path/to/file
- 路徑映射
- 用戶家目錄:每個用戶的URL的 / 映射到當前用戶的家目錄
- vsftp以ftp用戶的身份運行進程
- 默認用戶即為ftp用戶,匿名用戶的默認路徑即為ftp用戶的家目錄 /var/ftp
- 匿名用戶:ftp、anonymous
2)程序結構
- 主程序:/usr/sbin/vsftpd
- Unit File:/usr/lib/systemd/system/vsftpd.service
- 主配置文件:/etc/vsftpd/vsftpd.conf
- 數據根目錄:/var/ftp
3.2 vsftp的用戶類別
- 匿名用戶
- anonymous --> ftp : /var/ftp
- 匿名用戶其實也是系統用戶,只不過這個系統用戶叫ftp,而這個用戶的家目錄為/var/ftp
- 系統用戶
- 若系統用戶可以訪問,則此用戶可以通過ftp訪問該系統上任何可以被該用戶訪問的資源,家目錄就是用戶的家目錄
- /etc/pam.d/vsftp文件中include了passwd-auth.so,而這個文件中又包含了pam_unix.so,這個文件就定義了可以通過系統用戶來訪問
- 注意:至少禁止系統用戶訪問ftp服務
- /etc/vsftpd/ftpusers
- PAM(/etc/pam.d/vsftpd)
- 虛擬用戶
- 非系統用戶,用戶賬號不是可登陸操作系統的用戶賬號(非/etc/passwd)
注意:
- 用戶通過vsftpd服務訪問到的默認路徑,是用戶自己的家目錄,默認可以在自己有權限訪問的所有路徑間切換
- 要禁錮用戶於其家目錄中
3.3 配置vsftpd

注意事項:
- 如果開啟了chroot_list_enable功能,需要自行創建chroot_list_file指定的文件,否則vsftpd服務無法正常提供服務
4. vsftpd認證虛擬用戶
4.1 先創建一個系統用戶
- 因為虛擬用戶要使用這個系統用戶訪問文件,所以需要先創建一個系統用戶
# 設置該用戶的主目錄為/home/vsftpd, 且禁止ssh登錄 useradd vsftpd -d /home/vsftpd -s /sbin/nologin
4.2 創建虛擬用戶
1)創建虛擬用戶主目錄
mkdir -p /home/vsftpd/{ftp1, ftp2}
2)創建虛擬用戶
vim /etc/vsftpd/loginuser # 添加: ftp1 123 ftp2 456 # 創建了ftp1和ftp2這兩個虛擬用戶,密碼分別為123和456
4.3 創建數據庫文件
1)使用db_load命令生成db
- 因為保存虛擬賬號和密碼的文本文件無法被系統賬號直接調用,所以需要使用db_load命令來生成db
db_load -T -t hash -f /etc/vsftpd/loginuser /etc/vsftpd/loginuser.db # 參數說明: # -T:允許應用程序能夠將文本文件轉譯載入進數據庫 # -t hash :使用hash加密 # -f:指定包含用戶名和密碼的文本文件(此文件的格式為:奇數行為用戶名,偶數行為密碼)
2)修改數據庫文件的權限
chmod 600 /etc/vsftpd/{loginuser,loginuser.db}
4.4 pam認證中加入數據庫文件認證
- 在vsftpd對應的pam認證模塊中加入數據庫文件認證
vim /etc/pam.d/vsftpd # 清空后加入: auth sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/loginuser account sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/loginuser # 注意,這里的就是上面創建的文件數據庫, 這里的loginuser不需要加db的后綴
4.5 創建虛擬用戶配置文件
- 將所有的虛擬用戶的配置文件統統放入這個目錄,且目錄中配置文件的名稱必須與虛擬用戶名一致
- mkdir /etc/vsftpd/userconf/
- 創建各個虛擬用戶的配置文件
vim /etc/vsftpd/userconf/ftp1
local_root=/home/vsftpd/ftp1/ # 設定主目錄為/home/vsftpd/ftp1 write_enable=YES
anon_upload_enable=YES anon_mkdir_write_enable=YES anon_other_write_enable=YES
4.6 修改主配置文件
- 修改/etc/vsftpd/vsftpd.conf
anonymous_enable=NO # 禁止匿名用戶登錄 chroot_local_user=YES # 禁止用戶訪問除主目錄以外的目錄 ascii_upload_enable=YES # 設定支持ASCII模式的上傳和下載功能 ascII_download_enable=YES chown_uploads=YES # 允許虛擬用戶上傳文件 chown_username=vsftpd # 注意:這里是創建的Linux本地用戶vsftpd, 不改這里虛擬用戶將不能下載文件 guest_enable=YES # 啟動虛擬用戶 guest_username=vsftpd # 虛擬用戶使用的系統用戶名 user_config_dir=/etc/vsftpd/userconf # 虛擬用戶使用的配置文件目錄 allow_writeable_chroot=YES # 最新版的vsftpd為了安全必須用戶主目錄(也就是/home/vsftpd/ftp1)沒有寫權限,才能登陸, # 或者使用allow_writeable_chroot=YES
4.7 vsftpd創建虛擬用戶的資料
- https://blog.csdn.net/make_zhf/article/details/81099184
- https://www.cnblogs.com/tssc/p/9582780.html
- http://www.myjishu.com/?p=369
5. pam_mysql認證ftp虛擬用戶

