時間:2022-12-10來源:www.djmaza-info.com作者:電腦系統城
FTP的工作原理:
FTP:File Transfer Protocol ,文件傳輸協議。屬于NAS存儲的一種協議,基于CS結構。
ftp采用的是雙端口模式,分為命令端口和數據端口,命令端口對應命令通道,數據端口對應數據通道。
命令端口:FTP服務器的命令端口默認是tcp/21
數據端口:隨機
兩種工作模式:主動模式和被動模式
主動模式:FTP服務器主動連接客戶端,這個時候FTP服務器的數據端口使用的是20端口。
被動模式:客戶端主動連接FTP服務器,這時候FTP服務器的數據端口是隨機的。
FTP的工作過程:
1.服務端開啟對21端口的監聽。
2.客戶端發起對服務端的連接請求,通過服務器的21端口連接到服務器。此時建立起了命令通道,命令通道用于傳輸和通信相關的一些指令。
3.建立數據通道
如果是主動模式:服務端會使用20端口主動連客戶端的一個隨機端口。
如果是被動模式:客戶端使用一個隨機端口連接服務端的一個隨機端口
4.使用數據通道進行數據的傳輸。
探測端口是否打開的方法:
telnet工具:
例如:查看22端口是否開啟
1 2 3 4 5 6 7 8 |
#格式:telnet host port #如果能響應則端口就是打開的 #如果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 |
nmap工具:
1 2 3 4 5 6 7 8 9 10 |
[root@HAproxy ~] # nmap 10.0.0.66 -p 21 Starting Nmap 7.70 ( https: //nmap .org ) at 2022-12-08 13:37 CST Nmap scan report for 10.0.0.66 Host is up (0.00033s latency). PORT STATE SERVICE 21 /tcp open ftp MAC Address: 00:0C:29:29:03:AF (VMware) Nmap done : 1 IP address (1 host up) scanned in 0.53 seconds |
實現FTP的相關軟件:
windows中的相關軟件:Filezilla、IIS
Filezilla官網: https://filezilla-project.org/index.php
linux中的相關軟件:
服務端:vsftpd、Wu-ftpd等
vsftpd官網: https://security.appspot.com/vsftpd.html
客戶端:ftp、wget、curl等
性能好、下載速度快、單機可支持15k并發量
VSFTP的安裝和配置:
ubuntu安裝vsftpd:
1 2 3 4 5 |
[root@HAproxy vsftpd] # apt install vsftpd -y # 說明:vsftpd搭建的ftp服務器默認只允許匿名用戶連接 匿名用戶包括:ftp、anonmous。 # ubuntu1804 默認不允許匿名 |
訪問ftp服務器的三種方式:
1. 匿名賬號訪問:ftp或anonymous
2. FTP服務器的本地賬號訪問:例如linux里面的root等用戶賬號
3. 虛擬賬號訪問:
虛擬賬號:操作系統中不存在的賬號,專用于對應服務的賬號。
例如登錄mysql使用的賬號也是虛擬賬號
FTP服務器的基礎配置:
配置文件格式:option=value # 注意:= 前后不要有空格
端口修改:
局域網內使用,端口一般不用修改
FTP服務器默認端口修改:
1 2 |
# 默認客戶端發起對服務端的連接請求,通過服務器的21端口連接到服務器 listen_port=2121 # 指定ftp服務器的端口是2121 |
FTP服務器主動模式數據通道端口修改:
1 2 3 |
# 更改數據通道主動模式服務端的端口:一般不用修改 connect_from_port_20=YES ftp_data_port=20 (默認) # 指定主動模式的端口 |
FTP服務器被動模式的端口范圍:
1 2 3 4 |
# 設置服務端被動模式的端口范圍: 被動模式:客戶端主動連服務端 服務器端的數據通道端口隨機 # 服務端被動模式的端口范圍一般不用修改 pasv_min_port=6000 # 0為隨機分配,端口范圍會影響客戶端的并發數 pasv_max_port=6010 # 表示被動模式端口范圍是6000-6010 一共11個端口可用 |
注意:
1 2 3 |
# 使用linux的客戶端工具連接ftp服務端時:客戶端默認使用被動模式 例如:ftp # 使用windows的客戶端工具連接ftp服務端時:客戶端默認使用主動模式 例如:Filezilla |
FTP服務器的時間設置:
1 2 3 |
# 設置ftp服務器的時間為本地時間:(一般不用修改。有些客戶端能自動校準時間) use_localtime=YES # 使用當地時間(默認為NO,使用GMT) |
FTP服務器匿名用戶的相關設置
FTP服務器默認只允許匿名用戶登錄,匿名用戶包括ftp或anonymous。
匿名用戶:在客戶機上不存在的用戶叫做匿名用戶,匿名用戶是單獨為特定服務效力的用戶。例如FTP服務器的ftp用戶,mysql的root用戶等都是匿名用戶。
1 2 3 4 5 |
# 設置允許匿名用戶登錄 centos7默認就允許匿名用戶登錄 anonymous_enable=YES # 支持匿名用戶,默認不允許匿名 # 設置允許匿名用戶使用空密碼登錄。 no_anon_password=YES # 匿名用戶略過口令檢查 , 默認NO,表示不輸入匿名用戶的密碼進行登錄 |
匿名用戶權限設置
1 2 3 4 5 |
# 設置匿名用戶能上傳文件到FTP服務器 anon_upload_enable=YES # 允許匿名上傳,注意:文件系統權限 # 設置匿名用戶能在FTP服務器上創建目錄文件 anon_mkdir_write_enable=YES #允許匿名創建文件夾 |
說明:
1 2 3 4 5 |
# 跨網絡傳輸數據需要注意的問題: # (1)服務自身:服務本身是否允許 # (2)文件系統的權限:是否具備文件系統的寫權限 例如:雖然開啟了允許匿名用戶上傳文件,但是文件對這個用戶沒有寫權限,照樣上傳不上去 |
說明:設置文件權限的時候,不能給用戶的根目錄寫權限,只能給子目錄寫權限,否則連接的時候報如下錯誤
1 2 3 |
500 OOPS: vsftpd: refusing to run with writable root inside chroot() Login failed. 421 Service not available, remote server has closed connection |
匿名用戶上傳的文件屬性設置
1 2 3 4 5 6 |
# 設置匿名用戶的上傳文件的默認的所有者和權限 chown_uploads=YES # 默認NO YES表示允許修改上傳文件的權限和所有者 chown_username=wang # 指定匿名用戶上傳文件的文件所有者(如果不指定,文件的屬主就是這個匿名用戶) chown_upload_mode=0644 # 指定上傳文件的文件權限 |
例如:不設置匿名用戶上傳的文件屬性
1 2 3 4 5 6 |
#文件的屬主就是這個匿名用戶 root@ubuntu1804: /srv/ftp/tmp # ll -rw------- 1 ftp ftp 1659 Dec 7 21:37 anaconda-ks.cfg -rw------- 1 ftp ftp 258449 Dec 7 21:20 '' $ '\265\347\327' '?' $ '\317' '?.pdf' -rw------- 1 ftp ftp 77703 Dec 7 21:20 ZKZ_4224961_20201023210611127.pdf -rw------- 1 ftp ftp 247706 Dec 7 21:30 xxxxxx.pdf' |
下載
默認下載FTP服務器上的文件,只有所有人都具有讀權限的文件才能下載。
1 2 3 4 5 |
# 方法一: anon_world_readable_only=NO # 只能下載全部讀的文件, 默認YES,表示只有所有人都具有讀權限的文件才能下載 # 方法二:設置上傳文件的默認權限 anon_umask=0333 # 指定匿名上傳文件的umask,默認077,注意:0333中的0不能省略 (777-333=444) |
刪除和修改
1 2 |
# 默認情況是傳上去了就不能刪除了 anon_other_write_enable=YES # 可刪除和修改上傳的文件,默認NO ,改為yes |
使用FTP服務器的系統用戶登錄FTP服務器相關設置
使用FTP服務器上面的系統用戶進行登錄。
1 2 3 4 5 6 |
# 設置允許系統用戶登錄ftp服務器并上傳文件: local_enable=YES # 是否允許本地用戶登錄,YES表示允許 write_enable=YES # 是否允許本地用戶上傳文件,YES表示允許 local_umask=022 # 指定系統用戶上傳文件的默認權限對應umask |
系統用戶的相關權限設置
1 2 3 4 5 |
local_enable=YES # 是否允許本地用戶登錄,YES表示允許 write_enable=YES # 是否允許本地用戶上傳文件,YES表示允許 local_umask=022 # 指定系統用戶上傳文件的默認權限對應umask |
FTP服務器的虛擬用戶設置
使用系統用戶登錄FTP服務器的時候,統一將所有系統用戶都映射成某一個guest用戶。
可以映射為任何一個用戶,但這個用戶必須要在FTP服務器上面存在才行。不一定是ftp這個用戶,可以映射成任何一個系統賬號。
1 2 3 4 5 6 7 8 |
guest_enable=YES # 所有系統用戶都映射成某一個guest用戶 guest_username= ftp # 配合上面選項才生效,指定guest用戶 local_root= /ftproot # 指定guest賬號登錄進來映射的目錄 所有的操作系統用戶登錄進來都是這個目錄(如果不指定就在guest_username這個用戶的家目錄里面) #設置每個用戶都擁有獨立的配置 user_config_dir= /etc/vsftpd/conf .d/ # 每個用戶獨立的配置文件目錄 這里可以針對不同的用戶放不同的配置 |
禁錮設置
禁錮所有系統用戶在家目錄中,不能cd到其它目錄。因為使用系統用戶登錄以后,默認能隨便切換到其它目錄里面去。
1 2 3 |
#不允許用戶隨便切換目錄,只能在家目錄中 chroot_local_user=YES #禁錮系統用戶,默認NO,即不禁錮 # 此時ftp會把對應用戶的家目錄作為根目錄,如果這個家目錄存在寫權限則登錄的時候會提示錯誤相關錯誤信息。 |
其它設置
設置ftp服務器的日志:
1 2 3 4 5 6 7 8 |
# vsftpd默認使用的就是wu-ftp的日志格式,vsftpd日志:默認不啟用??梢允謩訂⒂?/code> |
設置用戶使用客戶端連接ftp服務器后的提示信息:
1 2 3 4 |
# 方法一: ftpd_banner= "welcome to mage ftp server" # 方法二:將提示信息存放到一個文件中 banner_file= /etc/vsftpd/ftpbanner .txt |
范例:ubuntu1804 配置匿名用戶訪問FTP服務器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
#1. 創建對應的目錄 root@ubuntu1804:~ # mkdir /data root@ubuntu1804:~ # mkdir /data/data root@ubuntu1804:~ # chmod 777 /data/data #簡單粗暴的方法 # root@ubuntu1804:~# setfacl -m u:ftp:rwx /data/data # 給ftp用戶權限 #2. 修改配置文件 root@ubuntu1804:~ # vim /etc/vsftpd.conf anonymous_enable=YES no_anon_password=YES anon_upload_enable= yes anon_mkdir_write_enable= yes anon_other_write_enable= yes anon_world_readable_only=NO write_enable= yes # allow_writeable_chroot=YES #對根目錄的寫權限,匿名用戶不生效 chroot_local_user=YES anon_root= /data #指定匿名用戶登錄進來后的根目錄,如果不加就在該用戶的家目錄 #3. 重啟服務 root@ubuntu1804:~ # systemctl status vsftpd.service #4. 測試 [root@HAproxy ~] # ftp 10.0.0.66 #連接到FTP服務器 Connected to 10.0.0.66 (10.0.0.66). 220 (vsFTPd 3.0.3) Name (10.0.0.66:root): ftp 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp > pwd 257 "/" is the current directory ftp > ls 227 Entering Passive Mode (10,0,0,66,235,199). 150 Here comes the directory listing. -rw-r--r-- 1 0 0 0 Dec 08 10:33 12345 drwxr-xr-x 2 111 115 4096 Dec 08 10:38 data 226 Directory send OK. ftp > cd data #進入數據目錄 250 Directory successfully changed. ftp > ! ls 12345 abc anaconda-ks.cfg ftp > put 12345 #上傳文件 local : 12345 remote: 12345 227 Entering Passive Mode (10,0,0,66,158,145). 150 Ok to send data. 226 Transfer complete. ftp > ls 227 Entering Passive Mode (10,0,0,66,157,235). 150 Here comes the directory listing. -rw------- 1 111 115 4 Dec 08 10:37 123 -rw------- 1 111 115 0 Dec 08 10:42 12345 226 Directory send OK. ftp > get 123 #下載文件 local : 123 remote: 123 227 Entering Passive Mode (10,0,0,66,67,112). 150 Opening BINARY mode data connection for 123 (4 bytes). 226 Transfer complete. 4 bytes received in 2.1e-05 secs (190.48 Kbytes /sec ) ftp > |
范例:設置允許FTP服務器的系統用戶來登錄ftp服務器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
# 創建測試目錄 root@ubuntu1804:~ # mkdir /ftproot root@ubuntu1804:~ # chmod 777 /ftproot root@ubuntu1804:~ # setfacl -m u:ftp:rwx /ftproot #更改配置文件 local_enable=YES write_enable=YES local_umask=022 local_root= /ftproot allow_writeable_chroot=YES #允許對 chroot_local_user=YES #測試 [root@HAproxy ~] # ftp 10.0.0.66 Connected to 10.0.0.66 (10.0.0.66). 220 (vsFTPd 3.0.3) Name (10.0.0.66:root): tom #如果這個用戶在FTP服務器上不存在,需要使用useradd -m xx創建 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,66,60,121). 150 Here comes the directory listing. -rw-r--r-- 1 0 0 0 Dec 08 10:56 12345 -rw-r--r-- 1 1000 1000 1659 Dec 08 10:59 anaconda-ks.cfg drwxrwxrwx 2 0 0 4096 Dec 08 10:58 data -rw-r--r-- 1 1000 1000 1198 Dec 08 10:59 notepad++.exe - ¿?·½?.lnk 226 Directory send OK. ftp > ! ls 123 12345 abc anaconda-ks.cfg ftp > put 123 #上傳文件 local : 123 remote: 123 227 Entering Passive Mode (10,0,0,66,57,52). 150 Ok to send data. 226 Transfer complete. 4 bytes sent in 7.4e-05 secs (54.05 Kbytes /sec ) ftp > get anaconda-ks.cfg #下載文件 local : anaconda-ks.cfg remote: anaconda-ks.cfg 227 Entering Passive Mode (10,0,0,66,28,156). 150 Opening BINARY mode data connection for anaconda-ks.cfg (1659 bytes). 226 Transfer complete. 1659 bytes received in 9.1e-05 secs (18230.77 Kbytes /sec ) ftp > |
范例:設置系統用戶登錄FTP服務器后統一映射為一個虛擬用戶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
#1. 創建目錄文件 root@ubuntu1804:~ # mkdir /ftproot root@ubuntu1804:~ # chmod 777 /ftproot #2. 修改配置文件 root@ubuntu1804:~ # vim /etc/vsftpd.conf local_enable=YES write_enable= yes guest_enable=YES guest_username= ftp chroot_local_user=YES #禁錮 local_root= /ftproot #因為映射為了虛擬用戶 所以要配置虛擬用戶的相關權限 anon_upload_enable= yes anon_mkdir_write_enable= yes anon_other_write_enable= yes anon_world_readable_only=NO allow_writeable_chroot=YES #允許對根目錄有寫權限 # 3.重啟服務 root@ubuntu1804:~ # systemctl restart vsftpd.service # 4. 測試 [root@HAproxy ~] # ftp 10.0.0.66 #連接FTP服務器 Connected to 10.0.0.66 (10.0.0.66). 220 (vsFTPd 3.0.3) Name (10.0.0.66:root): tom #FTP服務器的系統用戶登錄 331 Please specify the password. Password: #輸入密碼 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp > ! ls 123 12345 abc anaconda-ks.cfg ftp > put abc #上傳文件 local : abc remote: abc 227 Entering Passive Mode (10,0,0,66,143,226). 150 Ok to send data. 226 Transfer complete. 4 bytes sent in 6.6e-05 secs (60.61 Kbytes /sec ) ftp > get desktop.ini #下載文件 local : desktop.ini remote: desktop.ini 227 Entering Passive Mode (10,0,0,66,45,217). 150 Opening BINARY mode data connection for desktop.ini (474 bytes). 226 Transfer complete. 474 bytes received in 0.000216 secs (2194.44 Kbytes /sec ) ftp > ! ls #查看下載的文件 123 12345 abc anaconda-ks.cfg desktop.ini |
范例:將系統用戶映射為一個指定的系統用戶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
#1. 創建目錄 root@ubuntu1804:~ # mkdir /ftproot root@ubuntu1804:~ # chmod 777 /ftproot #2. 修改配置文件 和上面的配置文件一樣 local_enable=YES #允許本地用戶登錄 write_enable=YES #允許本地用戶上傳文件 local_umask=022 #允許本地用戶上傳文件的權限 local_root= /ftproot #指定用戶的目錄 allow_writeable_chroot=YES #允許對根目錄有寫權限 chroot_local_user=YES #禁錮用戶 guest_enable=YES #允許映射為指定用戶 guest_username=bob #系統用戶bob anon_other_write_enable= yes anon_upload_enable= yes # anon_mkdir_write_enable= yes anon_world_readable_only=NO #3. 重啟服務 root@ubuntu1804:~ # systemctl restart vsftpd.service #4. 測試 [root@HAproxy ~] # ftp 10.0.0.66 Connected to 10.0.0.66 (10.0.0.66). 220 (vsFTPd 3.0.3) Name (10.0.0.66:root): tom 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,66,194,152). 150 Here comes the directory listing. drwx------ 2 1001 1001 4096 Dec 08 11:47 157 drwxrwxrwx 2 0 0 4096 Dec 08 11:33 data 226 Directory send OK. ftp > ! ls 123 12345 abc anaconda-ks.cfg desktop.ini ftp > put 123 #上傳 local : 123 remote: 123 227 Entering Passive Mode (10,0,0,66,150,72). 150 Ok to send data. 226 Transfer complete. 4 bytes sent in 5.5e-05 secs (72.73 Kbytes /sec ) ftp > get 123 #下載 local : 123 remote: 123 227 Entering Passive Mode (10,0,0,66,171,38). 150 Opening BINARY mode data connection for 123 (4 bytes). 226 Transfer complete. 4 bytes received in 9.5e-05 secs (42.11 Kbytes /sec ) |
注意事項
將登錄的目錄作為了當前用戶的根目錄,但是FTP服務器的根站點要求這個登錄的用戶對他沒有寫權限。
例如使用wang用戶進行登錄,對用戶進行了禁錮的操作,使用wang登錄的時候,就把/homt/wang作為了根,但是wang對這個目錄有寫權限,所以登錄就會報錯。
解決方法:
1 2 3 4 5 |
# 方法一: chomod 555 /home/wang #取消寫權限 #方法二: allow_writeable_chroot=YES #允許對家目錄的寫權限 |
黑名單、白名單
1 2 3 |
chroot_list_enable=YES #默認是NO YES表示要啟用chroot_list_file 開啟名單 chroot_list_file= /etc/vsftpd/chroot_list #里面存放用戶名 |
白名單:默認都不能訪問,只有名單里面的才能訪問。
1 2 3 |
chroot_local_user=YES #禁錮所有系統用戶在家目錄中 chroot_list_enable=YES chroot_list_file= /etc/vsftpd/chroot_list #表示的是白名單 |
黑名單:默認都能訪問,名單里面的不能訪問
1 2 3 |
chroot_local_user=NO #不禁錮所有系統用戶在家目錄中 chroot_list_enable=YES #設置允許或者拒絕的用戶列表,YES標識啟用這個列表 chroot_list_file= /etc/vsftpd/chroot_list #表示的是黑名單 |
root身份不能連接FTP服務器的原因就是使用pam來限制的,因為ftp是明文傳輸用戶密碼的。為了安全不允許root登錄ftp服務器。
vsftpd利用pam來控制用戶的訪問。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
# vsftpd中的默認配置: pam_service_name=vsftpd #vsftpd指的就是/etc/pam.d/vsftpd這個文件 ------------------------------------------------------------------------------------------------------------ root@ubuntu1804: /etc/pam .d # vim vsftpd # Standard behaviour for ftpd(8). #放入這個文件的用戶是被拒絕登錄FTP服務器的 auth required pam_listfile.so item=user sense=deny file = /etc/ftpusers onerr=succeed # Note: vsftpd handles anonymous logins on its own. Do not enable pam_ftp.so. # Standard pam includes @include common-account @include common-session @include common-auth auth required pam_shells.so ------------------------------------------------------------------------------------------------------------ root@ubuntu1804: /etc/pam .d # vim /etc/ftpusers #這個文件里面的用戶都是禁止登陸的 # /etc/ftpusers: list of users disallowed FTP access. See ftpusers(5). root daemon bin sys sync games man lp mail news uucp nobody |
并發連接數設置
1 2 3 4 5 |
# 同一時間允許多少個用戶連接 max_clients=1000 #默認值是不受限制的 #每個IP同時發起的最大連接數 max_per_ip=0 #默認不受限制 |
速率控制
1 2 3 4 5 |
# 匿名用戶的最大傳輸速率,以字節為單位,比如:1024000表示1MB/s anon_max_rate=0 #默認不受限制 # 本地用戶的最大傳輸速率 local_max_rate=0 #默認不受限制 |
到此這篇關于ubuntu1804搭建FTP服務器的方法的文章就介紹到這了
2022-12-10
nginx部署vue項目,給訪問路徑加前綴的實現2022-12-08
利用VSCode進行遠程Linux服務器、容器開發,達到ide開發項目的效果(最新推薦)2022-12-08
基于Nginx搭建WebDAV服務的詳細過程Nginx (engine x) 是一個高性能的HTTP和反向代理web服務器,同時也提供了IMAP/POP3/SMTP服務,這篇文章主要介紹了nginx配置訪問本地靜態資源,需要的朋友可以參考下...
2022-12-08