網站首頁 編程語言 正文
搭建FTP服務器
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端口是否開啟
#格式: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工具:
[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等
VSFTP
性能好、下載速度快、單機可支持15k并發量
VSFTP的安裝和配置:
ubuntu安裝vsftpd:
[root@HAproxy vsftpd]# apt install vsftpd -y
# 說明:vsftpd搭建的ftp服務器默認只允許匿名用戶連接 匿名用戶包括:ftp、anonmous。
# ubuntu1804 默認不允許匿名
訪問ftp服務器的三種方式:
1. 匿名賬號訪問:ftp或anonymous?
2. FTP服務器的本地賬號訪問:例如linux里面的root等用戶賬號
3. 虛擬賬號訪問:
? ? 虛擬賬號:操作系統中不存在的賬號,專用于對應服務的賬號。
? ? 例如登錄mysql使用的賬號也是虛擬賬號
VSFTPD的相關配置
FTP服務器的基礎配置:
配置文件格式:option=value ? # 注意:= 前后不要有空格
端口修改:
局域網內使用,端口一般不用修改
FTP服務器默認端口修改:
# 默認客戶端發起對服務端的連接請求,通過服務器的21端口連接到服務器
listen_port=2121 # 指定ftp服務器的端口是2121
FTP服務器主動模式數據通道端口修改:
# 更改數據通道主動模式服務端的端口:一般不用修改
connect_from_port_20=YES
ftp_data_port=20 (默認) # 指定主動模式的端口
FTP服務器被動模式的端口范圍:
# 設置服務端被動模式的端口范圍: 被動模式:客戶端主動連服務端 服務器端的數據通道端口隨機
# 服務端被動模式的端口范圍一般不用修改
pasv_min_port=6000 # 0為隨機分配,端口范圍會影響客戶端的并發數
pasv_max_port=6010 # 表示被動模式端口范圍是6000-6010 一共11個端口可用
注意:
# 使用linux的客戶端工具連接ftp服務端時:客戶端默認使用被動模式 例如:ftp
# 使用windows的客戶端工具連接ftp服務端時:客戶端默認使用主動模式 例如:Filezilla
FTP服務器的時間設置:
# 設置ftp服務器的時間為本地時間:(一般不用修改。有些客戶端能自動校準時間)
use_localtime=YES # 使用當地時間(默認為NO,使用GMT)
FTP服務器匿名用戶的相關設置
FTP服務器默認只允許匿名用戶登錄,匿名用戶包括ftp或anonymous。
匿名用戶:在客戶機上不存在的用戶叫做匿名用戶,匿名用戶是單獨為特定服務效力的用戶。例如FTP服務器的ftp用戶,mysql的root用戶等都是匿名用戶。
# 設置允許匿名用戶登錄 centos7默認就允許匿名用戶登錄
anonymous_enable=YES # 支持匿名用戶,默認不允許匿名
# 設置允許匿名用戶使用空密碼登錄。
no_anon_password=YES # 匿名用戶略過口令檢查 , 默認NO,表示不輸入匿名用戶的密碼進行登錄
匿名用戶權限設置
# 設置匿名用戶能上傳文件到FTP服務器
anon_upload_enable=YES # 允許匿名上傳,注意:文件系統權限
# 設置匿名用戶能在FTP服務器上創建目錄文件
anon_mkdir_write_enable=YES #允許匿名創建文件夾
說明:
# 跨網絡傳輸數據需要注意的問題:
# (1)服務自身:服務本身是否允許
# (2)文件系統的權限:是否具備文件系統的寫權限
例如:雖然開啟了允許匿名用戶上傳文件,但是文件對這個用戶沒有寫權限,照樣上傳不上去
說明:設置文件權限的時候,不能給用戶的根目錄寫權限,只能給子目錄寫權限,否則連接的時候報如下錯誤
500 OOPS: vsftpd: refusing to run with writable root inside chroot()
Login failed.
421 Service not available, remote server has closed connection
匿名用戶上傳的文件屬性設置
# 設置匿名用戶的上傳文件的默認的所有者和權限
chown_uploads=YES # 默認NO YES表示允許修改上傳文件的權限和所有者
chown_username=wang # 指定匿名用戶上傳文件的文件所有者(如果不指定,文件的屬主就是這個匿名用戶)
chown_upload_mode=0644 # 指定上傳文件的文件權限
例如:不設置匿名用戶上傳的文件屬性
#文件的屬主就是這個匿名用戶
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服務器上的文件,只有所有人都具有讀權限的文件才能下載。
# 方法一:
anon_world_readable_only=NO # 只能下載全部讀的文件, 默認YES,表示只有所有人都具有讀權限的文件才能下載
# 方法二:設置上傳文件的默認權限
anon_umask=0333 # 指定匿名上傳文件的umask,默認077,注意:0333中的0不能省略 (777-333=444)
刪除和修改
# 默認情況是傳上去了就不能刪除了
anon_other_write_enable=YES # 可刪除和修改上傳的文件,默認NO ,改為yes
使用FTP服務器的系統用戶登錄FTP服務器相關設置
使用FTP服務器上面的系統用戶進行登錄。
# 設置允許系統用戶登錄ftp服務器并上傳文件:
local_enable=YES # 是否允許本地用戶登錄,YES表示允許
write_enable=YES # 是否允許本地用戶上傳文件,YES表示允許
local_umask=022 # 指定系統用戶上傳文件的默認權限對應umask
系統用戶的相關權限設置
local_enable=YES # 是否允許本地用戶登錄,YES表示允許
write_enable=YES # 是否允許本地用戶上傳文件,YES表示允許
local_umask=022 # 指定系統用戶上傳文件的默認權限對應umask
FTP服務器的虛擬用戶設置
使用系統用戶登錄FTP服務器的時候,統一將所有系統用戶都映射成某一個guest用戶。
可以映射為任何一個用戶,但這個用戶必須要在FTP服務器上面存在才行。不一定是ftp這個用戶,可以映射成任何一個系統賬號。
guest_enable=YES # 所有系統用戶都映射成某一個guest用戶
guest_username=ftp # 配合上面選項才生效,指定guest用戶
local_root=/ftproot # 指定guest賬號登錄進來映射的目錄 所有的操作系統用戶登錄進來都是這個目錄(如果不指定就在guest_username這個用戶的家目錄里面)
#設置每個用戶都擁有獨立的配置
user_config_dir=/etc/vsftpd/conf.d/ # 每個用戶獨立的配置文件目錄 這里可以針對不同的用戶放不同的配置
禁錮設置
禁錮所有系統用戶在家目錄中,不能cd到其它目錄。因為使用系統用戶登錄以后,默認能隨便切換到其它目錄里面去。
#不允許用戶隨便切換目錄,只能在家目錄中
chroot_local_user=YES #禁錮系統用戶,默認NO,即不禁錮
# 此時ftp會把對應用戶的家目錄作為根目錄,如果這個家目錄存在寫權限則登錄的時候會提示錯誤相關錯誤信息。
其它設置
設置ftp服務器的日志:
# vsftpd默認使用的就是wu-ftp的日志格式,vsftpd日志:默認不啟用。可以手動啟用
# 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 # 可自動生成, 此為默認值
設置用戶使用客戶端連接ftp服務器后的提示信息:
# 方法一:
ftpd_banner="welcome to mage ftp server"
# 方法二:將提示信息存放到一個文件中
banner_file=/etc/vsftpd/ftpbanner.txt
范例:ubuntu1804 配置匿名用戶訪問FTP服務器
#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服務器
# 創建測試目錄
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. 創建目錄文件
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. 創建目錄
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對這個目錄有寫權限,所以登錄就會報錯。
解決方法:
# 方法一:
chomod 555 /home/wang #取消寫權限
#方法二:
allow_writeable_chroot=YES #允許對家目錄的寫權限
黑名單、白名單
chroot_list_enable=YES #默認是NO YES表示要啟用chroot_list_file 開啟名單
chroot_list_file=/etc/vsftpd/chroot_list #里面存放用戶名
白名單:默認都不能訪問,只有名單里面的才能訪問。
chroot_local_user=YES #禁錮所有系統用戶在家目錄中
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list #表示的是白名單
黑名單:默認都能訪問,名單里面的不能訪問
chroot_local_user=NO #不禁錮所有系統用戶在家目錄中
chroot_list_enable=YES #設置允許或者拒絕的用戶列表,YES標識啟用這個列表
chroot_list_file=/etc/vsftpd/chroot_list #表示的是黑名單
PAM模塊實現用戶訪問控制
root身份不能連接FTP服務器的原因就是使用pam來限制的,因為ftp是明文傳輸用戶密碼的。為了安全不允許root登錄ftp服務器。
vsftpd利用pam來控制用戶的訪問。
# 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
并發連接數設置
# 同一時間允許多少個用戶連接
max_clients=1000 #默認值是不受限制的
#每個IP同時發起的最大連接數
max_per_ip=0 #默認不受限制
速率控制
# 匿名用戶的最大傳輸速率,以字節為單位,比如:1024000表示1MB/s
anon_max_rate=0 #默認不受限制
# 本地用戶的最大傳輸速率
local_max_rate=0 #默認不受限制
原文鏈接:https://www.cnblogs.com/heyongshen/p/16966069.html
相關推薦
- 2022-06-21 C++分析講解類的靜態成員變量是什么_C 語言
- 2021-12-07 關于postman上傳文件執行成功而使用collection?runner執行失敗的問題_相關技巧
- 2023-08-01 elementui DateTimePicker組件 限制時間范圍(包含時分秒)
- 2022-11-14 mq消息積壓怎么對應
- 2023-01-23 oracle數據排序后獲取前幾行數據的寫法(rownum、fetch方式)_oracle
- 2022-06-04 C#復雜XML反序列化為實體對象兩種方式小結_C#教程
- 2022-04-22 npm WARN postcss-modules@4.2.2 requires a peer of
- 2022-10-29 正則表達式從HTML中匹配img標簽的圖片地址_正則表達式
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支