移至主內容
DarkRanger's Secret Area

主導覽

  • 首頁
  • 關於本站
  • Linux
  • 程式開發
  • N900
  • 譯文
  • 資訊技術辭典

文章分類

  • 影劇
  • 遊戲
  • 筆記
  • 雜文
  • 資訊技術
  • 站務訊息

最新內容

  • How-To:Linux 架設 vsftpd 伺服器
  • 【自製】Chinese Chess 2
  • 早期 Unreal Engine 在 Linux 下的開發環境建置
  • 【自製】CrankMode
  • How-To:Linux 安裝 KFMod
  • 20 years of Intel Macs
  • rsync and outrage
  • Email is crazy
  • How-To:Linux 安裝 Arma: Cold War Assault
  • How-To:Linux 安裝 Torchlight II

導航連結

  • 首頁
  • Linux 專區
  • Linux 網路服務
  • How-To:Linux 架設 vsftpd 伺服器

How-To:Linux 架設 vsftpd 伺服器

發表日期:星期四, 09/17/2026 - 23:20

操作環境:

  • AlmaLinux 10.2
  • vsftpd 3.0.5

 

以檔案伺服器的需求來說,具有久遠歷史的 FTP(File Transfer Protocol)可能對現今而言,不太算是一種很具吸引力的服務選項。因為它往往需要一套功能完整的 FTP 客戶端軟體(例如跨平台的 FileZilla),才能夠可靠地進行服務的連線、登入,以及檔案的上傳與下載動作。在如今雲端儲存服務的盛行下,FTP 在一般使用者眼裡,便利程度顯然不及網頁式的操作。另一方面,Linux 系統的管理者則可能也偏好於直接利用現成的 SSH 服務來進行檔案傳輸的動作,而非另外再架設 FTP 服務。

 

然而其實在某些考量下,FTP 卻依然堪稱是一種簡約有效的選項。它的特性及作用單純,比起其它更加複雜的服務類型,可攻擊面的風險可能是較低的。而且必須使用 FTP 客戶端軟體這一點,也能夠幫助規範使用者採取特定的工作流程,以減少非預期的操作行為以致於造成問題的機會。於是本文會說明如何使用 Linux 發行版上常見的 vsftpd,架設一個簡單可用的 FTP 服務。Linux 使用者帳號同時就是可登入的 FTP 帳號,個別使用者可以登入自己的家目錄,來進行檔案的上傳及下載。

 

本文的所有操作基本上都需要 root 權限,以下將不再特別註明。以及需要編輯的 vsftpd.conf 設定檔皆位於 /etc/vsftpd/vsftpd.conf。

 

1. 安裝 vsftpd

AlmaLinux 以及其它同為 Red Hat 生態系下的 Linux 發行版,可以使用下列 dnf 安裝指令進行安裝動作:

  • dnf install vsftpd

 

2. 設定 chroot

chroot 設定能夠將使用者限制在自己的家目錄裡,而無法再檢視主機內的其它位置,所以這是一個蠻常見的安全性措施。設定方式是編輯 vsftpd.conf,加入下列設定值:

chroot_local_user=YES
allow_writeable_chroot=YES

 

3. 設定使用者清單

另一項更進一步的安全措施,是限制僅有寫入於某一清單的使用者,能夠登入 FTP 服務。編輯 vsftpd.conf,並加入下列設定值:

userlist_enable=YES
userlist_file=/etc/vsftpd/user_list
userlist_deny=NO

 

接著編輯 /etc/vsftpd/user_list,將裡面的所有項目皆註解(加上 #)起來,或者索性整個檔案清除。然後再逐行寫入使用者帳號,也就是容許登入的帳號清單,便完成設定動作。

 

4. 設定被動式連線

設定被動式連線(PASV)雖然看似是一個選擇性的動作,但由於 FTP 協定的設計特性,如果有預先設定起來,指定一批可用的自訂連接埠,則比較能夠應對各種網路環境的封包管制、以致無法順利連線的疑難雜症。於是在 vsftpd.conf 內加入以下設定值:

pasv_enable=YES
pasv_addr_resolve=YES
pasv_address=<主機 IP 位址或域名>
pasv_min_port=30000
pasv_max_port=31000

 

倘若希望單一 FTP 服務同時容許 IPv4 及 IPv6 位址的連線(設定值 listen=NO 及 listen_ipv6=YES),則 pasv_address 應採用主機的有效域名,然後運用 DNS 解析(pasv_addr_resolve=YES)的方式來實現。

 

5. 設定 SSL 加密連線

由於一種不算罕見的應用情境,是 FTP 及 HTTP 網站服務可能共存於同一主機上。倘若確實如此,並且 HTTP 服務存在 SSL 憑證,那麼其實兩種服務是可以考慮共用同一個 SSL 憑證。vsftpd.conf 所需加入之相關設定值如下所示:

ssl_enable=YES
rsa_cert_file=<SSL 憑證檔案之路徑>
rsa_private_key_file=<私鑰檔案之路徑>

 

至於如果想要使用自簽署的憑證,比方說域名為 test.example.com,則建置憑證的一種簡易流程如下所示。首先建立一個專門存放的目錄:

  • mkdir -p /etc/ssl/test.example.com

 

然後新增及編輯 /etc/ssl/test.example.com/san.cnf,寫入例如以下內容:

[req]
default_bits       = 2048
prompt             = no
default_md         = sha256
distinguished_name = dn
x509_extensions    = v3_req

[dn]
C  = US
ST = Test
L  = Test
O  = Test
OU = Test
CN = test.example.com

[v3_req]
subjectAltName = @alt_names

[alt_names]
DNS.1 = test.example.com

 

儲存後執行以下 OpenSSL 指令:

  • openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /etc/ssl/test.example.com/site.key -out /etc/ssl/test.example.com/site.crt -config /etc/ssl/test.example.com/san.cnf

 

若前述指令執行無誤,憑證及私鑰皆順利產出,則 vsftpd.conf 應加入的設定值如下:

ssl_enable=YES
rsa_cert_file=/etc/ssl/test.example.com/site.crt
rsa_private_key_file=/etc/ssl/test.example.com/site.key

 

6. 啟用服務

執行以下指令:

  • systemctl enable vsftpd
  • systemctl start vsftpd

 

7. 防火牆規則設定

倘若主機防火牆係使用 firewalld 來管理,則相應得執行之指令如下,並且一併放行用於被動式連線的自訂連接埠:

  • firewall-cmd --zone=public --add-service=ftp --permanent
  • firewall-cmd --zone=public --add-port=30000-31000/tcp --permanent
  • firewall-cmd --reload

 

可以執行以下指令,確認當前的防火牆規則:

  • firewall-cmd --list-all-zones
  • firewall-cmd --info-service=ftp
  • firewall-cmd --info-helper=ftp

 

8. 安裝及啟用 Fail2Ban

如果 FTP 服務有對外網開放的需求,並且也沒有特別限制連入的 IP 來源。那麼一種可見的安全性強化措施,是利用 Fail2Ban 來管制登入失敗的次數,在達到指定的次數後,便將來源 IP 封禁一段時間。在 AlmaLinux 發行版上的安裝方式,首先需要啟用 EPEL 套件庫:

  • dnf config-manager --set-enabled crb
  • dnf install epel-release

 

然後執行安裝:

  • dnf install fail2ban

 

完成安裝後,新增及編輯 /etc/fail2ban/jail.local,寫入例如以下設定值:

[vsftpd]
enabled = true
port = ftp,ftp-data,ftps
logpath = /var/log/secure
maxretry = 3
bantime = 10800

 

其中 bantime 為秒數,所以 10800 即為封禁 3 小時。完成編輯後,再啟用服務即可:

  • systemctl enable fail2ban
  • systemctl start fail2ban

 

執行以下指令檢視服務狀態:

  • systemctl status fail2ban
  • fail2ban-client status --all

 

也可以僅僅執行 fail2ban-client 指令,獲取說明來檢視有哪些手動或查詢指令能夠使用。舉例來說,下列指令可以分別封禁指定的 IP 位址、查詢封禁清單,以及解除封禁:

  • fail2ban-client set vsftpd banip <IP 位址>
  • fail2ban-client get vsftpd banned
  • fail2ban-client set vsftpd unbanip <IP 位址>

 

9. 其它參考資料

  • https://linux.vbird.org/linux_server/centos6/0410vsftpd.php