FTP:File Transfer Protocol ,文件傳輸協議 FTP:屬於NAS存儲的一種協議,基於CS結構。 FTP的工作原理: ftp採用的是雙埠模式,分為命令埠和數據埠 命令埠:固定,tcp/21,命令埠對應的就是命令通道 數據埠:不固定,數據埠對應的就是數據通道 說明: ...
FTP:File Transfer Protocol ,文件傳輸協議
FTP:屬於NAS存儲的一種協議,基於CS結構。
FTP的工作原理:
ftp採用的是雙埠模式,分為命令埠和數據埠
-
命令埠:固定,tcp/21,命令埠對應的就是命令通道
-
數據埠:不固定,數據埠對應的就是數據通道
說明:
ftp不同的工作模式使用不同類型的埠。
ftp的工作模式:(從伺服器角度)
-
主動模式:伺服器主動向客戶端發起連接
-
被動模式:伺服器被動接受客戶端的連接請求
說明:
主動模式和被動模式是數據通道的概念。
ftp的通信流程:
-
1.服務端開啟對21埠的監聽。
-
2.客戶端發起對服務端的連接請求,通過伺服器的21埠連接到伺服器。此時建立起了命令通道,命令通道用於傳輸和通信相關的一些指令。
-
3.建立數據通道
如果是主動模式:服務端會使用20埠主動連客戶端的一個隨機埠。
如果是被動模式:客戶端使用一個隨機埠連接服務端的一個隨機埠 -
4.使用數據通道進行數據的傳輸。
說明:
不管是主動模式還是被動模式,服務端都會打開兩個埠,一個固定的21埠用於和客戶端建立命令通道。一個20或其他埠用於和客戶端建立數據通道。
使用防火牆的連接跟蹤功能可以解決防火牆對隨機埠的攔截。
防火牆連接跟蹤功能:
監控命令通道中傳輸的指令,自動分析隨機埠,在客戶端發起連接的時候就自動打開了這個隨機埠。
iptables啟動連接跟蹤功能的方法:
探測埠是否打開的方法:
telnet工具
格式:telnet host port #如果能響應則埠就是打開的
例如:查看22埠是否開啟
#如果telnet能響應則埠就是打開的'
[root@CentOS8 ~]# telnet 10.0.0.12 22
Trying 10.0.0.12...
Connected to 10.0.0.12.
Escape character is '^]'.
SSH-2.0-OpenSSH_8.0
常見 FTP 相關軟體
服務端軟體:centos預設的FTP服務端軟體是FTP
客戶端軟體:FTP、wget、curl等等
vsftpd 軟體
Very Secure FTP Daemon,CentOS 預設FTP伺服器
特點:
速度快、穩定性好
官網:
https://security.appspot.com/vsftpd.html
vsftpd的相關配置:
配置文件格式:option=value
註意:= 前後不要有空格
使用:man vsftpd.conf 可以查看csftpd的相關配置說明
- 配置命令通道的命令埠
預設為21埠
listen_port=2121 預設值為21
- 數據通道主動模式的埠
connect_from_port_20=YES #設置主動模式埠為20
ftp_data_port=20 (預設) #指定主動模式的埠
- 被動模式埠範圍
linux ftp 客戶端預設使用被動模式
windows ftp 客戶端預設使用主動模式
pasv_min_port=6000 0為隨機分配,埠範圍會影響客戶端的併發數
pasv_max_port=6010 #表示被動模式埠範圍是6000---6010
- ftp伺服器的時間
use_localtime=YES 使用當地時間(預設為NO,使用GMT)
#預設使用的是格林尼治時間,北京時間為:GMT+8
- 匿名用戶登錄
#開啟後可以使用匿名用戶ftp或anonymous登錄
anonymous_enable=YES #支持匿名用戶,CentOS8 預設不允許匿名
no_anon_password=YES #匿名用戶略過口令檢查 , 預設NO,表示不輸入匿名用戶的密碼進行登錄
- 匿名用戶上傳文件
anon_upload_enable=YES #表示允許匿名上傳,註意:文件系統許可權
#FTP服務端允許了匿名用戶上傳,但是指定文件的許可權不允許上傳也是沒法上傳成功 所以需要在伺服器的指定目錄下給ftp用戶添加許可權
anon_mkdir_write_enable=YES 匿名建目錄
範例:實現匿名用戶上傳
服務端:
[root@CentOS8 ~]# vim /etc/vsftpd/vsftpd.conf
anon_upload_enable=YES #允許匿名用戶上傳
#如果沒有開啟許可權,雖然打開了匿名上傳功能,但是跨網路傳輸數據,ftp對遠程目錄的文件夾沒有寫許可權,所以不能上傳。
#給ftp用戶根目錄下的pub目錄添加ftp用戶的許可權
[root@CentOS8 ~]# setfacl -m u:ftp:rwx /var/ftp/pub/ #給ftp用戶許可權
客戶端:
[root@CentOS8 ~]# ftp 10.0.0.11
Connected to 10.0.0.11 (10.0.0.11).
220 (vsFTPd 3.0.3)
Name (10.0.0.11:root): ftp
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> !ls
anaconda-ks.cfg test.1
ftp> cd pub
250 Directory successfully changed.
ftp> put test.1
local: test.1 remote: test.1
227 Entering Passive Mode (10,0,0,11,51,195).
150 Ok to send data.
226 Transfer complete.
10485760 bytes sent in 0.057 secs (184086.66 Kbytes/sec)
ftp>
說明:
不能給FTP根目錄寫許可權,只能給子目錄寫許可權,否則報如下錯誤
#服務端
[root@CentOS8 ~]# setfacl -m u:ftp:rwx /var/ftp/
#客戶端訪問
[root@CentOS8 ~]# ftp 10.0.0.11
Connected to 10.0.0.11 (10.0.0.11).
220 (vsFTPd 3.0.3)
Name (10.0.0.11:root): ftp
500 OOPS: vsftpd: refusing to run with writable root inside chroot()
Login failed.
421 Service not available, remote server has closed connection
ftp>
方法一:
anon_world_readable_only=NO 預設YES 所有人都具有讀許可權的文件才能下載
方法二:
anon_umask=0333 指定匿名上傳文件的umask,預設077,註意:0333中的0不能省略 0333是八進位形式
實現上傳文件的刪除和修改
anon_other_write_enable=YES 可刪除和修改上傳的文件,預設NO
- 指定匿名用戶的上傳文件的預設的所有者和許可權
#預設上傳文件的所有者就是客戶端當前的賬號
chown_uploads=YES #預設NO YES表示允許修改上傳文件的許可權和所有者
chown_username=wang #文件所有者
chown_upload_mode=0644 #文件許可權
- 設置Linux系統用戶登錄ftp伺服器
local_enable=YES #是否允許本地用戶登錄,YES表示允許
write_enable=YES #是否允許本地用戶上傳文件,YES表示允許
local_umask=022 #指定系統用戶上傳文件的預設許可權對應umask
- 將系統用戶映射為一個指定的賬號
guest_enable=YES #所有系統用戶都映射成某一個guest用戶
guest_username=ftp #配合上面選項才生效,指定guest用戶
local_root=/ftproot #指定guest賬號登錄進來映射的目錄
#設置每個用戶都擁有獨立的配置
user_config_dir=/etc/vsftpd/conf.d/ 每個用戶獨立的配置文件目錄 這裡可以針對不同的用戶放不同的配置
範例: 讓所有的系統用戶映射指定guest用戶
伺服器端配置
[root@CentOS8 ~]# vim /etc/vsftpd/vsftpd.conf
guest_enable=YES
guest_username=ftp
local_root=/ftproot
[root@CentOS8 ~]# useradd bob
[root@CentOS8 ~]# passwd bob
[root@CentOS8 ~]# mkdir ftproot/
[root@CentOS8 ~]# touch test1
客戶端:
[root@CentOS8 ~]# ftp 10.0.0.11
Connected to 10.0.0.11 (10.0.0.11).
220 (vsFTPd 3.0.3)
Name (10.0.0.11:root): bob
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 (10,0,0,11,172,77).
150 Here comes the directory listing.
-rw-r--r-- 1 0 0 0 Oct 21 03:46 test.1
226 Directory send OK.
ftp>
範例:映射登錄的用戶為guest用戶,並使用獨立的家目錄
服務端:
#創建tom和bob兩個用戶
#修改伺服器配置文件
[root@CentOS8 ~]# vim /etc/vsftpd/vsftpd.conf
guest_enable=YES 所有系統用戶都映射成guest用戶
guest_username=ftp 配合上面選項才生效,指定guest用戶
local_root=/ftproot 指定guest用戶登錄所在目錄,但不影響匿名用戶的登錄目錄
user_config_dir=/etc/vsftpd/conf.d/ 每個用戶獨立的配置文件目錄
#創建存放tom和bob獨立配置文件的目錄
[root@CentOS8 ~]# mkdir /etc/vsftpd/conf.d/
#生成tom和bob的獨立配置文件
[root@CentOS8 conf.d]# echo "local_root=/ftproot_bob" > /etc/vsftpd/conf.d/bob
[root@CentOS8 conf.d]# echo "local_root=/ftproot_tom" > /etc/vsftpd/conf.d/tom
#重啟服務
[root@CentOS8 ~]# systemctl status vsftpd.service
#創建對應的文件目錄
[root@CentOS8 ~]# mkdir /ftproot_bob /ftproot_tom
[root@CentOS8 ftproot_bob]# touch bob.test
[root@CentOS8 ftproot_tom]# touch tom.test
客戶端測試:
[root@CentOS8 ~]# ftp 10.0.0.11
Connected to 10.0.0.11 (10.0.0.11).
220 (vsFTPd 3.0.3)
Name (10.0.0.11:root): bob
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 (10,0,0,11,222,234).
150 Here comes the directory listing.
-rw-r--r-- 1 0 0 0 Oct 21 05:37 bob.test
226 Directory send OK.
ftp>
- 禁錮系統用戶
禁錮所有系統用戶在家目錄中:
#不允許用戶隨便切換目錄,只能在家目錄中
chroot_local_user=YES #禁錮系統用戶,預設NO,即不禁錮
此時ftp會把對應用戶的家目錄作為根目錄,如果這個家目錄存在寫許可權則登錄的時候會提示錯誤相關錯誤信息。
訪問ftp伺服器可以通過三種類型的賬號進行訪問:
-
匿名用戶:ftp、anonmous,共用目錄在/vat/ftp下
-
系統用戶:例如linux的自身的賬號,預設進入的就是用戶的加目錄
-
虛擬賬號:專用於ftp服務的賬號,虛擬賬號:給對應服務使用的賬號,不在操作系統上的賬號
- 日誌
vsftpd預設使用的就是wu-ftp的日誌格式
#wu-ftp 日誌:預設啟用
xferlog_enable=YES #啟用記錄上傳下載日誌,此為預設值
xferlog_std_format=YES #使用wu-ftp日誌格式,此為預設值
xferlog_file=/var/log/xferlog #可自動生成, 此為預設值
#vsftpd日誌:預設不啟用
dual_log_enable=YES 使用vsftpd日誌格式,預設不啟用
vsftpd_log_file=/var/log/vsftpd.log 可自動生成, 此為預設值
- 提示信息:
(1)登錄前提示信息
方法一:
ftpd_banner="welcome to mage ftp server"
方法二:將提示信息存放到一個文件中
banner_file=/etc/vsftpd/ftpbanner.txt
(2)目錄訪問提示信息
dirmessage_enable=YES #此為預設值,開啟這個選項後,在對應目錄中創建指定文件就實現了提示信息
message_file=.message #信息存放在指定目錄下.message ,此為預設值,只支持單行說明
- PAM模塊實現用戶訪問控制
pam是一個可插拔的配置模塊,利用pam可以控制用戶的訪問
pam_service_name=vsftpd # 預設值 vsftpd是/etc/pam.d/vsftpd下的一個文件
#pam配置文件:/etc/pam.d/vsftpd
/etc/vsftpd/ftpusers 預設文件中用戶拒絕登錄,預設是黑名單,但也可以是白名單
查看黑名單中限制登錄ftp的用戶
[root@CentOS8 pam.d]# cat /etc/vsftpd/ftpusers
# Users that are not allowed to login via ftp
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator
games
nobody
是否啟用控制用戶登錄的列表文件
userlist_enable=YES #此為預設值,表示啟用xx這個文件列表
userlist_deny=YES(預設值) #表示將xx設置為黑名單,不提示口令,NO為白名單
userlist_file=/etc/vsftpd/user_list #此為預設值,指定登錄列表文件
[root@CentOS8 pam.d]# cat /etc/vsftpd/user_list
# vsftpd userlist
# If userlist_deny=NO, only allow users in this file
# If userlist_deny=YES (default), never allow users in this file, and
# do not even prompt for a password.
# Note that the default vsftpd pam config also checks /etc/vsftpd/ftpusers
# for users that are denied.
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator
games
nobody
- 連接數限制
max_clients=0 #設置最大併發連接數
max_per_ip=0 #設置每個IP同時發起的最大連接數
- 連接超時時間設置;
connect_timeout=60 #主動模式數據連接超時時長
accept_timeout=60 #被動模式數據連接超時時長
data_connection_timeout=300 #數據連接無數據輸超時時長
idle_session_timeout=60 #無命令操作超時時長
- 設置傳輸速率,單位:位元組/秒
anon_max_rate=0 匿名用戶的最大傳輸速率,以位元組為單位,比如:1024000表示1MB/s
local_max_rate=0 本地用戶的最大傳輸速率