🐧 Linux FTP Server 架設教學:從 vsftpd 安裝到使用者權限設定全攻略
適合剛接觸主機維運的你:本文用最實務的方式,帶你從 0 開始完成 FTP(vsftpd)安裝、使用者與權限管理、防火牆/SELinux 設定與 TLS 加密。
📑 目錄
- 一、環境與套件準備
- 二、安裝 vsftpd
- 三、核心設定與使用者權限
- 四、防火牆(UFW/Firewalld)與 Passive Port
- 五、SELinux(CentOS/RHEL)注意事項
- 六、啟用 SSL/TLS 加密登入
- 七、測試與常見問題排查
- 🧭 行動清單
- 🔗 延伸閱讀
一、環境與套件準備
vsftpd(Very Secure FTP Daemon)以安全與穩定聞名,主流發行版皆提供套件。
最低需求:開啟 TCP 21 與一段「被動模式」連線埠(建議 40000–50000),系統時鐘正確、DNS 正常。
# 檢查版本與作業系統
cat /etc/os-release
uname -r
二、安裝 vsftpd
Debian/Ubuntu
sudo apt update
sudo apt install -y vsftpd
sudo systemctl enable --now vsftpd
sudo systemctl status vsftpd
RHEL/CentOS/Rocky/Alma
sudo dnf install -y vsftpd
sudo systemctl enable --now vsftpd
sudo systemctl status vsftpd
三、核心設定與使用者權限
主要設定檔:/etc/vsftpd.conf。以下為安全預設與本機使用者上傳的常用組合:
建議設定片段(可直接覆蓋/合併)
# /etc/vsftpd.conf — 安全基準
listen=YES
listen_ipv6=NO
anonymous_enable=NO
local_enable=YES
write_enable=YES
# 上傳檔案預設權限(等同 umask 022)
local_umask=022
# 限制使用者在家目錄(避免越權)
chroot_local_user=YES
allow_writeable_chroot=YES
# 被動模式;請與防火牆一併開放
pasv_enable=YES
pasv_min_port=40000
pasv_max_port=50000
# 登入與記錄
xferlog_enable=YES
xferlog_std_format=NO
log_ftp_protocol=YES
# 其他強化
use_localtime=YES
ftpd_banner=Welcome to WWFandy FTP Service.
# (如需允許特定使用者):
# userlist_enable=YES
# userlist_file=/etc/vsftpd.userlist
# userlist_deny=NO # 僅允許在清單中的帳號
建立本機帳號與上傳資料夾
# 建立一個僅 FTP 用途的帳號與資料夾
sudo adduser ftpuser
sudo passwd ftpuser
# 指定可上傳資料夾(範例:/srv/ftp/ftpuser)
sudo mkdir -p /srv/ftp/ftpuser/upload
sudo chown -R ftpuser:ftpuser /srv/ftp/ftpuser
# 將使用者家目錄改到 /srv/ftp/ftpuser(可選)
sudo usermod -d /srv/ftp/ftpuser ftpuser
# 重啟服務
sudo systemctl restart vsftpd
(可選)匿名唯讀下載
若需對外提供公開下載,可啟用匿名模式但避免寫入:
# /etc/vsftpd.conf 增補
anonymous_enable=YES
anon_upload_enable=NO
anon_mkdir_write_enable=NO
anon_other_write_enable=NO
# 匿名根目錄(預設 /var/ftp,請放只讀檔案)
# anon_root=/var/ftp/pub
四、防火牆(UFW/Firewalld)與 Passive Port
FTP 的資料連線在被動模式下會落在你設定的 pasv_min_port..pasv_max_port 範圍,務必放行。
UFW(Debian/Ubuntu)
sudo ufw allow 21/tcp
sudo ufw allow 40000:50000/tcp
sudo ufw reload
sudo ufw status
Firewalld(RHEL/CentOS/Rocky/Alma)
sudo firewall-cmd --permanent --add-service=ftp
sudo firewall-cmd --permanent --add-port=40000-50000/tcp
sudo firewall-cmd --reload
sudo firewall-cmd --list-all
五、SELinux(CentOS/RHEL)注意事項
啟用 SELinux 時,需設定布林值與檔案標籤,確保 FTP 可讀寫正確路徑。
# 允許 vsftpd 寫入本機使用者家目錄/指定路徑(依需求擇一或多項)
sudo setsebool -P ftpd_full_access on # 寬鬆:允許 vsftpd 讀寫(最簡單)
# 或較精準做法:標註要提供的下載/上傳目錄為 public_content 或 public_content_rw_t
sudo semanage fcontext -a -t public_content_rw_t "/srv/ftp(/.*)?"
sudo restorecon -Rv /srv/ftp
如需匿名寫入(通常不建議),另有 ftpd_anon_write 布林值可用;請審慎評估風險。
六、啟用 SSL/TLS 加密登入
傳統 FTP 明文傳輸帳密,建議至少加上 TLS(FTPS)。以下示範自簽憑證快速啟用:
# 產生自簽憑證(有效 1 年)
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout /etc/ssl/private/vsftpd.key \
-out /etc/ssl/certs/vsftpd.crt \
-subj "/C=TW/ST=Taiwan/L=Taipei/O=WWFandy/OU=IT/CN=ftp.example.com"
# vsftpd 啟用 TLS
sudo bash -c 'cat >> /etc/vsftpd.conf' << "EOF"
ssl_enable=YES
rsa_cert_file=/etc/ssl/certs/vsftpd.crt
rsa_private_key_file=/etc/ssl/private/vsftpd.key
force_local_logins_ssl=YES
force_local_data_ssl=YES
ssl_tlsv1_2=YES
ssl_sslv2=NO
ssl_sslv3=NO
EOF
sudo systemctl restart vsftpd
正式環境可使用公有 CA 憑證,或以反向代理(如 Nginx/HAProxy)提供 FTPS/FTP-over-TLS 終結。
七、測試與常見問題排查
基本連線測試
# Linux 用戶端(互動式)
ftp -p <server-ip>
# 免互動(lftp 推薦)
lftp -u ftpuser,****** -e "ls; put test.txt; bye" ftp://<server-ip>
# 檢查被動模式與 TLS
curl -v --ssl-reqd ftp://<server-ip>/ --user ftpuser:******
常見錯誤速查
- 連得上但列表/上傳卡住:多半是
pasv埠沒放行;同時確認主機在 NAT 後是否需pasv_address=<public-ip>。 - 530 Login incorrect:檢查使用者密碼、/etc/vsftpd.userlist(若有啟用白名單)。
- 500 OOPS: vsftpd: refusing to run with writable root:已設
chroot_local_user=YES時,請搭配allow_writeable_chroot=YES或調整家目錄權限。 - TLS 連線被拒:確認
ssl_enable與憑證路徑;客戶端是否啟用「需要加密」。 - SELinux 拒絕:
/var/log/audit/audit.log查 AVC 記錄;以sealert -a產生建議;或先用ftpd_full_access on驗證。
🧭 行動清單
✅ 安裝 vsftpd 並套用安全基準設定
✅ 建立 ftpuser,設定家目錄與上傳資料夾
✅ 開啟 TCP/21 與 40000–50000/tcp(UFW 或 Firewalld)
✅ (RHEL 系)設定 SELinux 標籤與/或布林值
✅ 啟用 TLS(FTPS),強制帳密與資料流加密
✅ 以 lftp/curl 驗證列表、上傳、TLS 成功
🔗 延伸閱讀
- Linux Proxy Server 建置教學(Squid)
- Linux 防火牆與 Fail2Ban:服務保護與 Systemd 自動化
- Linux Log 自動化:GoAccess + Fail2Ban 實戰
— WWFandy・主題筆記
沒有留言: