Linux FTP / SFTP 服务配置实战

1次阅读

vsftpd启动失败主因是配置冲突:布尔值错误、anonymous_enable与local_enable矛盾、chroot_local_user未配allow_writeable_chroot、非ASCII注释解析失败;sftp需用openssh而非vsftpd;selinux、挂载选项、防火墙pasv端口及nat设置也常致故障。

Linux FTP / SFTP 服务配置实战

vsftpd 启动失败:检查 /etc/vsftpd.conf 里这三行是否冲突

很多人在改完配置后执行 systemctl start vsftpd 报错退出,日志里常见 500 OOPS: bad bool value in config file 或直接静默失败。根本原因常是布尔值写法不一致,或关键开关互相矛盾。

实操建议:

  • anonymous_enable=YESlocal_enable=NO 同时开,会导致本地用户无法登录但匿名又没配好目录权限,服务拒绝启动
  • chroot_local_user=YES 必须搭配 allow_writeable_chroot=NO(或设为 YES 但需确保用户根目录不可写),否则 vsftpd 会因安全策略拒绝加载
  • 注释掉的行如果含空格或中文字符(比如 # 禁用匿名),某些旧版 vsftpd 会解析失败——删掉所有非 ASCII 注释更稳妥

SFTP 不是 FTP over ssl,别在 vsftpd 里配 ssl_enable=YES

搜 “Linux SFTP 配置” 很多人误以为只要打开 vsftpd 的 SSL 就能用 SFTP,结果用 FileZilla 连 sftp:// 协议一直超时。SFTP 是 SSH 子系统,和 FTP 完全无关,vsftpd 根本不提供 SFTP 服务。

实操建议:

  • 要 SFTP,直接用 OpenSSH 自带的,确认 /etc/ssh/sshd_config 中有 Subsystem sftp /usr/lib/openssh/sftp-server(新版通常默认存在)
  • 禁用密码登录?别只关 PasswordAuthentication no,还要确保 PubkeyAuthentication yes 且用户 ~/.ssh/authorized_keys 权限是 600
  • 限制 SFTP 用户只能访问某目录?用 ChrootDirectory,但注意该路径必须属 root 且不可写,否则 sshd 启动时会报 fatal: bad ownership or modes

用户登录后看不到文件:SELinux 或文件系统挂载选项拦住了

vsftpd 或 SFTP 登录成功,ls 却返回空,或者提示 Permission denied,但 ls -l 显示权限明明正常。大概率是 SELinux 上下文或挂载参数卡了路。

实操建议:

  • 检查目录 SELinux 类型:ls -Z /path/to/ftp-root,如果是 default_t 而不是 public_content_tsftp_home_t,用 chcon -t public_content_t /path/to/ftp-root 临时修复
  • 若 FTP 根目录在独立磁盘上(如 /mnt/data),检查 mount 输出是否含 noexecnosuidnodev ——vsftpd 某些模式依赖 exec 权限,哪怕只是列目录
  • 用户主目录在 NFS 或 CIFS 上?SFTP 默认不支持这类远程文件系统做 chroot,vsftpd 则可能因 UID/GID 映射异常导致 getpwuid 失败而静默拒访

vsftpd 被防火墙挡住:不只是 21 端口的事

开放了 firewall-cmd --add-port=21/tcp,FTP 客户端仍连不上,或能登录但传文件卡住。这是因为 FTP 主动模式要随机高位端口,而 vsftpd 默认用被动模式(PASV),需要额外放行数据端口段。

实操建议:

  • /etc/vsftpd.conf 中明确设 pasv_min_port=40000pasv_max_port=40100,再用 firewall-cmd --add-port=40000-40100/tcp
  • 如果用云服务器(如阿里云、AWS),安全组规则必须同步放行 PASV 端口段,光配系统防火墙没用
  • 内网穿透或 NAT 后部署?务必加 pasv_address=你的公网IP,否则客户端收到的是内网地址,连不上数据通道

最麻烦的永远是组合问题:比如 SELinux + chroot + NFS 目录 + 自定义 PASV 地址,任意一环没对齐,现象都是“看起来连上了,但什么也干不了”。调的时候别一次改三处,每次只动一个点,用 journalctl -u vsftpd -ftail -f /var/log/secure 看实时报错,比猜快得多。

text=ZqhQzanResources