凌峰创科服务平台

ubuntu 搭建 ftp服务器

本教程将涵盖从安装到安全配置的完整步骤,包括:

ubuntu 搭建 ftp服务器-图1
(图片来源网络,侵删)
  1. 安装 vsftpd
  2. 基本配置
  3. 创建 FTP 用户
  4. 配置防火墙
  5. 连接测试
  6. 常见问题与安全加固

第一步:安装 vsftpd

更新你的软件包列表,然后安装 vsftpd

# 更新软件包列表
sudo apt update
# 安装 vsftpd
sudo apt install vsftpd

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

sudo systemctl status vsftpd

如果看到绿色的 active (running) 字样,说明服务已成功启动。


第二步:基本配置

我们需要编辑 vsftpd 的主配置文件 /etc/vsftpd.conf

ubuntu 搭建 ftp服务器-图2
(图片来源网络,侵删)
sudo nano /etc/vsftpd.conf

在打开的文件中,我们需要修改或取消注释(删除行首的 )以下几项,这是最核心的配置部分:

# 禁止匿名用户登录
anonymous_enable=NO
# 允许本地用户登录(我们在下一步会创建专门的用户)
local_enable=YES
# 允许 FTP 用户执行写操作(上传、创建目录、删除等)
write_enable=YES
# 启用用户目录的限制,这是关键一步,它会将用户锁定在其主目录下。
chroot_local_user=YES
# 允许对被限制在主目录下的用户进行写操作
allow_writeable_chroot=YES
# 设置本地用户的 umask 值,控制上传文件的权限
local_umask=022
# 启用目录消息功能,当用户进入目录时显示 .message 文件的内容
dirmessage_enable=YES
# 启用上传和下载的日志记录
xferlog_enable=YES
xferlog_std_format=YES
# 监听 IPv4 地址
listen=YES
# (可选)监听 IPv6 地址,如果不需要可以注释掉
# listen_ipv6=YES
# 设置 PAM 服务名,用于用户认证
pam_service_name=vsftpd
# 设置用户配置文件的目录,可以为不同用户设置不同配置
user_config_dir=/etc/vsftpd_user_conf
# 设置被动模式端口范围,这有助于防火墙配置
pasv_min_port=10020
pasv_max_port=10220

配置说明:

  • anonymous_enable=NO:出于安全考虑,我们禁止匿名访问。
  • local_enable=YES:允许系统用户登录。
  • write_enable=YES:允许用户有写入权限。
  • chroot_local_user=YES非常重要,这会将用户“囚禁”在其自己的主目录下,防止他们访问服务器上其他目录,这是 FTP 安全的基本要求。
  • allow_writeable_chroot=YES:配合 chroot_local_user 使用,允许被限制的用户在目录内进行写操作(在较新的 vsftpd 版本中需要此选项)。
  • pasv_min_portpasv_max_port:我们为被动模式(推荐使用)定义了一个端口范围,后续配置防火墙时需要开放这个范围内的端口。

保存并退出文件:nano 编辑器中,按 Ctrl + X,然后按 Y,最后按 Enter

配置完成后,重启 vsftpd 服务使配置生效:

ubuntu 搭建 ftp服务器-图3
(图片来源网络,侵删)
sudo systemctl restart vsftpd

第三步:创建 FTP 用户

为了安全,强烈建议不要使用系统已有的 root 或其他管理用户,我们应该为 FTP 服务创建一个专用的用户。

这里我们创建一个名为 ftpuser 的用户,并为其设置一个强密码。

# 创建新用户
sudo adduser ftpuser
# 系统会提示你设置密码和用户信息,一路回车或填写即可

这个用户会自动拥有一个主目录,通常位于 /home/ftpuser,这就是该用户登录 FTP 后能看到的根目录。


第四步:配置防火墙

Ubuntu 默认使用 ufw (Uncomplicated Firewall) 防火墙,我们需要开放 FTP 服务的端口以及我们为被动模式设置的端口范围。

FTP 协议比较特殊,它需要两个端口:

  1. 命令端口:默认为 21,这是客户端连接服务器时使用的端口。
  2. 数据端口:用于传输文件,在被动模式下,这个端口是动态的,所以我们之前定义了一个范围 10020-10220
# 开放 21 端口
sudo ufw allow 21/tcp
# 开放被动模式的端口范围
sudo ufw allow 10020:10220/tcp
# (可选)如果你希望从同一局域网的其他电脑访问,可以允许端口转发
# sudo ufw allow from 192.168.1.0/24 to any port 21 proto tcp
# sudo ufw allow from 192.168.1.0/24 to any port 10020:10220 proto tcp
# 重新加载防火墙规则使其生效
sudo ufw reload

第五步:连接测试

你的 FTP 服务器已经准备就绪,你可以使用任何 FTP 客户端软件来连接,

  • Windows: FileZilla, WinSCP
  • macOS: FileZilla, Cyberduck
  • Linux: FileZilla, lftp 命令行工具

这里以 FileZilla 为例:

  1. 打开 FileZilla。
  2. 在顶部菜单栏填写以下信息:
    • 主机: 你的服务器 IP 地址 (168.1.100your_domain.com)。
    • 用户名: ftpuser (你刚才创建的用户名)。
    • 密码: 你为 ftpuser 设置的密码。
    • 端口: 21
  3. 点击“快速连接”。

如果一切正常,你应该能够成功连接,并且只能看到 /home/ftpuser 目录下的文件和文件夹,你可以尝试上传、下载、创建和删除文件来测试权限。


第六步:常见问题与安全加固

问题:连接被拒绝或超时

这通常是由于 被动模式防火墙 的配置问题。

  • 确认防火墙:确保你已经开放了 2110020-10220 端口。
  • 客户端设置:在 FileZilla 中,确保被动模式是开启的,进入 编辑 -> 设置 -> 连接 -> FTP,勾选“被动模式”。

问题:用户被 chroot 但无法写入 (550 Failed to open file)

错误信息可能类似于 OOPS: vsftpd: refusing to run with writable root inside chroot()。 这是因为在新版本的 vsftpd 中,出于安全考虑,不允许被 chroot 的用户拥有一个可写的根目录。 有两种解决方案:

  • 方案A (推荐):不要让用户的根目录 (/home/ftpuser) 可写,而是创建一个子目录(如 ftpfiles)用于上传,这样既安全又符合逻辑。

    # 登录为 ftpuser
    su - ftpuser
    # 在其主目录下创建一个用于上传的文件夹
    mkdir files
    chmod 755 files
    exit

    ftpuser 登录后,应该进入 /home/ftpuser,并有一个 files 文件夹可以写入。

  • 方案B (不推荐):在 /etc/vsftpd.conf 中添加一行,强制允许可写 chroot,这会降低安全性。

    allow_writeable_chroot=YES

    如果你之前已经添加了这一行,请确保它存在,如果仍有问题,请检查文件夹权限。

安全加固建议

  • 使用 SFTP (SSH File Transfer Protocol)强烈建议,SFTP 使用 SSH 协议进行文件传输,默认端口是 22,并且所有数据都是加密的,比 FTP 安全得多,在 Ubuntu 上,你已经有 SSH 服务器,可以直接使用 SFTP,无需额外安装,大多数 FTP 客户端(如 FileZilla)都支持 SFTP。

  • 限制用户访问:如果你只想让用户访问特定目录,而不是他们的主目录,可以使用符号链接。

    # 假设你想让 ftpuser 访问 /var/www/html
    # 先创建链接
    sudo ln -s /var/www/html /home/ftpuser/www
    # 然后修改所有者和组
    sudo chown -h ftpuser:ftpuser /home/ftpuser/www
  • 禁用 root 登录:确保 vsftpd.conf 中的 anonymous_enable=NOlocal_enable=YES 只用于你创建的普通用户,不要给 root 用户 FTP 权限。

至此,你已经成功在 Ubuntu 上搭建并配置好了一个功能完善且相对安全的 FTP 服务器。

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