ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Linux 配置 FTP 服务器实现文件上传下载

Linux 配置 FTP 服务器实现文件上传下载 前言vsftpdVery Secure FTP Daemon是 Linux 上最主流的 FTP 服务端特点是轻量、稳定、安全性好。适合这些场景给外包/客户开个账号传文件老设备、老系统只支持 FTP内网快速搭个文件中转站先说句实在话FTP 是明文协议账号密码和数据在网上裸奔。除非有历史包袱否则新项目建议直接用 SFTP基于 SSH零配置成本或 FTPS。本文最后会讲怎么给 vsftpd 加上 TLS 加密。环境Rocky Linux 8 / CentOS 7Ubuntu 差异已标注一、安装# Rocky / CentOS dnf install -y vsftpd # Ubuntu / Debian # apt install -y vsftpd vsftpd -v # 确认版本后面有些配置项和版本相关先备份配置这步别省cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak注意路径差异CentOS 系在/etc/vsftpd/Ubuntu 是/etc/vsftpd.conf没有子目录。二、创建 FTP 用户# -d 指定家目录-s 指定不可登录的 shell安全 useradd -d /data/ftp/ftpuser -s /sbin/nologin ftpuser # 设置系统密码 passwd ftpuser # 目录准备 mkdir -p /data/ftp/ftpuser chown -R ftpuser:ftpuser /data/ftp/ftpuser chmod 755 /data/ftp/ftpuser为什么要-s /sbin/nologinFTP 用户只需要能传文件不需要能 SSH 登录服务器。给它/sbin/nologin能有效降低被爆破后的危害。但要注意某些发行版需要把 shell 加入/etc/shells详见 6.2。三、配置 vsftpd.conf完整配置如下同样给精简可用的版本# 基本设置 # 禁止匿名登录重要默认可能是 YES anonymous_enableNO # 允许本地用户登录 local_enableYES # 允许写操作上传、删除、改名都靠它 write_enableYES # 本地用户上传文件的权限掩码022 755 local_umask022 # 目录与日志 dirmessage_enableYES xferlog_enableYES xferlog_std_formatYES connect_from_port_20YES # 以独立模式运行并监听 listenYES listen_ipv6NO # PAM 认证模块 pam_service_namevsftpd userlist_enableYES # 禁锢用户在家目录 # 用户登录后只能在自家目录无法 cd 到上级 chroot_local_userYES allow_writeable_chrootYES # 被动模式NAT/防火墙环境必配 pasv_enableYES pasv_min_port30000 pasv_max_port30100 # 公网访问时必填填服务器的公网 IP # pasv_address203.0.113.10核心参数说明参数说明anonymous_enableNO必改项。默认开启匿名访问等于谁都能传文件write_enableYES不开这个用户只能下载不能上传chroot_local_userYES把用户锁在自家目录防止翻看服务器其他文件allow_writeable_chrootYES关键项见 6.1不加会直接报错登不上pasv_min_port/pasv_max_port被动模式端口范围防火墙要放行这一段pasv_address服务器在 NAT 后面时必须填公网 IP四、启动服务与防火墙systemctl enable --now vsftpd systemctl status vsftpd防火墙firewall-cmd --permanent --add-serviceftp firewall-cmd --permanent --add-port30000-30100/tcp firewall-cmd --reload为什么还要加端口范围FTP 有两种模式主动模式Active服务端主动连客户端。客户端在 NAT 后面时基本用不了。被动模式Passive客户端连服务端的随机高端口。现代客户端默认都是被动模式所以必须放行pasv_min_port~pasv_max_port。SELinuxgetenforce setsebool -P ftpd_full_access on # 允许 vsftpd 读写用户家目录五、验证测试5.1 服务端自测ftp localhost # 输入用户名密码能登录就说明基本 OK5.2 Linux 客户端测试# 方式一ftp 命令 ftp 192.168.1.10 # 方式二lftp更好用支持被动模式切换 dnf install -y lftp lftp -u ftpuser,密码 192.168.1.105.3 curl 测试适合脚本化验证# 下载 curl -u ftpuser:密码 ftp://192.168.1.10/test.txt # 上传 curl -u ftpuser:密码 -T local.txt ftp://192.168.1.10/ # 列目录 curl -u ftpuser:密码 ftp://192.168.1.10/注意curl 默认走主动模式在某些网络环境下会失败。加上--ftp-pasv强制被动模式再试curl --ftp-pasv -u ftpuser:密码 ftp://192.168.1.10/如果加了这个参数就好了说明是主动/被动模式搞错了不是服务端问题。5.4 用 FileZilla 等图形工具连接时把「传输模式」设为被动字符集设为UTF-8中文文件名才不会乱码。六、常见问题排查重点6.1500 OOPS: vsftpd: refusing to run with writable root inside chroot()这是配chroot_local_userYES后最经典的错误。原因你把用户禁锢在家目录了但家目录本身是可写的。用户如果能写自己的根目录就能通过上传.ssh之类的目录实现越权所以 vsftpd 拒绝启动。解法一推荐确认 vsftpd 版本 ≥ 3.0加上allow_writeable_chrootYES解法二更安全不依赖配置项把家目录设成不可写另建子目录给用户写chmod 755 /data/ftp/ftpuser mkdir /data/ftp/ftpuser/upload chown ftpuser:ftpuser /data/ftp/ftpuser/upload这样用户能进家目录只读但要写东西得进upload子目录。安全性比解法一好。版本坑allow_writeable_chroot在 vsftpd 3.0.2 曾被移除3.0.3 又加回来了。如果你加了这行还报unknown option说明版本不对只能用解法二。6.2530 Login incorrect这个错误信息很笼统原因有好几个按下面顺序排查① shell 不在/etc/shells里grep nologin /etc/shells如果没输出说明/sbin/nologin没被列为合法 shellPAM 会拒绝。加上echo /sbin/nologin /etc/shells② 用户被列入了黑名单cat /etc/vsftpd/ftpusers # 这个文件里的用户一律禁止 FTP 登录 cat /etc/vsftpd/user_list # 配合 userlist_enableYES默认是黑名单root默认就在这两个文件里这是故意的不要删。你自己的用户如果也在里面删掉对应行。③ PAM 配置问题检查/etc/pam.d/vsftpd确认pam_shells.so和pam_listfile.so没有误伤。④ 密码本身错了先确认能su - ftpuser切换成功排除密码问题。6.3 能登录能列目录但上传失败检查这三点grep write_enable /etc/vsftpd/vsftpd.conf # 是不是 NO ls -ld /data/ftp/ftpuser # 目录属主对不对 getsebool ftpd_full_access # SELinux 放行了吗文件系统权限和 SELinux 都要过和 NFS 一样是两层校验。6.4 被动模式连不上能登录但列不出目录 / 一直卡住症状能连上、能认证但执行ls就卡住或超时。原因被动模式的数据端口被防火墙拦了。# 确认配置生效 grep pasv /etc/vsftpd/vsftpd.conf # 确认防火墙放行了整个范围 firewall-cmd --list-all | grep -A2 ports如果服务器在云上阿里云/腾讯云别忘了安全组也要放行 30000-30100。这是最容易被忽略的一层。用抓包定位到底卡在哪tcpdump -i any -n port 21 or portrange 30000-301006.5 中文文件名乱码确认客户端用UTF-8编码连接。FileZilla 里站点管理器 → 字符集 → 强制 UTF-8。vsftpd 本身在较新版本默认就是 UTF-8老版本可能需要utf8_filesystemYES七、进阶给 FTP 加上 TLS 加密FTPS既然 FTP 是明文的生产环境强烈建议启用 TLS。① 生成自签证书内网够用公网建议买正式证书openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \ -keyout /etc/vsftpd/vsftpd.key \ -out /etc/vsftpd/vsftpd.crt \ -subj /CCN/STBeijing/LBeijing/OMyOrg/CN192.168.1.10 chmod 600 /etc/vsftpd/vsftpd.key② 配置中追加ssl_enableYES allow_anon_sslNO force_local_data_sslYES force_local_logins_sslYES ssl_tlsv1_2YES ssl_tlsv1_1NO ssl_tlsv1NO ssl_sslv2NO ssl_sslv3NO rsa_cert_file/etc/vsftpd/vsftpd.crt rsa_private_key_file/etc/vsftpd/vsftpd.key require_ssl_reuseNO ssl_ciphersHIGH重启systemctl restart vsftpd客户端就要用FTPS不是 SFTP连接并且因为是自签证书需要选择信任该证书。require_ssl_reuseNO这行建议加上。某些客户端尤其是 FileZilla在 TLS 会话复用上和 vsftpd 有兼容性问题不加这个可能连不上。八、安全加固清单措施做法禁用匿名anonymous_enableNO禁锢目录chroot_local_userYES 不可写家目录限制登录用user_list白名单只放需要的用户禁用 root保持/etc/vsftpd/ftpusers里有 root加密传输启用 TLS第七节限制来源防火墙 云安全组限制源 IP防爆破配合 fail2ban 监控/var/log/secure被动端口收窄pasv_min_port/pasv_max_port范围开小一点九、总结环节关键点用户useradd -s /sbin/nologinshell 要进/etc/shells核心配置anonymous_enableNO、write_enableYES、chroot_local_userYESchroot 报错allow_writeable_chrootYES或改用手法更稳的不可写家目录 子目录防火墙放行 ftp 被动端口范围云服务器还要配安全组SELinuxsetsebool -P ftpd_full_access on排错卡在列目录 被动模式端口没通530 shell/黑名单/PAM最后再提醒一次FTP 明文传输新项目优先考虑 SFTP。如果必须用 FTP请务必按第七节把 TLS 打开。
返回列表