熱門分類
載入中…
目錄0%

🐧 Linux FTP Server 架設教學:從 vsftpd 安裝到使用者權限設定全攻略

    🐧 Linux FTP Server 架設教學:從 vsftpd 安裝到使用者權限設定全攻略

    適合剛接觸主機維運的你:本文用最實務的方式,帶你從 0 開始完成 FTP(vsftpd)安裝、使用者與權限管理、防火牆/SELinux 設定與 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 成功

    🔗 延伸閱讀

    — WWFandy・主題筆記

    🔗 分享這篇 LINE Facebook X

    沒有留言:

    字級