CentOS 7.3 FTP服務器的安裝與配置

一、FTP服務簡介

1. FTP服務和FTP協議

FTP服務是Internet上最早應用主機之間進行數據傳輸的基本服務之一。FTP服務的一個非常重要的特點就是可以獨立於平臺,也就是說在UNIX、MAC、Windows等操作系統中都可以實現FTP的客戶端和服務器。儘管目前已經普遍採用HTTP方式傳送文件,但FTP仍然是跨平臺直接傳送文件的主要方式。

FTP文件傳輸協議(File Transfer Protocol,FTP)。該協議定義了一個在遠程計算機系統和本地計算機系統之間傳輸文件的一個標準。FTP運行在OSI模型的應用層,並利用傳輸控制協議TCP在不同的主機之間提供可靠的數據傳輸。FTP在文件傳輸中還支持斷點續傳功能,可以大幅度地減小CPU和網絡帶寬的開銷。


2. FTP的工作原理

與大多數的Internet服務一樣,FTP協議也是一個客戶機/服務器系統,用戶通過一個支持FTP協議的客戶機程序,連接到遠程主機上的FTP服務器程序,用戶通過客戶機程序向服務器程序發送命令,服務器程序執行用戶所發出的命令,並將結果返回給客戶機。


FTP協議模型:

image.png

用戶接口(UI):提供了一個用戶接口並使用客戶端協議解釋器的服務;

客戶端協議解釋器(CPI):向遠程服務器協議機發送命令並且驅動客戶數據傳輸過程;

服務端協議解釋器(SPI):響應客戶協議機發出的命令並驅動服務器端數據傳輸過程;

客戶端數據傳輸協議(CDTP):負責完成和服務器數據傳輸過程及客戶端本地文件系統通信;

服務端數據傳輸協議(SDTP):負責完成和客戶數據傳輸過程及服務器端文件系統的通信。


3. FTP的數據傳輸模式

FTP使用的端口號:

    數據傳輸端口    20  --用於數據的上傳和下載

    命令傳輸端口    21  --用於ftp命令的傳輸

FTP的兩種模式:

PORT(主動)方式的連接過程是:

           客戶端向服務器的FTP端口(默認是21)發送連接請求,服務器接受連接,建立一條命令鏈路。

           當需要傳送數據時,客戶端在命令鏈路上用 PORT命令告訴服務器:“我打開了****端口(大於1024的隨機端口),你過來連接我”。

           於是服務器從20端口向客戶端的****端口發送連接請求,建立一條數據鏈路來傳送數據。

 

PASV(被動)方式的連接過程是:

           客戶端向服務器的FTP端口(默認是21)發送連接請求,服務器接受連接,建立一條命令鏈路。

           當需要傳送數據時,服務器在命令鏈路上用 PASV命令告訴客戶端:“我打開了****端口(大於1024的隨機端口),你過來連接我”。

           於是客戶端向服務器的****端口發送連接請求,建立一條數據鏈路來傳送數據。

           image.png


主動模式好還是被動模式好?

先假設一種場景:客戶端用戶安裝個人防火牆,但又不懂防火牆的配置,所以防火牆默認配置。

個人防火牆的默認一般只會拒絕進來的包,而不會拒絕你出去的包和你出去再回來的包。

所以上面的主動模式是有可能被拒絕掉的。

主動ftp對ftp服務器的管理有利,但對客戶端的管理不利。因爲是服務端主動與客戶端去建立連接,可能會被客戶端的防火牆把來自於服務器的包給阻塞掉。

被動ftp對ftp客戶端的管理有利,但對服務端的管理不利。因爲客戶端主動與服務端去連,可能會被服務端的防火牆給阻塞掉。

折中的方法就是使用被動模式,並指定一個連接過來的端口範圍,可以針對這個範圍的端口進行一個防火牆的設置。


二、系統環境

系統平臺: CentOS 7.3

FTP Server: 192.168.8.88

關閉防火牆

# systemctl stop firewalld  --臨時關閉防火牆
# systemctl disable firewalld  --永久關閉防火牆


臨時關閉:關閉selinux

# setenforce 0


永久關閉:

# vim /etc/selinux/config
SELINUX=disabled   --將enforcing改爲disabled

# reboot  --重啓系統永久生效


三、CentOS下的vsftpd服務

在Linux下搭建FTP服務器一般會用VSFTP,全稱爲“Very Secure FTP Daemon”,是一個以安全爲重心的FTP服務器,關於VSFTP的介紹就不多寫了,大家可以瀏覽官方網站http://vsftpd.beasts.org進行了解。

1. 安裝vsftpd

# yum -y install vsftpd     --服務端
# yum -y install ftp lftp   --客戶端
如果已經安裝過了,則顯示“無須任何處理”

如果在服務器將三個都安裝,那麼服務器也可以作爲客戶端登錄本臺服務器的FTP。


FTP配置文件主要有下面三個:

  • 主配置文件:/etc/vsftpd/vsftpd.conf

  • 用戶訪問控制配置文件:/etc/vsftpd/{ftpusers, user_list}


FTP的家目錄:/var/ftp ,也就是存放上傳文件的目錄

# systemctl start vsftpd.service   --啓動服務
# systemctl enable vsftpd.service  --設爲開機自啓動

 image.png

# netstat -ntl | grep :21  --現在是隻能看到監聽21端口

image.png

# lsof -i:21   --查看監聽21端口

FTP的工作模式解析爲:

vsftpd默認的工作模式是被動模式。


FTP的匿名用戶

ftp                           --系統用戶,/etc/passwd裏有此用戶,默認進入ftp用戶的家目錄

anonymous            --系統中無此用戶(匿名),默認是可以進入/var/ftp的


2. CentOS 7中vsftpd默認的主配置文件

查看vsftpd的默認主配置文件

# cat -n /etc/vsftpd/vsftpd.conf | grep -v "#"     --grep -v ^# 代表是過濾以#號開頭的行


 12 anonymous_enable=YES            # 是否允許匿名用戶登陸,yes是允許
 16 local_enable=YES                # 允許本地用戶登陸
 19 write_enable=YES                # 允許本地用戶寫權限
 23 local_umask=022                 # 本地用戶上傳或創建文件時的權限
 29 # anon_upload_enable=YES        # 默認是註釋的,意爲允許匿名用戶上傳文件
 33 # anon_mkdir_write_enable=YES   # 默認是註釋的,意爲允許匿名用戶創建文件
 37 dirmessage_enable=YES           # 文件的描述
 40 xferlog_enable=YES              # 開啓日誌(/var/log/xferlog),只上傳和下載的記錄
 43 connect_from_port_20=YES        # 是否允許開啓主動模式,通過20端口傳輸數據
 57 xferlog_std_format=YES          # 爲yes的話代表創建一個新的日誌文件,爲no的話,日誌放到/var/log/vsftpd.log文件裏
114 listen=NO                       # 獨立模式,爲yes代表是用vsftpd本身腳本啓動,爲no代表要以xinetd守護進程啓動
123 listen_ipv6=YES                 # 若要打開獨立模式,需要把此項關閉,這是CentOS 7 和 6 的區別
125 pam_service_name=vsftpd         # 支持模塊的植入
126 userlist_enable=YES             # 打開用戶列表
127 tcp_wrappers=YES                # 通過TCP把數據打包再傳輸

image.png


3. 登錄FTP服務器

# ftp 192.168.8.88  --也可以自己做客戶端,連接自己的服務端

image.png

# ftp 192.168.8.88   --也可以自己做客戶端,連接自己的服務端
Connected to 192.168.8.88 (192.168.8.88).
220 (vsFTPd 3.0.2)
Name (192.168.8.88:root): ftp   --輸入匿名用戶ftp
331 Please specify the password.
Password:       --它的密碼爲空,直接敲回車
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ?    --使用?號可以查看能使用哪些命令
Commands may be abbreviated.  Commands are:
!        debug        mdir      sendport  site
$        dir          mget      put       size
account  disconnect   mkdir     pwd       status
append   exit         mls       quit      struct
ascii    form         mode      quote     system
bell     get          modtime   recv      sunique
binary   glob         mput      reget     tenex
bye      hash         newer     rstatus   tick
case     help         nmap      rhelp     trace
cd       idle         nlist     rename    type
cdup     image        ntrans    reset     user
chmod    lcd          open      restart   umask
close    ls           prompt    rmdir     rerbose
cr       macdef       passive   runique   ?
delete   mdelete      proxy     send
ftp> help passive    --help+命令可以查看命令的幫助
passive   	enter passive transfer mode
ftp> passive   --使用passive命令切換模式
Passive mode off.
ftp> passive   --這時表示被動模式關閉
Passive mode on.   --這時表示被動模式開啓
ftp> ls   --建立數據鏈路(列出當前ftp家目錄中的內容)
227 Entering Passive Mode (192,168,8,88,128,190).
150 Here comes the directory listing.
drwxr-xr-x   2 0     0     6 Aug 03 06:10 pub
226 Directory send OK.
ftp> cd pub    --切換路徑
ftp> ls         --建立數據鏈路(列出當前ftp家目錄中的pub內容)
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
-rw-r--r--   1 0     0      0 Dec 17 15:31 abc.txt
226 Directory send OK.
ftp> get abc.txt    --get是下載文件命令,下載的文件在當前登錄ftp的目錄裏
local: abc.txt remote: abc.txt
200 PORT command successful. Consider using PASV.
150 Opening BINARY mode data connection for abc.txt (0 bytes).
226 Transfer complete.
ftp> put text.txt      --put是上傳文件文件命令
local: text.txt remote: text.txt
200 PORT command successful. Consider using PASV.
550 Permission denied.
--這時候使用下載命令會報權限拒絕,因爲默認匿名用戶是沒有上傳權限的。(通過配置文件可以修改權限)


四、配置vsftpd服務器

配置實例:

例1:不允許匿名用戶登錄

# vim /etc/vsftpd/vsftpd.conf
12 anonymous_enable=NO  --改爲NO


匿名用戶有兩個:ftp                     密碼爲任意值或空

                             anonymous      密碼爲任意值或空

# systemctl restart vsftpd.service --修改完成以後需要重啓服務


使用匿名用戶登錄測試,發現登錄不了

#  ftp  192.168.8.88
Connected to 192.168.8.88 (192.168.8.88).
220 (vsFTPd 3.0.2)
Name (192.168.8.88:root): ftp      --輸入匿名用戶ftp
331 Please specify the password.
Password:             --它的密碼爲空,直接敲回車
530 Login incorrect.
Login failed.    --登陸失敗
ftp>


例2:匿名用戶的下載

# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=YES  --改回yes


默認使用匿名用戶登錄的服務端的/var/ftp目錄下,因爲/etc/passwd裏的ftp用戶的家目錄就是/var/ftp,所以其實就是登錄到它的家目錄。

# systemctl restart vsftpd.service  --修改完成以後需要重啓服務


匿名用戶默認是可以登錄,也可以下載,因爲/var/ftp是755權限

ftp> get abc.txt


能讀表示能下載,能寫表示能上傳

chmod 750 /var/ftp   後使用匿名用戶登錄,ls都看不到文件列表,也下載不了。

chmod 754 /var/ftp   後使用匿名用戶登錄,ls都看不到文件列表,也下載不了,因爲不能cd到/var/ftp。

chmod 751 /var/ftp   後使用匿名用戶登錄,ls都看不到文件列表,但是可以下載;因爲它能cd到/var/ftp,ls雖然看不到,但get文件名,是可以下載下來的。


還要注意文件的權限對其是否能被下載也有關係,要登錄用戶對其有r權限,纔可以下載。


任何服務的權限控制是要經過兩道門的,一個是服務本身的權限控制,一個是操作系統的權限控制,也就是說兩個都允許,纔有權限;如果有防火牆的話,則還要考慮防火牆的控制。


這裏可以總結一下:匿名用戶對登錄的目錄有rx權限,對目錄裏的文件有r權限就可以下載


例3:匿名用戶的上傳

默認是不允許匿名用戶上傳的

#  ftp  192.168.8.88Connected to 192.168.8.88 (192.168.8.88).
220 (vsFTPd 3.0.2)
Name (192.168.8.88:root): ftp      --輸入匿名用戶ftp
331 Please specify the password.
Password:            --它的密碼爲空,直接敲回車
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.

ftp> put  a.txt           --上傳a.txt文件
local: a.txt remote: a.txt
227 Entering Passive Mode (192,168,30,10,32,237).
550 Permission denied.             --權限拒絕,因爲/var/ftp不允許ftp用戶寫
ftp> exit


如果你把/var/ftp被改爲777後,發現登錄不了,所以還得改回去755。

因爲ftp服務本身不允許系統權限給匿名寫,所以解決方法是在登錄目錄下創建一個用於上傳的目錄,給一個寫的權限。

# chmod 777 /var/ftp/pub   --把pub改爲可寫,用於上傳文件


如果你現在登錄ftp服務之後,上傳文件,但還是權限拒絕。

因爲系統權限允許了,但是服務本身的權限還是不允許,所以要去改服務的配置參數。

# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=YES
anon_upload_enable=YES    --允許匿名用戶上傳文件,這行默認是註釋掉的,要把#去掉
anon_mkdir_write_enable=YES    --允許匿名用戶創建目錄,這行默認是註釋掉的,要把#去掉
 
# systemctl restart vsftpd.service  --重啓服務


這時候上傳就可以成功了!

ftp> put  a.txt                               --上傳a.txt文件
local: a.txt remote: a.txt
227 Entering Passive Mode (192,168,30,10,177,88).
150 Ok to send data.
226 Transfer complete.

ftp> mkdir bb                             --也可以創建目錄
257 "/pub/bb" created
ftp> rename a.txt 3.txt  --不能重命名
550 Permission denied.
ftp> delete a.txt     --不能刪除
550 Permission denied.


這裏可以總結一下:匿名用戶只能對登錄目錄內的子目錄裏面進行上傳,並且對這個子目錄要有w權限,還要有anon_upload_enable=YES和anon_mkdir_write_enable=YES的支持就可以上傳了。


例4:允許匿名下載剛上傳的文件

爲什麼默認不允許下載自己上傳的文件?

文件上傳之後權限自動改爲600,

而默認情況下anon_world_readable_only=YES,規定了匿名用戶只能下載world readable的文件(也就是others裏有r位的)

對於600權限文件是沒有權限下載

-rw-------    1 14       50            845 Jul 19 06:12 fstab      --不可以上傳

-rw-r--r--    1 0        0            1666 Jul 19 06:13 inittab     --可以上傳


方法一:讓匿名帳號上傳的文件權限自動更改爲644的權限

# man vsftpd.conf       --查看幫助手冊
# vim /etc/vsftpd/vsftpd.conf
 anon_umask=022

# systemctl restart vsftpd.service   --重啓服務


如果要文件上傳後的權限是444 ,umask怎麼設定?


anon_umask=222

umask

目錄

文件

0

7

6

1

6

6

2

5

4

3

4

4

4

3

2

5

2

2

6

1

0

7

0

0


方法二:允許匿名帳號下載不是所有人都可以讀的文件

# vim /etc/vsftpd/vsftpd.conf anon_world_readable_only=NO  --默認是yes,只允許下載所有人都可以讀的文件

# systemctl restart vsftpd.service     --重啓服務


例5:關於普通用戶(系統的普通用戶)的登錄

普通用戶默認是允許登錄ftp的,並且是登錄到自己的家目錄,登錄密碼也就是普通用戶登錄系統的密碼。

禁止普通用戶登錄

方法一:

# vim /etc/vsftpd/vsftpd.conf local_enable=NO  --建議使用服務的參數去禁止,但是這裏會把所有的普通用戶給禁止掉,要實現特定的用戶的控制

# systemctl restart vsftpd.service             --重啓服務


方法二:/etc/passwd 裏把普通用戶最後一列,改爲/bin/false

 提示:

  • /bin/bash         --可以登錄系統,也可以登錄ftp,也可以收郵件

  • /sbin/nologin   --不可以登錄系統,但可以登錄ftp,也可以收郵件

  • /bin/false         --又不可以登錄系統,又不可以登錄ftp,可以收郵件


例6:使用用戶列表來控制(建議使用這種方式)

方法一:(黑名單)

# vim /etc/vsftpd/vsftpd.conf
userlist_enable=yes   --打開用戶列表功能,默認就是打開的
userlist_deny=YES     --加上這句,啓用黑名單
 
# vim /etc/vsftpd/user_list   --文件最後加上要禁止的用戶,一個用戶寫一行

# systemctl restart vsftpd.service  --重啓服務

方法二:(白名單)

# vim /etc/vsftpd/vsftpd.conf
userlist_enable=yes
userlist_deny=NO         --加上這句,啓用白名單

# systemctl restart vsftpd.service  --重啓服務


上面的主要要注意的是:

    userlist_enable      --指定的是用戶列表功能是否有效

    userlit_deny          --指定的是用戶列表是允許還是拒絕


如果允許root用戶登錄ftp,則要/etc/vsftpd/user_list和/etc/vsftpd/ftpusers都不要禁用root登錄ftp就可以了。但爲了安全,不會這樣去開放root用戶的。


例7:FTP的日誌

# vim /etc/vsftpd/vsftpd.conf 
 xferlog_enable=YES             --打開日誌記錄功能
 xferlog_std_format=YES         --使用xferlog,而不是vsftpd.log
 xferlog_file=/var/log/xferlog  --打開註釋,指定日誌文件路徑

# systemctl restart vsftpd.service  --重啓服務

# cat /var/log/xferlog  --查看日誌,這裏面只記錄上傳和下載的信息


例8:下載限速

# vim /etc/vsftpd/vsftpd.conf
anon_max_rate=10000   --anon_max_rate匿名用戶下載傳輸率,下載傳輸率爲 10k
local_max_rate=10000  --local_max_rate本地用戶下載傳輸率,下載傳輸率爲 10k

# systemctl restart vsftpd.service  --重啓服務


測試:使用一個普通用戶登錄,去下載test.img文件做測試

# dd if=/dev/zero of=/var/ftp/pub/test.img bs=1M count=1000


新打開一個終端,測試限速下載,如果要重複輸入一個命令去查看狀態的話,可以在前面加 watch(默認是每 2 秒查看一次,但不支持 ll 這種別名,換成 ls -l 就可以)

# watch ls -lh


關於限制連接數的 max_clients      --ftp 服務允許的總的連接數

# vim /etc/vsftpd/vsftpd.conf
 max_per_ip=2     --指定單個客戶端的最大連接數爲 2
 max_clients=5    --限制客戶端最大連接數爲 5

# systemctl restart vsftpd.service   --重啓服務


測試:使用一個客戶端去連接 ftp 服務器,第三次連接就會報下面的錯誤

# ftp 192.168.8.88
Connected to 192.168.5.118 (192.168.5.118).
421 There are too many connections from your internet address

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章