前言
本文仅说明如何在linux服务器上搭建FTP服务器。
成稿日期:2024-04-13
本文参考以下文章
Windows系统中搭建FTP站点_轻量应用服务器(SAS)-阿里云帮助中心
vsftpd虚拟用户和本地用户不能共存 - linux—jock - 博客园
Linux操作系统版本:CentOS 7
简介
FTP服务器是一种用于文件传输的服务器,其中FTP代表文件传输协议(File Transfer Protocol)。它允许用户在本地计算机和远程服务器之间传输文件。通过FTP服务器,用户可以上传、下载、删除和管理文件,通常用于网站托管、文件共享以及远程文件备份等用途。FTP服务器通常需要用户名和密码进行访问,以确保文件传输的安全性。
如果你有以下需求,那么FTP服务器可以满足:
假如现在你有一个团队,有多个不同的队员,每一个队员都需要将数据传输给你(并不是通过社交软件,而是暴露出一个服务器给他们用于上传文件),但是如果直接把服务暴露给他们那么他们都拥有对其他成员文件修改、删除的权力,这样文件的安全无法保证,甚至还可能危及服务器(如果修改某些敏感配置)。
而FTP服务器可以设置虚拟用户,每一个虚拟用户只有你配置的工作目录的权限,比如工作目录是…/vuser1,那么这个用户就只可以在这个目录下创建、修改、删除文件夹,甚至可以限制用户的读写权限等等,总而言之,如果你需要对服务器文件系统进行更安全的限制,那么FTP服务器可以解决。
FTP(File Transfer Protocol)是一种文件传输协议,基于客户端/服务器架构,支持以下两种工作模式:
- 主动模式(PORT):客户端向FTP服务器发送端口信息,由服务器主动连接该端口。
- 被动模式(PASV):FTP服务器开启并发送端口信息给客户端,由客户端连接该端口,服务器被动接受连接。
FTP支持以下三种认证模式:
- 匿名用户模式:任何人无需密码验证就可以直接登录FTP服务器。该模式不安全,一般只用来传输不重要的公开文件,不推荐在生产环境中使用。
- 本地用户模式:通过Linux系统本地用户验证登录权限,相较于匿名用户模式更安全。
- 虚拟用户模式:通过虚拟用户验证登录权限,虚拟用户只能访问Linux系统为其提供的FTP服务,而不能访问Linux系统的其他资源。该模式相较于其他两种模式更加安全。
搭建FTP服务器
准备工作
- 在本地主机上,下载并安装FileZilla。
具体下载地址,请参见FileZilla下载中心。只需要下载客户端即可。
启动客户端之后的页面
安装与配置vsftpd
vsftpd(very secure FTP daemon)是Linux操作系统下的一款小巧轻快、安全易用的FTP服务器软件。
1、执行以下命令,查看轻量服务器是否已安装vsftpd。
vsftpd -v
如果显示以下信息就是已经安装。
2、运行以下命令,安装vsftpd,已经安装无需再次安装
sudo yum install -y vsftpd
出现如下图所示信息,表示vsftpd安装成功。
3、运行以下命令,设置FTP服务开机自启动
sudo systemctl enable vsftpd.service
4、运行以下命令,启动FTP服务
sudo systemctl start vsftpd.service
说明
如果出现无法启动FTP,且提示错误信息Job for vsftpd.service failed because the control process exited with error code,请排查是否存在21端口被占用问题。
- 使用lsof -i:21命令,查看是否存在进程。
- 如果存在进程,使用kill -9 <进程号>命令,杀掉进程。
5、运行以下命令,查看FTP服务的端口号
sudo netstat -antup | grep ftp
如下图表示FTP已经启动
配置FTP访问模式(本地用户模式)
1、运行以下命令为FTP服务创建一个Linux用户。本示例中,该用户名为ftpadmin
sudo adduser ftpadmin
2、运行以下命令修改ftptest用户的密码
sudo passwd ftpadmin
运行命令后,根据命令行提示完成FTP用户的密码修改。
注意:linux 的密码不会显示出来,也就是linux系统中输入密码不会显示字符或者*
3、运行以下命令创建一个供FTP服务使用的文件目录
sudo mkdir /var/ftp/admin
4、运行以下命令更改/var/ftp/test目录的拥有者为ftpadmin
sudo chown -R ftpadmin:ftpadmin/var/ftp/admin
5、修改vsftpd.conf配置文件
1、运行以下命令,修改配置文件/etc/vsftpd/vsftpd.conf
如果您在安装vsftpd时,使用的是apt install vsftpd安装命令,则配置文件路径为/etc/vsftpd.conf。
sudo vim /etc/vsftpd/vsftpd.conf
2、按i进入编辑模式
3、修改下列参数的值
#禁止匿名登录FTP服务器。
anonymous_enable=NO
#允许本地用户登录FTP服务器。
local_enable=YES
#监听IPv4 sockets。
listen=YES
在行首添加#注释掉以下参数,关闭监听IPv6 sockets:
#listen_ipv6=YES
在配置文件的末尾添加下列参数,其中pasv_address参数需要替换为轻量应用服务器的公网IP地址:
注意设置被动模式开放的端口需要防火墙放行
#设置本地用户登录后所在目录。
local_root=/var/ftp/admin
#全部用户被限制在主目录。
chroot_local_user=YES
#启用例外用户名单。
chroot_list_enable=YES
#指定例外用户列表文件,列表中用户不被锁定在主目录。
chroot_list_file=/etc/vsftpd/chroot_list
#开启被动模式。如果需要使用被动模式开启 主动模式不用管
#pasv_enable=YES
allow_writeable_chroot=YES
#本示例中为轻量应用服务器的公网IP地址。
pasv_address=xx.xx.xx.xx
#设置被动模式下,建立数据传输可使用的端口范围的最小值。
#建议您把端口范围设置在一段比较高的范围内,例如50000~50010,有助于提高访问FTP服务器的安全性。
pasv_min_port=50000
#设置被动模式下,建立数据传输可使用的端口范围的最大值。
pasv_max_port=50010
6、按Esc退出编辑模式,然后输入:wq并回车,保存退出文件
7、创建chroot_list文件,并在文件中写入例外用户名单
1、运行以下命令,创建chroot_list文件
sudo vim /etc/vsftpd/chroot_list
2、输入例外用户名单。此名单中的用户不会被锁定在主目录,可以访问其他目录
注意:这个名单内的用户不会被限制在其工作目录下,请谨慎设置,一般如果你不希望用户可以访问其他用户的文件不要将其用户名写在这个文件中。
注意:没有例外用户时,也必须创建chroot_list文件,内容可为空。
8、运行以下命令,关闭防火墙(生产环境不建议执行)
sudo systemctl stop firewalld
如果不关闭防火墙就需要放行端口号(请自行百度)
9、修改配置文件
1、运行以下命令,打开/etc/ssh/sshd_config文件
sudo vi /etc/ssh/sshd_config
2、在文件尾行将PasswordAuthentication的值改为yes(好像默认就是yes)
10、运行以下命令,重启FTP服务
sudo systemctl restart vsftpd.service
配置Linux防火墙
测试FTP连接
登录类型中,如果开启了匿名访问就可以使用匿名,如果是本地用户或者虚拟用户就使用正常或者询问密码方式。
正常输入密码之后如果效果如下图:则登录成功
如果出现登录了但是无法正常上传、下载,那么先检查一下文件的所属人有没有输错
配置FTP访问模式(虚拟用户模式)
1、建立虚拟用户的宿主用户
虚拟用户并不是系统用户,也就是说这些FTP的用户在系统中是不存在的。他们的总体权限其实是集中映射在一个系统用户身上,所谓vsftpd的[虚拟宿主用户],就是这样一个支持着所有虚拟用户的宿主用户。执行以下命令将虚拟用户映射在virtusers这个用户上。
useradd -d /data/ftproot virtusers -s /sbin/nologin
说明:-d指定家目录,这里指定之前的ftp根目录 /data/ftproot 。 -s指定系统用户登录的shell,nologin即不允许系统login登录。
2、建立FTP相关工作目录
建立FTP相关工作目录,以及权限管理。 最新版vsftpd不允许用户主目录有w权限,因此在主目录下新建一个子目录。所有上传、下载、删除、重命名等操作只能在子目录中进行,虚拟用户vuser1的ftp目录是/data/ftproot/vuser1/,没有w权限,设置权限为500。
3、执行以下命令创建目录
mkdir -p /data/ftproot/vuser1
4、执行以下命令进行权限设置
chown -R virtusers.virtusers /data/ftproot
chmod 500 /data/ftproot/vuser1
5、执行以下命令生成虚拟用户列表
vi /etc/vsftpd/vuserlist
虚拟用户列表的内容
vuser1
123456
说明:奇数行是用户名,偶数行是用户密码。
6、用系统的db_load工具来生成db文件,出于安全角度修改vuserlist.db为600权限
db_load -T -t hash -f /etc/vsftpd/vuserlist /etc/vsftpd/vuserlist.db
chmod 600 /etc/vsftpd/vuserlist.db
7、修改PAM验证。 修改/etc/pam.d/vsftpd,这个文件名与/etc/vsftpd.conf中的pam_service_name=vsftpd相对应。注释掉所有参数,在最后面加入以下两行内容
auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/vuserlist
account required /lib64/security/pam_userdb.so db=/etc/vsftpd/vuserlist
注意:如果你想要虚拟用户模式与本地用户模式同时生效,那么按照下面的配置进行修改
这个是完整的配置
#%PAM-1.0
auth sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/vuserlist
account sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/vuserlist
session optional pam_keyinit.so force revoke
auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
auth required pam_shells.so
auth include password-auth
account include password-auth
session required pam_loginuid.so
session include password-auth
一定要将 虚拟用户的配置放在前面!!!并且 将required 改成 sufficient!!!
sufficient相当于充分条件,当登录的时候满足了前面两条(虚拟用户)就不会进行后面本地用户的登录认证,相反如果是本地用户登录就会先进行前面的验证,不通过就进行后面的验证。这样本地用户和虚拟用户就都可以登录了。
8、创建及配置虚拟用户的配置文件
创建虚拟用户配置文件
mkdir /etc/vsftpd/vuser_conf/
配置虚拟用户的配置文件
vi /etc/vsftpd/vuser_conf/vuser1
添加以下配置信息
local_root=/data/ftproot/vuser1
anon_upload_enable=YES
anon_world_readable_only=NO
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
9、配置VSFTP的/etc/vsftpd/vsftpd.conf主配置文件
如果以下配置项在上面已经配置过无需重复配置,按需开启!
listen=YES #开启IPv4监听
listen_ipv6=NO #关闭IPV6监听
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
pam_service_name=vsftpd #如果前面/etc/pam.d/vsftpd没有改文件名,就不修改
virtual_use_local_privs=YES #虚拟用户使用本地用户的权限
guest_enable=YES #开启虚拟用户
guest_username=virtusers #指定虚拟用户的宿主用户user_config_dir=/etc/vsftpd/vuser_conf #指定虚拟用户配置文件
pasv_enable=YES #开启被动模式
pasv_min_port=30100 #被动模式最小端口,本示例设置为30100
pasv_max_port=30200 #被动模式最大端口,本示例设置为30200
pasv_address=X.X.X.X #被动模式的IP地址,VPC环境下需要设置为服务器公网地址
10、记得创建文件/etc/vsftpd/chroot_list,并且在文件中添加ftp用户,否则连接ftp会报错
touch /etc/vsftpd/chroot_list
修改文件,文件中添加ftp用户,本文档示例中的ftp用户是vuser1(非必要不要将用户加入这个文件中,在这个文件中的用户不会被限制在之前设置好的用户目录下,也就是用户可以修改不属于他的文件)
vim /etc/vsftpd/chroot_list
添加的用户列表内容
vuser1
11、增加虚拟用户
1、在之前的虚拟用户列表中添加虚拟用户
vi /etc/vsftpd/vuserlist
testUser
Ty9oIN@ke@g
注意:奇数行是用户名 偶数行是密码
2、在虚拟用户配置文件夹之下再创建一个该用户的配置文件并写入配置
vi /etc/vsftpd/vuser_conf/testUser
配置内容
local_root=/data/ftproot/testUser
anon_upload_enable=YES
anon_world_readable_only=NO
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
3、创建用户工作目录
mkdir -p /data/ftproot/用户目录名
4、设置权限
chmod 775 目录名
5、重启服务
# 重启服务
sudo systemctl restart vsftpd.service
# 查看状态
sudo systemctl status vsftpd.service
写在最后
1、如果通过代码上传/下载文件连接成功,但是出现异常connect timed out
做以下排查:
- 防火墙已经关闭,或者21端口已经放行,如果是被动模式需要放行在vsftpd.conf文件中指定的被动模式端口号
- 用户具有该文件夹下的写权限,可以在ftp客户端尝试上传和下载文件
- 尝试增加连接超时时间
- 如果ftp服务器是主动模式,需要在上传之前设置ftpClient的模式为主动模式,也可以设置ftp服务器为被动模式(此方法亲测有效!!!)