把本地Windows电脑上的网站源码、安装包或配置文件传到Linux云服务器,是部署服务前的必经环节。FTP协议虽然年头不短,但胜在操作直观、工具成熟,尤其是对不熟悉命令行的新手来说,图形化的FTP客户端几乎是零学习成本。整个过程分为两大部分:Linux服务器端搭建FTP服务,Windows客户端连接上传。下面按顺序把每一步讲透,顺带把容易踩的坑一起说清楚。

第一步:在Linux服务器上安装并配置vsftpd服务
Linux下的FTP服务端软件有不少选择,vsftpd(Very Secure FTP Daemon)因为安全性好、配置简单,是绝大多数发行版的默认推荐。以CentOS为例,执行以下命令即可完成安装并启动服务:
# 安装vsftpd yum install -y vsftpd # 启动服务并设置为开机自启 systemctl start vsftpd systemctl enable vsftpd # 查看服务状态,确认active (running) systemctl status vsftpd
Ubuntu或Debian系统则把yum换成apt即可:apt install -y vsftpd。安装完成后先别急着连,需要修改配置文件。vsftpd的主配置文件位于/etc/vsftpd/vsftpd.conf,用vim或nano打开后,重点确认以下几项配置:
# 是否允许本地系统用户登录(本地用户模式) local_enable=YES # 允许上传文件(写权限全局开关,关闭时任何用户都无法写入) write_enable=YES # 本地用户上传文件的默认权限掩码,022表示文件权限为644 local_umask=022 # 限制用户只能待在自己的主目录内,不允许切换到其他目录 chroot_local_user=YES # 当用户被限制在主目录时,允许其具有写权限(否则登录会报错) allow_writeable_chroot=YES
这里有个非常经典的坑:开启了chroot_local_user=YES之后,如果用户主目录本身是可写的,较新版本的vsftpd会直接拒绝登录,日志里提示500 OOPS: vsftpd: refusing to run with writable root inside chroot()。解决办法就是再加上allow_writeable_chroot=YES这一行,或者在主目录下单独建一个可写的子目录用于存放文件。改完配置记得重启服务:systemctl restart vsftpd。
第二步:创建FTP专用用户并处理防火墙放行
不建议直接用root账户登录FTP,一是vsftpd默认禁止root登录(在/etc/vsftpd/ftpusers和user_list文件中root被列入黑名单),二是安全性太差。正确做法是创建一个专用账号,并规划好它的主目录:
# 创建一个不允许通过SSH登录、只用于FTP的用户,主目录设为/data/ftp useradd -d /data/ftp -s /sbin/nologin ftpuser # 设置密码 passwd ftpuser # 创建文件存放目录并授权 mkdir -p /data/ftp/upload chown -R ftpuser:ftpuser /data/ftp chmod 755 /data/ftp chmod 755 /data/ftp/upload
注意-s /sbin/nologin这个参数,它禁止该用户通过SSH登录服务器,只能走FTP通道,即使账号密码泄露,攻击者也无法拿到shell,安全等级提升不少。权限方面,建议主目录保持755、不要给777,目录权限给到777时,部分vsftpd配置会直接判定为不安全而拒绝访问,这也是新手常遇到的OOPS报错来源之一。
接下来是防火墙,这一步漏掉的话客户端会一直卡在连接超时。除了放行20、21端口,还要处理被动模式的端口范围。先在vsftpd.conf末尾追加:
# 指定被动模式的端口范围,方便防火墙统一放行 pasv_min_port=40000 pasv_max_port=40010
然后放行防火墙。CentOS 7以上使用firewalld的写法如下:
# 放行FTP服务 firewall-cmd --permanent --add-service=ftp # 放行被动模式端口段 firewall-cmd --permanent --add-port=40000-40010/tcp # 重新加载规则 firewall-cmd --reload
另外别忘了云服务器的安全组规则。阿里云、腾讯云等厂商的控制台里都有安全组设置,需要在入方向放行21端口和40000到40010端口段。很多人在系统防火墙里折腾半天,结果发现是安全组没开,白白浪费大量时间,这一点务必优先检查。
第三步:Windows端连接上传的三种方式
第一种最简单,直接用Windows自带的资源管理器。打开文件资源管理器,在地址栏输入ftp://服务器公网IP回车,输入用户名密码后就能看到服务器上的目录,文件可以直接拖拽进去。这种方式胜在零安装,但缺点也明显:不支持断点续传、传输大文件容易中断、出错提示含糊,只适合临时传几个小文件。
第二种是命令行方式,在cmd或PowerShell中执行ftp 服务器IP,然后用user命令登录,put 本地文件路径 远程路径上传,get下载。比如本地文件在D盘的软存放目录,写成put D:\soft\nginx.rpm /upload/nginx.rpm即可。命令行适合写脚本做自动化定时上传,但交互体验一般,路径中有空格时还要额外加引号处理。
第三种推荐使用FileZilla这类专业客户端。下载安装后,在顶部依次填入主机IP、用户名、密码、端口21,点击快速连接。左侧是本地目录,右侧是服务器目录,选中文件右键上传即可。FileZilla支持断点续传、多线程、站点管理和传输队列,批量传几百个文件也很稳定。如果连接时卡在列目录阶段,多半是被动模式端口没放行,可以在站点管理器中把传输模式改成主动模式试一下,以此判断问题出在哪一侧。
常见报错排查要点
连接阶段报530 Login incorrect,先检查用户名密码是否输错,再看/etc/vsftpd/ftpusers文件里是否包含当前用户,该文件中列出的用户一律禁止登录。报500 OOPS多半是上面提到的chroot写权限问题或目录权限给得过大。能登录但看不到文件列表、或传输卡住不动,基本是被动模式和防火墙的问题,按照前面说的固定pasv端口范围并放行,一般都能解决。
还有一个细节容易被忽略:SELinux。CentOS系统默认开启SELinux时,会拦截FTP对家目录的访问,执行setsebool -P ftpd_full_access on可以放行FTP的完整读写权限,不想改策略的话也可以临时用setenforce 0验证问题是否出在SELinux上。所有环节都配置妥当后,建议先用一个小文件走通全流程,再进行大批量传输,这样出问题时定位范围会小很多。