相信不少朋友都有这样的需求:在一台陌生的主机上,快捷地上传自己的文件。尤其是在电脑系统重启即重置的实验室机房中,使用FTP服务器就是不错的选择之一(推荐另外两种不错的方式是微信的web版文件助手和U盘)。
FTP服务器的搭建是个老生常谈的话题,但是自己在搭建的过程中还是发现了很多容易被忽略的细节,就单纯的从学习和使用的角度,以这些细节为重点再现一下搭建的过程和注意事项。
一、系统环境
FTP服务器端:腾讯云服务器Ubuntu Server 22.04 LTS(CentOS等其他Linux仍然可以参考)
客户端:Windows系统/Linux系统
二、搭建步骤
安装vsftpd
vsftpd(very secure FTP daemon)是Linux操作系统下的一款小巧轻快、安全易用的FTP服务器软件。
首先,我们在Linux系统中下载vsftpd工具。
sudo apt install vsftpd
检查vsftpd的运行状态,你可以使用systemctl
或者service
来管理vsftpd服务。查看运行状况:
systemctl status vsftpd
你可以从显示的信息中查看到vsftpd的默认配置文件的存放位置,比如下图的/etc/vsftpd.conf
,当然大部分情况下更可能存放于/etc/vsftpd/vsftpd.conf
。
创建FTP用户
FTP用户可以分为匿名用户,本地用户和虚拟用户,FTP关于用户权限的配置项有很多,你可以在后面的配置文件里面做非常详细的设置。
首先创建一个用于ftp登录的用户(普通本地用户),并指定用户的目录和用户名ftpadmin
,修改密码:
sudo useradd -d /home/ftp/ftp_root -m ftpadmin
sudo passwd ftpadmin
修改用户目录的权限为777:
chmod -R 777 /home/ftp/ftp_root/
这里简单的说明一下,我们为ftp用户设置了一个存放上传文件的目录/home/ftp/ftp_root
,它的父目录的所属者是root用户,权限是755。
补充一个删除用户命令:
sudo userdel xxxx
不要忘记删除用户目录。
设置chroot_list
chroot实际上是一种容器技术,chroot的目的是将应用程序运行所需的文件系统的根目录限制在指定的目录下面,即把用户访问的指定位置设置为
/
,而不能访问原有文件系统的上层其他目录,是对系统隐私的保护。
理论上你可以把这个文件起成任何名字,如果你的vsftpd.conf
文件是在/etc/vsftpd/
下面,而不是像我的一样直接在/etc/
目录下,我建议你执行:
sudo vim /etc/vsftpd/vsftpd.chroot_list
写入你的ftp用户名ftpadmin
。
chroot_list的具体使用可以参考下面的板块。
修改vsftpd配置文件
修改你的vsftpd.conf
文件。修改之前,不妨读一读相关配置上面的注释。
如果你需要配置文件的详细解释,可以参考这篇文章。我在这里贴出我的配置,供参考,顺序是从上往下的,有些参数是默认配置好的,有些是需要你手动添加的:
listen=NO
listen_ipv6=YES
anonymous_enable=NO
#我关闭了匿名用户,我们的配置文件也不包含匿名用户相关的设置
local_enable=YES
write_enable=YES
local_umask=022
#umask决定目录和文件被创建时得到的初始权限
#umask = 022 时,新建的目录 权限是755,文件的权限是 644
#umask = 077 时,新建的目录 权限是700,文件的权限是 600
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
connect_from_port_20=YES
接下来是关于chroot的配置,注释里面我写了具体用法:
chroot_local_user=NO
#为NO时,列表之外的本地用户不会被chroot限制,即可以访问它们的上层目录和其他目录,如果你把值改为YES,则chroot_list的性质全改变了,list中的用户变为允许访问上层目录的用户。
allow_writeable_chroot=YES #不增加此项,可能导致chroot_list的用户无法执行写操作
chroot_list_enable=YES #启用chroot_list
chroot_list_file=/etc/vsftpd.chroot_list #请填写你的chroot_list的位置
secure_chroot_dir=/var/run/vsftpd/empty #默认配置
#下面是默认设置,不需要修改
pam_service_name=vsftpd
rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
ssl_enable=NO
接下来是我增加的关于FTP服务器被动PASV工作模式的配置:
pasv_enable=YES
pasv_min_port=6000
pasv_max_port=7000
我在配置文件中没有提到“用户禁止登录列表”(userlist和ftpusers)的使用,如果你有更多样的配置需求,可以进一步完善。
防火墙和端口规则
FTP主要有两种工作模式,
主动模式:
命令连接:客户端任意大于1024端口->服务器21端口
数据连接:服务器20端口->客户端任意大于1024端口
被动模式:
命令连接:客户端任意大于1024端口->服务器21端口
数据连接:客户端任意大于1024端口->服务器任意大于1024端口
大部分的FTP客户端主机出于安全考虑,更建议用户在被动模式PASV下访问FTP服务器,所以我们上述也做了被动模式的配置。
如果你使用的服务器是例如腾讯云这种有服务器控制台的,建议在服务器的控制台修改防火墙规则:
- 开放入站TCP端口21
- 开放出站TCP端口20
- 开放入站端口6000-7000(自定义)
如果你使用的服务器是你自己制定过一些规则或者不能通过控制台修改防火墙规则的,你可以使用ufw或者iptables(iptables是默认打开的,ufw往往是默认关闭的,以iptables为例):
iptables -I INPUT -p tcp --dport 6000:7000 -j ACCEPT
iptables -I OUTPUT -p tcp --sport 20 -j ACCEPT
iptables -I INPUT -p tcp --dport 21 -j ACCEPT
三、运行测试
Windows系统作为客户端
使用命令提示符
登录方法:命令行CMD执行,ftp + ip(或者你配置的域名)(+端口)
,端口如果不是21不可以缺省。如,ftp 114.514.514.114
。
Windows系统的ftp.exe程序(命令行)往往不支持主动模式PORT(实际上被动模式也不能工作)。
经常出现的就是能登录,但是无法执行命令的局面。
使用文件资源管理器
登录方法:文件资源管理器支持被动模式,你可以在地址栏输入ftp://114.514.514.114
,如果你把端口修改为非常用端口21,则需要加上端口号。使用域名也可以。
第一次登录会出现提示输入账号密码的窗口,询问是否保存凭证。这样你可以通过界面交互的方式来访问FTP了。
使用其他客户端工具
如Winscp,Xshell,以及市面上的一大堆某某ftp等。
例如,你可以使用Xshell配置FTP连接(XFTP震怒):
Linux系统作为客户端
命令行形式即可,使用常见的SSH登录客户端均支持访问。
仍然是被动模式工作。
四、安全问题
毋庸置疑,在企业级使用中,FTP被无情地淘汰,首先是因为其饱受诟病的明文传输,此外还有难以管理与运维、缺乏审批和详细日志、文件权限不够严格等缺点。
但是在个人日常使用上(尤其是非关键性文件的存储上),我们依然可以使用FTP。如果担忧其安全性,我们可以使用FTP+SSH的配置策略,为其进行加密。你也可以使用XFTP软件来传输文件。
作为一个经常不带U盘的懒人,我在实验室用的很爽。如果你也像我一样,那么…