1.FTP簡介
1.1FTP:File Transfer Protocol 文件傳輸協議
FTP是用於在網絡上進行文件傳輸的一套標准協議,使用客戶/服務器模式。它屬於網絡傳輸協議的應用層。文件傳送(file transfer)和文件訪問(file access)之間的區別在於:前者由FTP提供,后者由如NFS等應用系統提供。
在FTP的使用當中,用戶經常遇到兩個概念:"下載"(Download)和"上傳"(Upload)。
"下載"文件就是從遠程主機拷貝文件至自己的計算機上;"上傳"文件就是將文件從自己的計算機中拷貝至遠程主機上。用Internet語言來說,用戶可通過客戶機程序向(從)遠程主機上傳(下載)文件,由於FTP的文件傳輸是明文方式,具有一定危險性,所以就誕生了一種更加安全的傳輸方式vsftp,下面主要介紹vsftp的特性及相關配置。
2.VSFTP特點
2.1VSFTP是一個比FTP更安全的軟件具有以下特點:
01 vsftp一般以普通用戶運行,降低了進程的權限,提高了安全性
02 任何需要執行較高權限的指令都需要上層程序的許可
03 ftp的命令都被整合到了vsftp中,不需要系統額外提供命令
04 用於chroot功能,可以改變用戶的根目錄,限制用戶只能在自己的家目錄
05 vsftpd 是一個基於GPL發布的FTP服務器軟件。其中的vs是“ Very Secure”的縮寫,由此名稱縮寫可以看出,本
服務器的初衷就是服務的安全性。
06 vsftpd是RedHat Linux默認使用的ftp服務端軟件。
07 vsftpd不再依賴於xinetd服務
08 vsftpd可同時允許匿名( anonymous )與本地用戶(local)訪問,還可以支持虛擬用戶。
3.VSFTP連接類型
控制連接:TCP 21,用於發送FTP命令信息
數據連接:TCP 20,用於上傳、下載數據
4.Vsftp工作模式
4.1FTP協議有兩種工作方式:PORT方式和PASV方式,中文意思為主動式和被動式
主動模式:服務端從20端口主動向客戶端發起連接
被動模式:服務端在指定范圍內某個端口被動等待客戶端連接
主動模式端口分配:控制端口 21 傳輸數據端口 20
被動模式端口分配:控制端口 21 傳輸數據端口 隨機
5. FTP的PORT(主動模式) 和 FTP的PASV(被動模式)
5.1PORT(主動模式)
PORT中文稱為主動模式,工作的原理: FTP客戶端連接到FTP服務器的21端口,發送用戶名和密碼登錄,登錄成功后要list列表或者讀取數據時,客戶端隨機開放一個端口(1024以上), 發送 PORT命令到FTP服務器,告訴服務器客戶端采用主動模式並開放端口;FTP服務器收到PORT主動模式命令和端口號后,通過服務器的20端口和客戶端 開放的端口連接,發送數據,原理如下圖:

如上圖所示,在主動模式下,FTP客戶端從任意端口5150(端口號>1023)發起一個FTP請求,並攜帶自己監聽的端口號5151(發送的端口號+1=監聽端口號);隨后服務器返回確認,然后從服務器本地的20端口主動發起連接請求到客戶端的監聽端口5151,最后客戶端返回確認。
這種模式缺點在於服務器帶客戶端的FTP連接很容易被傳輸過程中的路由器、防火牆所影響或攔截。
5.2PASV(被動模式)
PASV是Passive的縮寫,中文成為被動模式,工作原理:FTP 客戶端連接到FTP服務器的21端口,發送用戶名和密碼登錄,登錄成功后要list列表或者讀取數據時,發送PASV命令到FTP服務器, 服務器在本地隨機開放一個端口(1024以上),然后把開放的端口告訴客戶端, 客戶端再連接到服務器開放的端口進行數據傳輸,原理如下圖:

為了主動模式所面臨的服務器到客戶端的連接會被攔截阻塞的問題,FTP發展出了被動模式。在被動模式中,命令連接和數據連接都由客戶端來發起,這樣就可以解決從服務器到客戶端的數據端口的入方向連接被防火牆攔截的問題。
如上圖所示,客戶端用隨機命令端口5150向服務器的21命令端口發送一個PASV請求,然后服務器返回數據端口3267,告訴客戶端我在哪個端口監聽數據連接。然后客戶端向服務器的監聽端口3268發起數據連接,最后服務器回復確認ok。
6.VSFTP傳輸模式
1 文本模式:ASCII模式,以文本序列傳輸數據
2 二進制模式:Binary模式,以二進制序列傳輸數據
7.FTP用戶的類型
1 匿名用戶:anonymous或ftp
2 本地用戶:帳號名稱、密碼等信息保存在passwd/shadow文件中
3 虛擬用戶:使用獨立的帳號/密碼數據文
8.環境准備
8.1關閉SElinux
setenforce 0 臨時關閉selinux
vim /etc/selinux/config 永久關閉selinux
SELINUX=disabled

8.2關閉防火牆
systemctl stop firewalld.service
systemctl disable firewalld.service

9.安裝並啟動FTP服務
9.1 查看系統是否安裝vsftp
rpm -qa | grep vsftpd
執行命令沒有反饋就是沒有安裝

9.2 使用yum命令安裝vsftpd
yum install -y vsftpd

9.3 啟動vsftpd
systemctl start vsftpd
9.4 查看21端口是否存在
netstat -nltp|grep 21

9.5 宿主機瀏覽器訪問 ftp://10.0.0.201

FTP默認的存儲目錄 /var/ftp/pub 默認不允許匿名用戶上傳
10.創建FTP用戶
10.1 創建一個ftp用戶
useradd zxcvbnm
10.2 為ftp用戶設置密碼
echo "zxcvbnm" | passwd zxcvbnm --stdin

10.3 限制該用戶只能訪問FTP,不能直接登錄服務器(系統)
usermod -s /sbin/nologin zxcvbnm
11.創建FTP文件存儲路徑
11.1 創建FTP文件存儲路徑
mkdir /var/www -p 創建主目錄,不可上傳文件
mkdir /var/www/html 文件存儲目錄

11.2 設置訪問權限
chmod a-w /var/www && chmod 777 -R /var/www/html
12.修改系統用戶的存儲目錄
vim /etc/vsftpd/vsftpd.conf
local_root=/var/www/ 針對系統用戶的存儲目錄
anon_root=/var/www/ 針對匿名用戶的存儲目錄

13.配置FTP權限
13.1 vsftpd的配置目錄:/etc/vsftpd
vsftpd.conf 主要配置文件(注意備份)
ftpusers 配置禁止訪問 FTP 服務器的用戶列表
user_list 配置用戶訪問控制
建議備份vsftpd.conf文件: cp vsftpd.conf vsftpd.conf.bak
絕對路徑: cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak

13.2 關閉匿名訪問和切換根目錄權限
vim vsftpd.conf
anonymous_enable=NO 禁用匿名用戶

chroot_local_user=YES 禁止切換根目錄 刪除此行

13.3 重啟FTP服務
systemctl restart vsftpd
重啟之后再用瀏覽器登陸ftp,此時需要輸入用戶名和密碼

14.vsftp為不同用戶設置不同的ftp的根目錄
需求:
要求ftp登錄后的根目錄是/var/www/,但是又不能影響其他用戶的登錄路徑,因為有些程序是直
接在根目錄進行操作的,而沒有目錄切換的過程。
操作過程
注釋掉配置文件中的存儲目錄
#local_root=/var/www/
#anon_root=/var/www/
創建多用戶訪問不同的根目錄,這兩行已經不生效。所以注釋不注釋都可以
14.1 創建第二個FTP用戶
useradd zxcvbnm1
14.2 添加密碼
echo "zxcvbnm1" | passwd lzxcvbnm1 --stdin

14.3 限制該用戶只能訪問FTP,不能直接登錄服務器(系統)
usermod -s /sbin/nologin zxcvbnm1
14.4 vsftpd配置
配置各自用戶訪問根目錄
cd /etc/vsftpd/
mkdir userconfig
cd userconfig

用戶配置目錄 user_config_dir=/etc/vsftpd/userconfig
vim /etc/vsftpd/vsftpd.conf

在userconfig目錄下為不同用戶配置不同的根目錄:
mkdir /var/www/html/lidao -p
vim /etc/vsftpd/userconfig/zxcvbnm
local_root=/var/www/html

mkdir /var/www/hedao/ -p
vim /etc/vsftpd/userconfig/zxcvbnm1
local_root=/var/www/hedao

14.5 重啟服務
systemctl restart vsftpd
14.6 創建測試文件,進行測試
mkdir /var/www/html/laonanhai -p
mkdir /var/www/hedao/lizhengya -p
用zxcvbnm用戶測試一下
zxcvbnm用戶對應的根目錄是/var/www/html



用zxcvbnm1用戶測試一下
zxcvbnm1對應的根目錄是hedao



15.VSFTP權限管理
ll /var/www/html/ -d

因為所有者和所屬組和其他人都是讀寫執行權限,所以可以正常上傳66.txt文件

ll /var/www/html/laonanhai -d

因為laonanhai這個目錄其他用戶沒有寫的權限,所以zxcvbnm用戶登錄的FTP服務器,也沒有寫的權限,所以不能上傳文件

給老男孩目錄提權
chmod 775 /var/www/html/laonanhai
ll /var/www/html/laonanhai -d

讓laonanhai有寫的權限
usermod -a -G root zxcvbnm
id laonanhai

讓zxcvbnm屬於zxcvbnm組,也屬於root組
重啟vsftp 重啟后,從電腦訪問ftp 拖拽文檔放入就可以了
systemctl restart vsftpd

16.FTP客戶端
FTP圖形化客戶端 Xftp falshfxp 資源管理器 瀏覽器 等等。。。
訪問方式: ftp://自己FTP服務器的ip地址
FTP命令行客戶端 Xshell SecureCRT 等等。。。
訪問方式: ftp 自己FTP服務器的ip地址
17.vsftpd.conf配置文件
vsftpd.conf 里面有很多的配置項,這里只列出一部分常用的配置項
下面是配置的選項及說明
17.1 系統用戶的配置
local_enable=YES # 是否允許本地用戶登錄
write_enable=YES # 是否允許本地用戶的寫權限(是否允許上傳)
listen=YES # 是否開啟監聽
listen_port=2121 # 修改連接端口
pam_service_name=vsftpd # 服務名稱
local_umask=022 # 默認的umask碼(本地用戶的掩碼信息)
diremssage_enable=YES # 是否顯示目錄說明文件
connect_from_prot_20=YES # 是否確定端口傳輸來自20
xferlog_ftd_format=YES # 是否使用標准的ftp xferlog模式
17.2 匿名登錄設置(匿名用戶的常用配置)
anonymous_enable=NO # 是否允許匿名登錄
anno_upload_enable=YES #是否允許匿名用戶上傳權限
anno_mkdir_write_enable=YES #是否允許匿名用戶可創建目錄及其文件
anno_other_write_ebable=YES #匿名用戶是否除了寫權限是否擁有刪除和修改的權限
anno_world_readable_only=YES #匿名用戶是否擁有只讀權限
no_anno_password=YES #匿名用戶是否跳過密碼檢測
anno_umask=077 #匿名用戶創建文件的掩碼權限
17.3 限制目錄
chroot_local_user=yes # 限制所有用戶都在家目錄(禁錮所有ftp用戶在其家目錄下)
chroot_list_enable=YES # 調用限制在家目錄的用戶名單(是否將系統用戶限制在自己的
home目錄下)
chroot_list_file=/etc/vsftpd/chroot_list # 限制在家目錄的用戶名單所在路徑(列表不受限制的用戶)
17.4 日志設置
xferlog_file=/var/log/vsftpd.log # 日志文件路徑設置
xferlog_enable=YES # 是否記錄ftp傳輸過程
use_localtime=YES
默認情況下,vsftpd 是用GMT做為它的時間的,所以和操作系統的時間不一致,加入這個命令來同步vsftpd與操作系統的時間
作者:星辰追路人
本文版權歸作者所有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。