Ubuntu 架設 FTP 伺服器完整教學|vsftpd 安裝、設定、安全強化與常見問題解答

目次

1. 前言

在 Ubuntu 上架設 FTP 伺服器,對於希望有效率進行檔案傳輸的開發者與管理員來說,是一種非常實用的方案。特別是在建置家庭伺服器或公司內部簡易檔案分享環境時,FTP(File Transfer Protocol)因其操作簡單且易於導入,成為熱門選擇。

什麼是 FTP 伺服器?

FTP 伺服器是一種專用於透過網際網路或區域網路傳送與接收檔案的伺服器軟體。使用者可以利用 FTP 客戶端軟體連接至伺服器,進行檔案上傳或下載。

雖然現今有 SFTP、SCP 等更安全的傳輸方式逐漸普及,但因 FTP 的簡潔與輕巧,至今仍在許多用途上被廣泛選用。特別是在封閉網路環境或單純的檔案分享需求下,FTP 仍是十分實用的協定。

FTP 伺服器在 Ubuntu 上的角色

Ubuntu 是廣受歡迎的 Linux 發行版之一,也常被用於伺服器環境。於 Ubuntu 上架設 FTP 伺服器,可以讓多台設備或多位使用者輕鬆共享檔案。

例如,適合下列情境:

  • 將檔案傳送至 Web 伺服器
  • 與 Raspberry Pi 等 IoT 裝置連線
  • 公司內部文件分享

如上所述,Ubuntu 與 FTP 伺服器的結合,實現了彈性且高效率的檔案管理。

本文目的與目標讀者

本文將以易懂的方式說明如何在 Ubuntu 架設 FTP 伺服器,特別適合以下讀者:

  • 熟悉 Ubuntu 基本操作,但第一次嘗試 FTP 的朋友
  • 希望於本地或小型業務用途架設 FTP 伺服器者
  • 關心安全性、或想瞭解日文檔名亂碼對策者

只要依照以下步驟進行,即可建立安全且實用的 FTP 伺服器環境。接下來將從安裝最受歡迎的「vsftpd」軟體開始說明。

2. 安裝 vsftpd

在 Ubuntu 上建置 FTP 伺服器,最常用的軟體是 vsftpd(Very Secure FTP Daemon)。顧名思義,這是一款強調「高安全性」設計的 FTP 伺服器,輕量且穩定,因此被廣泛應用於企業與教育單位。

本章節將說明如何在 Ubuntu 上安裝 vsftpd,以及設定服務自動啟動的方法。

安裝 vsftpd

首先,請利用 Ubuntu 的套件管理系統(APT)安裝 vsftpd。請依下列步驟操作:

sudo apt update
sudo apt install vsftpd
  • sudo apt update:更新套件資訊。
  • sudo apt install vsftpd:安裝 vsftpd 套件。

安裝完成後,vsftpd 會自動啟動。

確認服務狀態

要確認 vsftpd 是否正確安裝並執行,可輸入以下指令:

sudo systemctl status vsftpd

如果看到「active (running)」字樣,即表示 FTP 伺服器運作正常。

檢查並啟用自動啟動設定

vsftpd 通常安裝後就會自動啟用開機自動啟動。可再確認一次:

sudo systemctl enable vsftpd

執行此指令後,系統每次開機都會自動啟動 vsftpd。

別忘了設定防火牆(UFW)

如果您的 Ubuntu 有啟用 UFW(Uncomplicated Firewall),則必須開放 FTP 所需的通訊埠:

sudo ufw allow 20/tcp
sudo ufw allow 21/tcp

如此一來,FTP 標準埠20(資料)21(命令)將可從外部存取。

設定完成後,請重新載入 UFW 讓設定生效:

sudo ufw reload

3. 基本設定

完成 vsftpd 安裝後,接下來就要透過編輯設定檔,根據自己的用途調整 FTP 伺服器的運作方式。vsftpd 的設定非常細緻,預設狀態下功能限制較多,因此需依需求明確啟用各項功能。

本節將介紹幾個常用的基本設定項目。

設定檔位置

vsftpd 的主要設定檔位於:

/etc/vsftpd.conf

欲修改設定,可執行下列指令編輯:

sudo nano /etc/vsftpd.conf

修改設定後,需重新啟動 vsftpd 讓變更生效。

sudo systemctl restart vsftpd

允許寫入(上傳等操作)

vsftpd 預設情況下,不允許檔案上傳或編輯。若需允許寫入,請啟用下列設定:

write_enable=YES

啟用後,用戶可在自己的家目錄上傳、刪除、修改檔案。

允許本地用戶登入

若希望以 Ubuntu 系統用戶帳號登入 FTP,請加入下列設定:

local_enable=YES

這樣 /etc/passwd 中註冊的本地用戶(系統帳號)就能透過 FTP 登入。

允許取得目錄清單

若 FTP 客戶端無法顯示檔案或目錄清單,請確認以下設定:

listen=YES
listen_ipv6=NO

特別是在未啟用 IPv6 的環境下,若 listen_ipv6=YES 會導致連線問題。

設定登入橫幅訊息(選用)

可自訂用戶連接 FTP 時顯示的橫幅訊息:

ftpd_banner=Welcome to your custom Ubuntu FTP server!

適合用來告知運維聯絡資訊或注意事項,尤其是公司內部用途。

允許 ASCII 模式傳輸(視需求啟用)

若需要正確傳輸特定文字檔(如含 Windows 換行的腳本),可加入以下設定:

ascii_upload_enable=YES
ascii_download_enable=YES

一般狀況下使用 binary 傳輸即可,視環境決定是否啟用。

如上所述,vsftpd 的基本設定強調「明確指定允許項目」。修改設定檔後,請務必重新啟動 vsftpd 使設定生效。

下一節將說明進階的安全性設定,特別是於公開網路上運作 FTP 時,安全措施不可忽視。

4. 強化安全性

FTP 雖然方便,但因傳輸內容未加密,存在一定資安風險。特別是在網際網路上運作時,必須妥善加強安全設定。

本節將介紹 vsftpd 可執行的主要資安強化對策。

使用 chroot 限制用戶存取範圍

FTP 用戶若能自由瀏覽其他目錄,資安風險極高。因此應為每位用戶限制在個人家目錄(chroot)

請啟用以下兩個設定:

chroot_local_user=YES
allow_writeable_chroot=YES
  • chroot_local_user=YES:限制本地用戶只能存取自己的家目錄。
  • allow_writeable_chroot=YES:若家目錄具有寫入權限時需加入此設定,否則會出現錯誤。

※如未加入,將出現「500 OOPS: vsftpd: refusing to run with writable root inside chroot」錯誤。

限制可存取用戶

預設情況下,所有本地用戶皆可登入 FTP,恐導致資料外洩風險。建議採白名單方式,限制可用用戶。

請於 vsftpd.conf 新增以下設定:

userlist_enable=YES
userlist_file=/etc/vsftpd.userlist
userlist_deny=NO

接著,將允許登入的用戶逐行寫入 /etc/vsftpd.userlist

sudo nano /etc/vsftpd.userlist

(範例)

ftpuser1
ftpuser2

如此僅白名單內用戶能登入

導入 FTPS(SSL/TLS 加密傳輸)

標準 FTP 為明文傳輸,帳密或資料易遭竊取。建議啟用FTPS(FTP over SSL/TLS) 加密。

先產生 SSL 憑證(或使用現有憑證):

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/vsftpd.pem -out /etc/ssl/private/vsftpd.pem

然後於 vsftpd.conf 加入下列設定:

ssl_enable=YES
rsa_cert_file=/etc/ssl/private/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.pem
force_local_data_ssl=YES
force_local_logins_ssl=YES
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO

如此一來,FTP 客戶端即可選擇「FTPS(明確的 SSL)」方式連線。

停用不必要功能

提高安全性的一大重點就是停用不用的功能

例如:

anonymous_enable=NO

禁止匿名用戶登入(雖預設為關閉,但建議明確設定)。

這些設定能讓 Ubuntu 上的 vsftpd FTP 伺服器具備基本資安防護。
特別是在公網使用時,FTPS 強制加密幾乎是必要條件。

下章將詳細說明日文檔案名稱亂碼的對策。這是 FTP 管理常見問題,務必重視以防止傳輸問題。

5. 處理日文檔案名稱

透過 FTP 傳送檔案時,日文檔案名稱出現亂碼問題是常見困擾。特別是在 Windows 與 Ubuntu 間透過 FTP 傳檔時,因編碼不一致,常會出現「???」或無法辨識的字元。

本節將介紹如何用 vsftpd 避免日文檔名亂碼的方法。

產生亂碼的主要原因

日文檔案名稱亂碼,通常來自以下三個因素:

  1. Ubuntu 端的語系設定不是 UTF-8
  2. FTP 客戶端的編碼設定不正確
  3. vsftpd 未以 UTF-8 模式運作

請依序檢查並修正上述設定。

確認與設定 Ubuntu 的語系

首先,確認 Ubuntu 端的語系已設為 UTF-8。可執行以下指令查看目前語系:

locale

範例輸出:

LANG=ja_JP.UTF-8

LANGLC_ALL 非 UTF-8,請用下列指令變更:

sudo update-locale LANG=ja_JP.UTF-8
source /etc/default/locale

並可用以下指令產生對應語系:

sudo locale-gen ja_JP.UTF-8

如此一來,系統內的檔案名稱處理將統一為 UTF-8。

確認 vsftpd 的 UTF-8 設定

vsftpd 預設支援 UTF-8,但建議於設定檔確認下列設定:

utf8_filesystem=YES

如設定項目不存在,只要系統本身為 UTF-8 運作,一般不會有問題。不過有些 vsftpd 版本可能未支援此項。

FTP 客戶端端設定(以 FileZilla 為例)

客戶端設定亦相當重要。若使用 FileZilla,請依下列步驟操作:

  1. 開啟「網站管理員」
  2. 選擇連線目標
  3. 點選「字元集」分頁
  4. 選擇「使用自訂字元集」,並輸入 UTF-8

如此設定後,客戶端將正確以 UTF-8 解讀伺服器檔名,可防止亂碼。

補充:從其他作業系統上傳時的注意事項

若由 Windows 等系統上傳的檔案名稱採用 Shift_JIS 等不同編碼,上傳時名稱將受損。

遇此情況,建議先將檔名轉換為 UTF-8 再上傳。可使用 convmv 等指令工具處理。

總結

使用 FTP 處理日文檔案名稱時,確保伺服器與客戶端編碼一致非常重要。Ubuntu 端以 UTF-8 為標準,FTP 客戶端也應明確指定 UTF-8,基本上能防止亂碼。

下一節將說明「被動模式」與防火牆設定,特別是在路由器或雲端環境下,這些設定可避免無法連線等常見問題。

6. 被動模式與防火牆設定

當 FTP 伺服器運作於網際網路或 NAT(如路由器)環境下,常遇到「可以連上但無法取得檔案清單」或「資料傳輸失敗」等問題。
這些通常來自FTP 通訊模式(主動/被動)防火牆設定不當。

本節將說明如何於 vsftpd 啟用被動模式,以及相關防火牆開放設定。

什麼是被動模式?

FTP 有「主動模式」與「被動模式」兩種:

  • 主動模式:伺服器主動連線到客戶端
  • 被動模式:僅由客戶端連線到伺服器(適用 NAT、防火牆環境)

現今大多數網路環境建議採用被動模式。vsftpd 須明確設定被動模式參數。

vsftpd 啟用被動模式設定

/etc/vsftpd.conf 增加下列設定:

pasv_enable=YES
pasv_min_port=40000
pasv_max_port=50000

設定後,vsftpd 將於40000~50000 埠號間做被動模式傳輸。建議至少預留 20~30 個埠號。

指定外部 IP(適用 NAT 環境)

若伺服器位於 NAT(路由器)下,應明確指定外部 IP

pasv_address=203.0.113.45

※上例為示意,請以實際外部 IP 替換。

此設定可確保 FTP 客戶端正確取得連線資訊。

防火牆(UFW)設定

需於 Ubuntu 防火牆(UFW)開放所需埠號:

sudo ufw allow 20/tcp
sudo ufw allow 21/tcp
sudo ufw allow 40000:50000/tcp
  • 20/tcp:FTP 資料通道(主動模式用)
  • 21/tcp:FTP 命令通道
  • 40000:50000/tcp:被動模式數據傳輸用埠號區間

設定後,請重新載入 UFW:

sudo ufw reload

雲端環境注意事項(AWS、GCP、Azure 等)

若在雲端平台上架設 FTP,除 OS 端 UFW 外,還需於雲端的安全群組(防火牆)開放對應埠號。

例如 AWS,請於安全群組開放 2140000-50000 之 TCP 埠號。

總結

要順利運作 FTP,vsftpd 的被動模式設定正確的防火牆開放必不可少。特別是從外部網路連線時,許多連線失敗與逾時問題,都是由於未正確設埠造成。

下一節將說明如何為每個 FTP 使用者設定不同權限與目錄,方便多人協作管理。

7. 依使用者設定權限

實際運用 FTP 伺服器時,常會需要為多位使用者分配不同的存取權限與目錄。例如:可依部門或個人建立專屬資料夾,並限制彼此無法互相瀏覽其他使用者的檔案。

本節將說明如何在 vsftpd 針對不同使用者個別設定與管理

建立專用 FTP 使用者帳號

首先可建立 FTP 專用帳號,並指定主目錄。例如:

sudo adduser ftpuser1

此指令會於 /home/ftpuser1 建立專屬目錄。如僅供 FTP 用途,也可設定無法登入 shell:

sudo useradd -m -s /usr/sbin/nologin ftpuser2

設定家目錄權限

由於 vsftpd 的安全性規範,若家目錄可寫入會導致啟動失敗。建議採用下述目錄結構:

/home/ftpuser1/
├── files/  ← 可寫入(上傳檔案等操作)

可執行下列指令設定權限:

sudo mkdir /home/ftpuser1/files
sudo chown ftpuser1:ftpuser1 /home/ftpuser1/files
sudo chmod 755 /home/ftpuser1

如此 /home/ftpuser1 目錄本身不可寫入,files/ 資料夾則允許上傳與修改檔案。

以 chroot 限制用戶目錄

如前章所述,於 vsftpd.conf 設定:

chroot_local_user=YES
allow_writeable_chroot=YES

如此用戶登入後僅能於自家目錄活動,無法存取他人目錄,加強資安。

使用者專屬設定檔(細部控制)

vsftpd 支援依使用者自訂設定。可針對每位帳號細部設定存取目錄、寫入權限等。

步驟如下:

user_config_dir=/etc/vsftpd_user_conf

然後建立個別設定檔:

sudo mkdir /etc/vsftpd_user_conf
sudo nano /etc/vsftpd_user_conf/ftpuser1

範例內容:

local_root=/home/ftpuser1/files
write_enable=YES

如此 ftpuser1 將僅能於 /home/ftpuser1/files 目錄活動,也可針對不同帳號細分權限。

SFTP 併用時注意事項

若同時使用 OpenSSH 的 SFTP(SSH 為基礎的檔案傳輸),其用戶的 shell 或群組條件與 FTP 不同,建議分開管理設定。

總結

透過 vsftpd 可彈性設定不同使用者的目錄權限與存取控制。良好管理用戶,有助於同時兼顧安全與便利性。

下一節將說明如何檢查 FTP 伺服器運作狀態,並實際連線測試檔案上傳與下載。

8. 功能測試

完成 FTP 伺服器的安裝、設定及用戶管理後,最後重要的一步就是實際確認 FTP 伺服器運作是否正常
本節將介紹如何在本機端與 FTP 客戶端進行連線與基本操作測試。

本機端測試連線(指令列方式)

可用 ftp 指令在 Ubuntu 自身進行連線測試:

ftp localhost

當出現登入提示時,請輸入剛剛建立的 FTP 用戶名稱及密碼。

Name (localhost:username): ftpuser1
Password: ********

登入後,可用以下指令測試基本功能:

ls            # 列出檔案清單
cd files      # 進入子目錄
put test.txt  # 上傳檔案
get test.txt  # 下載檔案

若一切順利,代表 FTP 伺服器已正確運作。

※注意:新版本 Ubuntu 已不建議使用 ftp 指令,推薦改用 lftpncftp 這類新型客戶端工具。

圖形化用戶端連線測試(以 FileZilla 為例)

若需測試更複雜的資料夾結構或給一般使用者操作,建議用FileZilla 等圖形化 FTP 客戶端。以下為連線設定步驟:

FileZilla 設定步驟:

  1. 啟動 FileZilla,開啟「網站管理員」
  2. 新增新站台
  3. 填寫下列資訊:
設定項目內容
主機(Host)伺服器 IP 或網域名稱
協議(Protocol)FTP – File Transfer Protocol
加密(Encryption)明確的 FTP over TLS(若有啟用 FTPS)
登入類型一般(Normal)
使用者名稱如 ftpuser1
密碼對應用戶密碼
  1. 點擊「連線」即可

連線成功後應能顯示檔案及目錄結構,也可測試檔案上傳/下載。

FTP 常見問題與檢查重點

問題檢查重點
無法連線確認防火牆及安全群組的埠號有正確開放
登入失敗(530 Login incorrect)用戶名稱/密碼正確性、vsftpd.userlist 有無設定
無法顯示檔案清單被動模式有無啟用、相關埠號有無開放
檔案名稱出現亂碼確認 UTF-8 設定、客戶端字元集設定

查看日誌紀錄以排錯

若遇到問題難以排解,可查看 vsftpd 日誌檔:

cat /var/log/vsftpd.log

另外也可查詢系統層級日誌:

sudo journalctl -u vsftpd

這些資訊能幫助判斷「什麼時間、哪個用戶、做了什麼操作、哪裡出錯」。

其他提示

  • 連線不穩定: 應檢查客戶端防火牆或防毒軟體是否阻擋連線。
  • 因資安強化被限制: Ubuntu 常預設開啟 AppArmor,亦需留意 SELinux 影響。

總結

FTP 常見錯誤大多有共通原因。建議逐項檢查設定檔、用戶、網路防火牆、日誌紀錄,即可排除大部分問題。

下一節將介紹 FTP 運作時常見的問題與對應解法,讓您面對錯誤也能迅速處理。

10. 總結

本文介紹了在 Ubuntu 上架設 FTP 伺服器的方法,並以輕量且安全的 vsftpd(Very Secure FTP Daemon) 為例,分步講解讓初學者也能輕鬆上手。

現在將回顧各章重點,並給出今後維運的建議。

流程重點回顧

步驟內容
1. 安裝透過 apt install vsftpd 安裝 vsftpd,並設定服務啟動與防火牆開放
2. 基本設定允許寫入、啟用本地用戶、設定歡迎訊息等個人化參數
3. 資安強化利用 chroot 限制目錄、用戶名單控管、FTPS 加密等確保安全性
4. 日文支援統一 UTF-8 語系設定並調整客戶端字元集,解決亂碼問題
5. 被動模式與防火牆正確設定 NAT、雲端環境下的網路與防火牆,確保外部連線順利
6. 用戶管理細緻控管每位用戶的目錄與權限,實現安全共享
7. 功能測試透過指令列及圖形化工具(如 FileZilla)檢查實際連線與操作
8. 疑難排解掌握常見錯誤的原因及處理方法,提升問題復原速度

今後維運建議

FTP 伺服器雖可長期運作,但不可任意放置不管。建議注意以下事項,以維持安全與穩定性:

  • 定期套件升級: 建議隨時更新 vsftpd 與 Ubuntu 本體,避免資安漏洞。
  sudo apt update && sudo apt upgrade
  • 定期檢查日誌: 建議定時查看 /var/log/vsftpd.log,及早發現異常連線或失敗紀錄。
  • 刪除不再使用的帳號: 臨時用戶使用完畢後,請盡快移除帳號,降低資安風險。
  • 評估導入 SFTP: 如需更高安全性,可考慮改用 OpenSSH 為基礎的 SFTP 檔案傳輸。

最後建議

FTP 是歷史悠久但依然實用的檔案傳輸協定。希望本教學能幫助你根據自身需求,順利架設並維護安全、穩定的 FTP 伺服器環境。

若想進一步擴展,建議參考 SFTP、rsync、WebDAV 等其他檔案傳輸協定的比較與應用,拓展更多實務技能。

FAQ(常見問題集)

以下彙整在 Ubuntu 架設與維運 FTP 伺服器時,最常被詢問的問題,協助大家快速查找解答:

Q1. FTP 和 FTPS 有什麼差別?

A1.
FTP 所有傳輸內容皆為明文,無加密;FTPS 則透過 SSL/TLS 進行加密,可安全傳送帳號密碼與資料。在公網使用時,強烈建議採用 FTPS

Q2. 為什麼日文檔案名稱會亂碼?

A2.
只要伺服器與客戶端的字元集(編碼)不一致,就會亂碼。請確保 Ubuntu 設定為 UTF-8,且 FTP 客戶端(如 FileZilla)也選擇 UTF-8 字元集即可。

Q3. Ubuntu 預設有內建 FTP 伺服器嗎?

A3.
沒有。需使用 apt 另外安裝 vsftpd 或其他 FTP 伺服器套件。

Q4. 無法顯示檔案清單,並出現逾時現象怎麼辦?

A4.
通常是因未設定被動模式或未開放相關埠號。請於 vsftpd.conf 設定 pasv_enable=YES、指定 pasv_min_portpasv_max_port,並於防火牆開放這段埠號範圍。

Q5. vsftpd 日誌紀錄檔在哪?

A5.
預設日誌記錄於下方路徑:

/var/log/vsftpd.log

若未產生日誌,請檢查 vsftpd.conf 的相關日誌參數(如 xferlog_enable=YES)是否已啟用。

Q6. 如何暫時停用 FTP 用戶?

A6.
可用以下方法暫時禁止用戶登入:

  • /etc/vsftpd.userlist 刪除該用戶(啟用白名單時)
  • 將用戶的 shell 設定為 /usr/sbin/nologin
  • 將用戶密碼鎖定:
  sudo passwd -l 用戶名

Q7. 想要停止 FTP 伺服器服務要怎麼做?

A7.
可用下列指令停止 vsftpd:

sudo systemctl stop vsftpd

若需永久停用自動啟動,可再執行:

sudo systemctl disable vsftpd

Q8. 有沒有比 FTP 更安全的傳檔方式?

A8.
有。SFTP(SSH File Transfer Protocol) 是以 OpenSSH 為基礎,傳輸過程全程加密,比 FTP 更安全。也可考慮用 SFTP 取代 vsftpd 架構。

侍エンジニア塾