ubuntu1804搭建FTP伺服器的方法

2022-12-08 15:00:16

搭建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  #預設不受限制