ubuntu1804搭建FTP服務器的詳細教程
搭建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 00 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 00 0 Dec 08 10:56 12345 -rw-r--r-- 1 1000 1000 1659 Dec 08 10:59 anaconda-ks.cfg drwxrwxrwx 2 00 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 00 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 requiredpam_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 requiredpam_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 #默認不受限制
到此這篇關于ubuntu1804搭建FTP服務器的方法的文章就介紹到這了,更多相關ubuntu1804搭建FTP服務器內容請搜索以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持!