Linux下如何部署FTP服務器


FTP 是 File Transfer Protocol 的縮寫,即文件傳輸協議,它通過網絡在服務器和客戶端之間傳輸文件,現在已經成為一種廣泛使用的標准工具

vsftpd 是 very secure ftp daemon 的縮寫,它是 Linux 上使用最受歡迎、使用最廣泛的 FTP 服務器之一,它具有安全,速度快,穩定的特點,很多重要的 FTP 站點比如 ftp.gnu.orgftp.freebsd.org 都是使用 vsftpd 作為服務器的

當前,FTP服務在日常工作中使用得也挺多,每次服務器版本更新都需要先打包,然后上傳到線上的FTP服務器上,再從FTP服務器上下載服務器包到線上機器,進行MD5校驗,然后就可以更新線上服務器了

說明

在安裝 vsftpd 之前,有幾個重要的地方需要說明下

工作模式

服務器使用兩個端口和客戶端通信,一個是命令端口,也叫控制端口,默認是 21, 用於命令的傳輸 ,一個是數據端口,默認是 20 ,用於數據的傳輸

  • 主動模式

客戶端向FTP服務器發送端口信息,由服務器主動連接該端口

流程:客戶端和FTP服務器的命令端口(21)建立TCP連接,當需要傳輸數據時,客戶端新啟動一個用於數據傳輸的端口,並在命令端口的連接上用 PORT 命令告訴服務器該端口號,服務器與該端口建立TCP連接,連接成功之后,客戶端開始傳輸數據

  • 被動模式

FTP服務器開啟並發送端口信息給客戶端,由客戶端連接該端口,服務器被動接受連接

流程:客戶端和FTP服務器的命令端口(21)建立TCP連接,當需要傳輸數據時,服務器偵聽一個用於數據傳輸的端口,並在命令端口的連接上用 PASV 命令告訴客戶端該端口號,客戶端與該端口建立TCP連接,連接成功之后,客戶端開始傳輸數據

建議:

1、大多數FTP客戶端都在局域網中,沒有獨立的公網IP地址,且有防火牆阻攔,主動模式下FTP服務器成功連接到客戶端比較困難。因此,如無特殊需求,都是將FTP服務器配置為被動模式,本文后面的FTP服務器配置也是以被動模式為例的

2、被動模式下,命令端口和數據端口都是在FTP服務器端開啟,也都可以通過啟動配置來修改,由於默認的端口是公開的,安全性低,所以實際安裝的時候都會修改默認端口

用戶認證模式
  • 匿名用戶模式

任何人無需密碼驗證就可以直接登錄到FTP服務器。這種模式最不安全,一般只用來保存不重要的公開文件,不推薦在生產環境中使用

  • 本地用戶模式

通過Linux系統本地賬號進行驗證的模式,相較於匿名用戶模式更安全。

  • 虛擬用戶模式

FTP服務器的專有用戶。虛擬用戶只能訪問Linux系統為其提供的FTP服務,而不能訪問Linux系統的其它資源,進一步增強了FTP服務器的安全性。

匿名用戶模式一般用於不重要的於公開文件,並且只提供下載服務,也就是說,用戶只能下載,不能有其他操作,本地用戶模式通過配置鎖定目錄、修改命令端口和數據端口 可以進一步增強安全性,本文后面的配置是以該模式為例的

安裝

安裝前可以使用下面的命令檢查是否已安裝

vsftpd -v

如果未安裝會有如下提示

[root@localhost ~]$ vsftpd -v
-bash: vsftpd: 未找到命令

安裝 vsftpd

yum install vsftpd

安裝完成后,執行 vsftpd -v 命令,如果輸出版本號,表示安裝成功

[root@localhost ~]# vsftpd -v
vsftpd: version 3.0.2

配置服務器

安裝完成之后,默認的配置位於 /etc/vsftpd/vsftpd.conf, 如果找不到默認配置在哪里,可以使用下面的命令查找下,其中 /etc/vsftpd 目錄就是存放配置的地方

[root@localhost ~]# whereis vsftpd
vsftpd: /usr/sbin/vsftpd /etc/vsftpd /usr/share/man/man8/vsftpd.8.gz

配置的格式相對簡單,每一行都是注釋或者選項,注釋以 # 號開頭,選項的格式是 option=value 的形式,每個選項占一行,option= 以及 value 之間不允許出現空格

vsftpd 對每個配置的選項都設置了一個默認值,服務器啟動之后,在 vsftpd.conf 中配置的選項會覆蓋服務器中的默認值

vsftpd 可配置的選項很多,下面按照類別把常用的配置項分成了 訪問權限、鎖定訪問目錄、限定用戶登錄、修改端口、日志配置、其他配置 幾組, 每個配置項前都增加了詳細的說明

配置項分組主要是為了總結說明每一組配置項的作用,實際配置的過程中,把所有組的配置項添加到 vsftp.conf 中即可

  • 訪問權限
#是否允許匿名登錄,默認允許,如果允許,用戶名 ftp 和 anonymous 都會被當做匿名登錄
#為了安全,一般不允許匿名登錄
anonymous_enable=NO

#是否允許匿名上傳,默認不允許,如果允許 write_enable 選項需要設置為 YES
#為了安全,一般不允許
anon_upload_enable=NO

#是否允許本地用戶登錄,默認不允許,如果允許,在 ``` /etc/passwd``` 中的用戶都可以登錄 FTP 服務器
#如果不予許匿名登錄的話,這個選項需要設置為允許
local_enable=YES

#是否允許在FTP服務器上寫入, 默認不允許,如果有上傳文件、刪除文件等需求,一般都是開啟的
write_enable=YES

#設置寫入服務器文件的權限掩碼值,如果值是八進制需要以 0 開頭,否則會當作十進制
#值為 022,能滿足大部分FTP的需求
local_umask=022

  • 鎖定訪問目錄
#默認為 NO, 如果設置為 YES,表示用戶通過FTP客戶端登錄之后
#只能在FTP服務器指定的目錄中,不允許切出目錄,
chroot_local_user=YES

#用戶名插入到本地 FTP 主目錄中
user_sub_token=$USER

#定義用戶 FTP 主目錄,用戶登錄成功之后,vsftpd 服務器會切換到此目錄,
#此時 FTP 客戶端會位於此目錄中,后續的上傳以及下載都是針對這個目錄的
local_root=/home/$USER/ftp

把登錄的用戶鎖定在指定的目錄中,避免用戶訪問不應該訪問的目錄,這里我們設置成只允許訪問自己的 home 目錄中的 ftp 目錄,例如:新添加一個用戶 testuser 專門用於上傳下載, testuser 通過 FTP 客戶端成功登錄后,會自動切換到 /home/testuser/ftp 目錄,並且不允許切出該目錄

注意:用戶上傳和下載都是在限定的目錄中,所以一般都是把鎖定目錄設置到剩余空間比較大的磁盤中

  • 限定用戶登錄
#如果設置為 YES ,vsftpd 將會從 userlist_file 選項指定的文件讀取用戶列表
userlist_enable=YES

#設置用戶列表配置文件, 如果 /etc/vsftpd/user_list 不存在需要手工創建
userlist_file=/etc/vsftpd/user_list

#此選項檢查 userlist_enable 選項,當 userlist_enable 為 YES 時
#如果 userlist_deny 設置為 NO , 表示只允許 userlist_file 中的用戶登錄
#如果 userlist_deny 設置為 YES, 表示禁止 userlist_file 中的用戶登錄,允許其他用戶登錄
userlist_deny=NO
  • 修改端口
#如果啟用,vsftpd 將在獨立模式下運行,vsftpd 本身將負責偵聽和處理傳入的連接
listen=NO

# 跟 listen 選型類似,但是此選項是偵聽在 IPV6 上的 socket
# 而 listen 是 IPV4, 此選項和 listen 是互斥的,不能同時設置為 YES
listen_ipv6=YES

#服務器偵聽端口,也是命令端口, 默認是21,修改之后, 防火牆需要做相應的調整
#同時 FTP 客戶端登錄的時候需要指定端口號
#為了增強安全性,配置的時候一般都會修改
listen_port=48888

#開啟被動模式
pasv_enable=YES

#被動模式下,服務器的地址,默認是內網地址
#如果在雲服務器上部署,需要修改成公網IP
pasv_address=192.168.70.20

#設置被動模式下,建立數據傳輸可使用的端口范圍的最小值。
#建議把端口范圍設置在一段比較高的范圍內,例如50000~50010,有助於提高訪問FTP服務器的安全性
pasv_min_port=50000

#設置被動模式下,建立數據傳輸可使用的端口范圍的最大值
pasv_max_port=50010
  • 日志配置
#是否記錄上傳下載日志,默認是不記錄,如果設置為記錄
#默認日志文件位於 /var/log/vsftpd.log, 如果配置了 vsftpd_log_file 選項,會覆蓋默認日志文件
xferlog_enable=YES

#記錄上傳下載的日志
xferlog_file=/var/log/xferlog

#是否按照標准格式記錄日志
xferlog_std_format=YES
  • 其他配置
# vsftpd 使用的 PAM 服務名字
pam_service_name=vsftpd
#
tcp_wrappers=YES

這兩個配置使用默認生成的選項即可,不用做任何修改

設置防火牆

如果你部署的FTP服務器的機器上防火牆是關閉狀態的話,可以跳過此步驟,或者你不想設置防火牆的話,可以通過 systemctl stop firewalld 命令關閉防火牆,這樣也可以忽略此步驟

上面配置中服務器偵聽端口(也叫命令端口) listen_port 選項設置的是 48888,數據端口的范圍是 50000-50010, 所以防火牆需要開放這些端口,執行以下命令即可設置

[root@localhost ~]# firewall-cmd --zone=public --add-port=48888/tcp --permanent
success
[root@localhost ~]# firewall-cmd --zone=public --add-port=50000-50010/tcp --permanent
success

防火牆設置好以后,執行下面的命令重啟防火牆服務

[root@localhost ~]# systemctl restart firewalld

最后,查看下端口是否成功開放

[root@localhost ~]# firewall-cmd --list-port         
50000-50010/tcp 48888/tcp

從結果可以看出,防火牆已經開放了 48888、50000-50099 端口

啟動服務器

配置完 /etc/vsftpd/vsftpd.conf ,設置好防火牆之后,執行下面的命令啟動服務器

systemctl start vsftpd

啟動之后,查詢服務器狀態,確認服務器是否啟動成功

[root@localhost ~]# systemctl status vsftpd                    
● vsftpd.service - Vsftpd ftp daemon
   Loaded: loaded (/usr/lib/systemd/system/vsftpd.service; enabled; vendor preset: disabled)
   Active: active (running) since Fri 2021-09-1 20:21:00 CST; 3 days ago
 Main PID: 94916 (vsftpd)
   CGroup: /system.slice/vsftpd.service
           └─94916 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf

Sep 1 20:21:00 localhost systemd[1]: Starting Vsftpd ftp daemon...
Sep 1 20:21:00 localhost systemd[1]: Started Vsftpd ftp daemon.

將服務器設置成開機啟動

systemctl enable vsftpd

下面的命令可以確認服務器的命令端口是否開啟( 配置的是 : 48888 )

[root@localhost ~]# netstat -antup | grep vsftpd
tcp6       0      0 :::48888                :::*                    LISTEN      20501/vsftpd        
[root@localhost ~]# 

新建FTP用戶

新建用戶 mytest, 並設置密碼

[root@localhost ~]# useradd mytest
[root@localhost ~]# passwd mytest

新建 FTP 目錄,並修改目錄權限

[root@cghost21 home]# mkdir -p /home/mytest/ftp/files
[root@cghost21 home]# chmod -R 500 /home/mytest/
[root@cghost21 home]# chmod -R 700 /home/mytest/ftp/files

注意:/home/mytest/ftp 是 mytest 用戶的鎖定目錄,mytest 登錄之后,只能呆在此目錄以及此目錄的子目錄中,不允許切換到其他目錄

鎖定目錄必須要去掉可寫權限,不然用戶會無法登錄,這一點在FTP服務器端做了強制的校驗,所以 "chmod 500 /home/mytest/" 命令是設置 /home/mytest 以及 /home/mytest/ftp 兩個目錄可讀可執行權限,無可寫權限

"/home/mytest/ftp/files" 目錄是實際的上傳下載的目錄,所以需要有可讀寫和可執行權限

最后,還需要把用戶名加入到FTP服務器允許登錄的用戶列表中,也即 /etc/vsftpd/vsftpd.confuserlist_file 選項對應的文件 /etc/vsftpd/user_list 中,如果 user_list 不存在,需要手工創建並把 mytest添加進去

測試

服務器全部搭建好之后,需要進行測試,這里我准備的 FTP服務器的IP是 192.168.70.20, FTP客戶端機器的IP是 192.168.70.11

進入FTP服務器的 /home/mytest/ftp/files 目錄, 新建一個 a.txt 測試文件

[root@localhost files]# pwd
/home/mytest/ftp/files
[root@localhost files]# echo "ftp server..." >> a.txt
[root@localhost files]# 

進入FTP客戶端機器的 /home/wl/temp 目錄,新建一個 test.txt 測試文件

[root@localhost temp]# echo "ftp test..." >> test.txt
[root@localhost temp]# cat test.txt 
ftp test...

測試上傳下載需在FTP客戶端機器上安裝 FTP 客戶端, 執行以下命令進行安裝,如已安裝,可忽略

yum install ftp

執行下面一系列的命令,進行測試

1、登錄FTP服務器命令,格式:ftp 服務器ID 命令端口

2、輸入登錄用戶名

3、輸入登錄密碼

4、登錄成功之后,此時位於FTP服務器的 /home/mytest/ftp 目錄中,執行 ls 命令之后,
  
   結果顯示當前目錄還有一個 files 的子目錄

5、執行 pwd 命令查看當前所在目錄,FTP服務器上的 /home/mytest/ftp 目錄就是 FTP 的根目錄

6、執行 cd files 命令進入 files 目錄,也即FTP服務器上的 /home/mytest/ftp/files  目錄,

   然后執行 ls 命令查看當前目錄的文件,可以看到 FTP服務器上的測試文件 a.txt

7、執行 put test.txt  命令,把FTP客戶端機器上當前目錄( /home/wl/temp ) 中的 test.txt 文件

   上傳到服務器的 /home/mytest/ftp/files 目錄中

8、執行  get a.txt  命令,把FTP服務器上的 /home/mytest/ftp/files/a.txt 文件下載到 FTP客戶端機器的當前目錄( /home/wl/temp ) 中

9、上傳下載測試完成之后,執行 exit 命令,退出 FTP 命令行

10、最后執行 cat a.txt 命令查看從 FTP服務器上下載的測試文件的內容,從結果可以看出,和服務器上的測試文件內容是一樣的

小結

本文介紹了 Linux 下FTP服務器 vsftpd 的安裝、配置、測試等整個步驟以及注意事項,文中只是對 vsftpd 的常用配置項做了說明,更多的配置項請參考官網文檔


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM