凌峰创科服务平台

Linux下FTP服务器搭建如何配置?

重要提醒:FTP 的安全性问题

传统的 FTP 协议在传输用户名、密码和文件时都是明文传输,存在巨大的安全风险,在今天的网络环境中,强烈建议使用 SFTP(基于 SSH 协议)或 FTPS(FTP over SSL/TLS)。

Linux下FTP服务器搭建如何配置?-图1
(图片来源网络,侵删)
  • SFTP (SSH File Transfer Protocol):不是 FTP 的安全版,而是 SSH 协议的一部分,它通过一个加密通道传输所有数据,安全性极高,大多数 Linux 系统默认都支持,无需额外安装 FTP 服务器。
  • FTPS (FTP Secure):在标准的 FTP 基础上增加了 SSL/TLS 加密层。

本教程会先教你搭建传统 FTP,然后重点介绍如何配置更安全的 FTPS


使用 vsftpd (Very Secure FTP Daemon) - 推荐

vsftpd 是目前 Linux 下最流行、最安全的 FTP 服务器之一,配置简单,性能稳定。

步骤 1:安装 vsftpd

在大多数基于 Debian/Ubuntu 的系统上:

sudo apt update
sudo apt install vsftpd

在大多数基于 CentOS/RHEL/Fedora 的系统上:

Linux下FTP服务器搭建如何配置?-图2
(图片来源网络,侵删)
sudo yum install vsftpd
# 或者 (对于较新版本的 CentOS/RHEL/Fedora)
sudo dnf install vsftpd

安装完成后,vsftpd 服务会自动启动,我们可以检查其状态:

sudo systemctl status vsftpd

步骤 2:配置防火墙

FTP 协议比较特殊,它使用两个端口:

  • 控制连接 (21端口):用于发送命令,如登录、列出目录。
  • 数据连接:用于传输文件,端口不固定(默认是 20 端口,但也可以是其他高位端口)。

我们需要在防火墙中打开 21 端口,并启用 FTP 服务所需的被动模式端口范围。

对于 UFW (Debian/Ubuntu):

Linux下FTP服务器搭建如何配置?-图3
(图片来源网络,侵删)
# 打开 21 端口
sudo ufw allow 21/tcp
# 允许被动模式端口范围 (这里以 10000-10100 为例,请根据你的配置修改)
sudo ufw allow 10000:10100/tcp
# 重启防火墙以应用规则
sudo ufw reload

对于 firewalld (CentOS/RHEL/Fedora):

# 打开 21 端口
sudo firewall-cmd --permanent --add-service=ftp
# 这条命令会自动处理 21 端口和被动模式所需的相关端口
# 或者手动添加端口范围
# sudo firewall-cmd --permanent --add-port=10000-10100/tcp
# 重新加载防火墙
sudo firewall-cmd --reload

步骤 3:配置 vsftpd

主配置文件位于 /etc/vsftpd.conf,我们先用一个备份文件来开始,以防配置错误。

sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.bak

然后打开配置文件进行编辑:

sudo nano /etc/vsftpd.conf

下面是一个推荐的、相对安全的配置,你可以根据需要取消注释或修改以下参数:

# 禁止匿名登录
anonymous_enable=NO
# 允许本地用户登录
local_enable=YES
# 允许写入文件
write_enable=YES
# 允许上传文件和目录
local_umask=022
# 当用户 chroot 到家目录时,禁止使用 writeable-root 权限
chroot_local_user=YES
# 启用用户目录的写权限(需要配合下面的配置)
allow_writeable_chroot=YES
# 启用 FTP 数据端口的数据连接
connect_from_port_20=YES
# 启用被动模式 (PASV),这是现代网络环境(如NAT)所必需的
pasv_enable=YES
pasv_min_port=10000
pasv_max_port=10100
# 这里的端口范围需要和你在防火墙中设置的保持一致
# 启用目录消息
dirmessage_enable=YES
# 启用上传和下载的日志记录
xferlog_enable=YES
xferlog_std_format=YES
# 当用户登录时,显示欢迎信息
ftpd_banner=Welcome to my FTP service.
# 设置用户只能访问其自己的家目录,不能切换到上级目录
# (chroot_local_user=YES,这个选项可能不是必须的,但加上更安全)
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd.chroot_list
# 创建一个空文件来启用这个功能
sudo touch /etc/vsftpd.chroot_list

重要配置说明:

  • pasv_min_portpasv_max_port:定义了被动模式下数据连接可用的端口范围。请确保这个范围在防火墙中是开放的
  • allow_writeable_chroot=YES:这是一个较新的安全特性,允许在 chroot 环境中进行写入操作,在旧版 vsftpd 中,你可能需要设置为 NO 并将用户家目录的权限设置为 555。

保存并关闭文件(在 nano 中是 Ctrl+XYEnter)。

步骤 4:创建 FTP 用户

假设我们要创建一个名为 ftpuser 的用户。

# 创建新用户
sudo useradd -m -s /sbin/nologin ftpuser
# -m: 自动创建用户家目录
# -s /sbin/nologin: 禁止该用户通过 SSH 登录系统,提高安全性
# 为用户设置密码
sudo passwd ftpuser

步骤 5:启动并启用 vsftpd 服务

# 启动服务
sudo systemctl start vsftpd
# 设置开机自启
sudo systemctl enable vsftpd

步骤 6:测试连接

现在你可以使用任何 FTP 客户端(如 FileZilla、WinSCP)进行连接了。

  • 主机: 你的服务器 IP 地址
  • 用户名: ftpuser
  • 密码: 你刚刚设置的密码
  • 端口: 21

如果连接成功,说明基本 FTP 服务器已经搭建完成。


配置更安全的 FTPS (FTP over SSL/TLS)

强烈建议你将服务器升级为 FTPS,以保护用户凭据和数据。

步骤 1:生成 SSL/TLS 证书

你可以使用自签名证书进行测试,或者使用 Let's Encrypt 等权威证书机构签发的证书。

这里我们创建一个自签名证书:

# 创建证书存放目录
sudo mkdir -p /etc/ssl/private
# 生成证书 (注意:Common Name 部分填入你的域名或服务器IP)
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/vsftpd.pem -out /etc/ssl/private/vsftpd.pem

在生成过程中,会提示你输入一些信息,直接回车使用默认值即可。

步骤 2:修改 vsftpd.conf 配置

再次编辑 /etc/vsftpd.conf 文件,添加或修改以下参数:

# ... (保留之前的配置) ...
# 启用 SSL/TLS
ssl_enable=YES
# 强制所有数据连接都使用加密
force_local_data_ssl=YES
force_local_logins_ssl=YES
# 指定证书文件路径
rsa_cert_file=/etc/ssl/private/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.pem
# 设置 SSL 的安全级别,建议为中等或高
ssl_tlsv1_2=YES
ssl_tlsv1_1=YES
ssl_sslv2=NO
ssl_sslv3=NO
# 控制客户端是否需要提供证书
require_ssl_reuse=NO

保存并关闭文件。

步骤 3:重启 vsftpd 服务

sudo systemctl restart vsftpd

步骤 4:客户端连接 (以 FileZilla 为例)

  1. 新建站点。
  2. 协议: 选择 "FTP - 文件传输协议"。
  3. 主机: 你的服务器 IP。
  4. 用户名: ftpuser
  5. 密码: 你的密码。
  6. 端口: 21。
  7. 点击 "连接" 按钮。
  8. 如果一切正常,FileZilla 会弹出一个 "证书警告" 对话框,因为我们是自签名证书,点击 "确定" 或 "始终接受" 即可。
  9. 在弹出的 "要求安全连接" 对话框中,选择 "要求显式 FTP over TLS"。

你的所有登录和文件传输都将在加密通道中进行。


使用 ProFTPD (替代方案)

如果你觉得 vsftpd 配置不够灵活,可以尝试 ProFTPD。

步骤 1:安装 ProFTPD

# Debian/Ubuntu
sudo apt install proftpd
# CentOS/RHEL/Fedora
sudo yum install proftpd
# 或
sudo dnf install proftpd

步骤 2:基本配置

ProFTPD 的配置文件是 /etc/proftpd/proftpd.conf,你可以直接编辑它,或者更推荐地,在 /etc/proftpd/conf.d/ 目录下创建独立的配置文件。

# 编辑主配置文件
sudo nano /etc/proftpd/proftpd.conf

一个简单的配置示例:

# 以 standalone 模式运行(推荐)
ServerType standalone
# 服务器标识
ServerName "My ProFTPD Server"
ServerIdent on "FTP Server Ready."
# 禁止匿名登录
<Anonymous ~ftp>
    User ftp
    Group nogroup
    # 用户进入目录后看到的欢迎信息
    UserAlias anonymous ftp
    DirFakeUser on ftp
    DirFakeGroup on ftp
    RequireValidShell off
    # 用户权限
    <Limit WRITE>
        DenyAll
    </Limit>
</Anonymous>
# 允许本地用户登录
DefaultRoot ~

步骤 3:启动并设置防火墙

# 启动服务
sudo systemctl start proftpd
sudo systemctl enable proftpd
# 防火墙规则 (和 vsftpd 类似)
# UFW
sudo ufw allow 21/tcp
sudo ufw allow 10000:10100/tcp
sudo ufw reload
# firewalld
sudo firewall-cmd --permanent --add-service=ftp
sudo firewall-cmd --reload

ProFTPD 的配置非常灵活,支持模块化扩展,你可以根据官方文档深入研究其高级功能。


总结与排错

步骤 vsftpd (推荐) ProFTPD
安装 sudo apt install vsftpd sudo apt install proftpd
主配置文件 /etc/vsftpd.conf /etc/proftpd/proftpd.conf
创建用户 sudo useradd -m -s /sbin/nologin ftpuser 同左
防火墙 开放 21 和被动端口范围 同左
启动服务 sudo systemctl start vsftpd sudo systemctl start proftpd

常见问题排查

  1. 连接被拒绝 (Connection refused)

    • 原因: vsftpd/proftpd 服务未启动,或防火墙阻止了 21 端口。
    • 解决: 检查服务状态 sudo systemctl status vsftpd,并确认防火墙规则正确。
  2. 530 Login incorrect

    • 原因: 用户名或密码错误。
    • 解决: 确认用户名和密码是否正确,检查用户是否被锁定(sudo passwd -S ftpuser)。
  3. 500 OOPS: vsftpd: refusing to run with writable root inside chroot()

    • 原因: 在较新版本的 vsftpd 中,当用户被限制在家目录时,该目录不能被写入。
    • 解决: 在 /etc/vsftpd.conf 中设置 allow_writeable_chroot=YES
  4. 425 Security: Bad IP connecting

    • 原因: 通常是由于被动模式的端口范围没有在防火墙中开放,或者客户端无法连接到服务器报告的 IP 地址(可能是内网 IP)。
    • 解决: 检查防火墙规则,确保被动端口范围(如 10000-10100)已开放,在客户端尝试使用服务器的公网 IP 进行连接。

希望这份详细的指南能帮助你成功搭建 FTP 服务器!如果遇到任何问题,欢迎随时提问。

分享:
扫描分享到社交APP
上一篇
下一篇