Linux ftp服务器部署(最简单的ftp教程)
之前在阿里云领了一个ECS服务器(顺便说一句,白嫖的🤣,真香~),就想着做点什么,然后试着做个 ftp 站点,因为第一次尝试,结果走了不少弯路。最后终于完成了,研究了两天(哎~,😭脑壳笨没办法)就想着记录下来,于是有了这篇博客,按照下面的步骤操作,快速部署好你的 ftp 站点。
配置 ftp 站点步骤:
1. 安装 vsftpd 服务
2. 配置 vsftpd.conf 文件
3.虚拟用户
4. 开放端口规则
5. 重启 vsftpd 服务
配置文件测试可用,可以直接复制 vsftpd.conf 的内容。整个部署稍稍复杂点的是配置虚拟用户的步骤,除此之外,其他没什么难度。部署好ftp 之后,手机、Windows、Linux之间再无隔阂,文件互传啥轻松的不要不要的。废话不多说,下面让我们开始教程:
ps:按照我的教程部署,如果无法访问ftp,可能时由于 防火墙 或者 selinux 的原因。因为我的服务器默认没有开启防火墙和selinux,所以省下了许多麻烦。😋😋😋,可以尝试关闭防火墙和selinux再尝试。
这里测试的服务器用的阿里的Linux centos 7 系统。
1、安装 vsftpd
1.1 安装 vsftpd
yum install vsftpd -y
-y 参数表示全部默认 yes,不用手动确认。
1.2 启动 vsftpd 并设置为开机自启
systemctl start vsftpd # 开启vsftpd服务,或者用 service vsftpd start 命令
systemctl enable vsftpd # 设置为开机自启动
检查是否成功设置为开机自启(这一步无所谓)
systemctl list-unit-files | grep vsftpd # systemctl list-unit-files 用于列出所有配置文件
# 输出 enable 表示开机自启
vsftpd.service enabled
# 另外,chkconfig --list 命令也可以查看开机自启信息
# chkconfig 命令用于检查,设置系统的各种服务
#chkconfig --add vsfptd # --add 增加所指定的系统服务,让chkconfig指令得以管理它
chkconfig vsftpd on # 设置自动启动 vsftpd
chkconfig --list vsftpd # 列出chkconfig --list所知道的所有的服务的情况
# 输出 1—6为系统运行级别:0 关机 1 单用户 2 无网络多用户 3 有网络多用户 4 保留(不可用) 5 图形界面多用户(stratx) 6 重启 ,可以通过 init 5(0/1/2/3/4/5/6) 命令切换
# 2 3 5 为可工作的状态,都为on则表示在该系统运行级别下会自启
vsftpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
2、配置 vsftpd 文件
基础知识
本来想写个傻瓜式教程的,结果BB的太多。说了是傻瓜教程就不涉及太多内容,但基础的知识还是要知道一点的。
ftp 有两种模式,分别是主动模式,和被动模式。ftp 占用两个端口,21端口用于连接,20端口用于传输数据。
- 主动模式:客户端告诉服务器自己监听的端口(随机端口>1024),从而服务器主动连接客户端。连接成功后(用户登录成功),客户端的随机端口 与 服务器的20端口 传输数据。
- 被动模式:客户端告诉服务器自己处于被动模式,服务器告诉客户端自己正在监听的端口(随机端口>1024),从而客户端去连接服务端。
正如这两种模式的名字一样,主动模式就是服务器主动去连接客户端,被动模式就是客户端被动的连接服务端。由于我的服务器是在同一个 ip 下多台服务器共享的,让服务器找客户端不太方便,这里我用的是被动模式。
在安装好 vsftpd 后,会有 一个 /etc/vsftpd 目录,在此目录中都是与 vsftpd 配置有关的。
——图片为 /etc/vsftpd/ 目录下的文件
/etc/vsftpd/ 目录下相关文件 | 简介 |
---|---|
/etc/vsftpd/vsftpd.conf | 主配置文件:配置匿名用用户,本地用户,连接方式等 |
/etc/pam.d/vsftpd | PAM认证文件,在设置虚拟用户时会用到 |
/usr/sbin/vsftpd | vsftpd 程序 |
/etc/vsftpd/ftpusers | 用户黑名单,只是用户黑名单,不受任何参数限制 |
/etc/vsftpd/user_list | 用户名单,根据具体设置决定是黑名单还是白名单 |
/var/ftp | 匿名用户主目录,不是绝对,比如本教程中把匿名用户设置在了 /srv/ftp/anyone/ |
chroot_list | 自建用户名单,根据具体设置决定是白名单还是黑名单,在本教程中用作允许用户向上切换目录的用户名单 |
loguser.txt | 自建的虚拟用户用户名与密码文件,通过 db4 工具加密为数据库后使用 |
vsftpd_login.db | 自建的用户名与密码数据库,由loguser.txt 加密而来 |
vsftp_user.conf | 自建的虚拟用户配置文件家目录,在该目录下以用户名命名的文件为该用户的配置文件 |
注:表中标有自建的均需要在 /etc/vsftpd/vsftpd.conf
主配置文件中指定。
配置后效果:
匿名用户:下载功能 根目录:/srv/ftp/anyone
本地用户:拥有创建、删除、上传、下载功能 根目录:/srv/ftp
虚拟用户:拥有上传、下载功能 (管理员拥有删除功能) 根目录:/srv/ftp/myftp
匿名用户只可访问特定的目录,仅有下载的功能。
本地用户可以访问 /srv/ftp 下所有目录,并且具有所有权限(上传、下载、修改、删除等)
虚拟用户可以上传,但是不可以修改文件(管理员可以)
2.1、全局基本配置
vsftpd 的配置文件用 “#” 注释,并且一定要注意,不要有多余的空格。修改前记得备份。
/etc/vsftpd/vsftpd.conf 文件
# ************* 全局配置 ********************************************
# 是否允许监听。
# 如果设置为YES,则vsftpd将以独立模式运行,由vsftpd自己监听和处理IPv4端口的连接请求
listen=YES
# 监听 ipv6 注释掉,或者设置为 NO
#listen_ipv6=NO
# * 日志有关 *
# 当用户进入某个目录时,会显示该目录需要注意的内容,显示的档案默认是 `.message` ,你可以使用message_file=.message 设置来修改。
dirmessage_enable=YES
# 默认情况该日志文件为/var/log/vsftpd.log,也可以通过下面的xferlog_file选项对其进行设定
xferlog_enable=YES
# 启用xferlog默认保存路径 xferlog_file=/var/log/xferlog
xferlog_std_format=YES
# 启用双份日志。在用xferlog文件记录服务器上传下载情况的同时, # vsftpd_log_file所指定的文件,即/var/log/vsftpd.log也将用来记录服务器的传输情况
#dual_log_enable=YES
#vsftpd_log_file=/var/log/vsftpd.log
# * 连接有关 *
# 可以更改默认值以超时空闲会话
#idle_session_timeout=600
# 可以更改数据连接超时的默认值
#data_connection_timeout=120
# 启用此功能服务器能够识别异步ABOR请求
#async_abor_enable=YES
# linux中一个安全机制[TCP_wrappers防火墙],一定程度上限制某种服务的访问权限,达到了保护系统的目的
tcp_wrappers=YES
# * 传输有关 *
# 确保PORT传输连接来自端口20
connect_from_port_20=YES
#大多数FTP服务器都选择用ASCII方式传输数据,实现用ASCII方式上传和下载文件
#允许上传
ascii_upload_enable=YES
#允许下载,ascii模式
ascii_download_enable=YES
#只允许访问自身目录
allow_writeable_chroot=YES
# * 重要设置 *
#开启被动模式
pasv_enable=YES
# Linux 云服务器公网 IP
pasv_address=xx.xx.xx.xxx
#允许最小端口分配PASV方式数据连接。你可以定义一个端口范围允许通过防火墙
pasv_min_port=40000
#允许最大端口分配PASV方式数据连接。你可以定义一个窄的端口范围允许通过防火墙
pasv_max_port=50000
# 注意;记得开启服务器的端口,21端口和min_port/max_port端口
# min_port/max_port可以参考这篇博客,也可以自己设置,比如 5000~6000也是可以的
# 附加内容,可以适当了解
# ftpusers和user_list 详解
# ftpusers不受任何配制项的影响,它总是有效,它是一个黑名单,
# user_list:
# 1、userlist_enable和userlist_deny两个选项联合起来针对的是:本地全体用户(除去ftpusers中的用户)
# 和出现在user_list文件中的用户以及不在在user_list文件中的用户这三类用户集合进行的设置
# 2、当且仅当userlist_enable=YES时:userlist_deny项的配置才有效,user_list文件才会被使用
# 当其为NO时,无论userlist_deny项为何值都是无效的,本地全体用户(除去ftpusers中的用户)都可以登入FTP
# 3、当userlist_enable=YES时,userlist_deny=YES时:user_list是一个黑名单,即:所有出现在名单中的用户都会被拒绝登入;
# 4、当userlist_enable=YES时,userlist_deny=NO时:user_list是一个白名单,即:只有出现在名单中的用户才会被准许登入(user_list之外的用户都被拒绝登入);
# 注意:使用白名单后,匿名用户将无法登入!除非显式在user_list中加入一行:anonymous
userlist_enable=YES
上述为基本配置,经过本博主测试可用的。可以直接复制使用。此外,以上只是基础配置,在该文件中还应加入匿名用户或本地用户的相关配置。
2.2、匿名用户配置
在上述配置文件的末尾添加上如下配置即可。当然,如果不想让匿名用户登录的话,只需要一句 anonymous_enable=NO
即可。
/etc/vsftpd/vsftpd.conf 文件
# ************* 匿名用户 ********************************************
# 允许匿名用户登录
anonymous_enable=YES
# 匿名用户login时不询问口令
no_anon_password=YES
# 匿名用户主目录 ***设置匿名用户主目录,根据个人意愿自行调整**
anon_root=/srv/ftp/anyone
# 匿名用户可以上传文件 ****上传文件 NO
anon_upload_enable=NO
# 匿名用户可以建目录,同时在此目录下上传文件
anon_mkdir_write_enable=NO
#匿名用户修改删除 ****修改、删除
anon_other_write_enable=NO
#匿名上传文件所属用户名 ****每个文件需要一个属主,该用户名必须是服务器下真实存在的用户
#chown_username=usr #因为不允许上传,所以不用设置,如果允许上传可指定一个用户
# 要注意文件夹的属性,匿名帐户是其它(other)用户,要检查匿名用户登录的目录是否有读写权限
# 并且vsftpd的安全规则是不允许ftp用户对ftp根目录有可写权限,在本列中 /srv/ftp/anyone 的其他人权限需要为5(rx)
# 默认情况下,匿名用户所有上传下载,所使用的用户都是ftp用户的权限
# 若要上传文件,则需要ftp用户有写的权限,若要下载,则需要ftp用户有读的权限
# 一般情况下,ftp用户对文件有读权限就对文件有下载权限了
anon_world_readable_only=NO
#文件有三种权限,文件所有人,文件所有组,文件的其他人
#当他为YES时候,文件的其他人必须有读的权限才允许下载,单单所有人为ftp且有读权限是无法下载的,
# 必须其他人也有读权限,才允许下载,这是为安全性的一方面考虑
#若为NO则只要ftp用户对文件有读权限即可下载
补充:目录的权限与文件的权限理解起来有些不同
目录只有读权限:可以ls 查看目录内容,不能进入,不能在其下创建子目录和文件
目录只有执行权限:不能ls 查看目录内容,可以进入目录(进入后可以用ls查看),不能在其下创建子目录和文件
目录只有写权限:啥都不可以干(因为目录对外不可见,且又不能进入,则无法提供写的权限)
以上三种基本权限功能,如果想实现类似 touch /test/1.txt
这种功能就需要目录同时拥有写和执行权限。
vsftpd的安全规则是不允许ftp用户对ftp根目录有可写权限。
在如下的目录文件结构中:
/srv/ftp/anyone 该目录为匿名用户的根目录,其他人权限为 rx
|__test 目录:其他人权限为 r
|__anyone 文件:无实际作用,文件名表示当前处于 anyone 目录下
因此,如果匿名用户登录(成功访问ftp站点),却无法进入某个文件,那么有可能是该目录没有给出执行权限(如下图所示)。只需要在服务器上给其他人添加上执行权限即可chmod o+x test
。
2.3、本地用户配置
本地用户,即服务器的正常登录用户,或者说可以用 SSH 远程连接的用户。本地用户一般不怎么使用,因为你都可以登录服务器了,可以直接使用 scp、sftp等等的基于ssh的文件传输协议传输干嘛还要特地去访问ftp下载文件。并且由于本地用户可以登录服务器不方便给别人使用,一旦让其他人得到你的本地用户账号他就得到你的服务器了(😨😰)。以下是本地用户得配置。
# ************* 本地用户 ********************************************
#允许本地用户访问
local_enable=YES
#允许本地用户对FTP服务器文件具有写权限,本地帐户登陆后有权删除和修改文件
write_enable=YES
#本地用户上传的文件权限,掩码,777-022=755
local_umask=022
#本地用户根目录路径
local_root=/srv/ftp
#用户不能访问上层目录,全部用户被限制在主目录
chroot_local_user=YES
#是否启动限制用户的名单,
chroot_list_enable=YES
#指定列外用户列表文件,列表中的用户不被锁定在主目录
#是否限制在主目录下的用户名单,至于是限制名单还是排除名单,这取决于chroot_local_user的值
chroot_list_file=/etc/vsftpd/chroot_list
本地用户登录验证文件为 /etc/pam.d/vsftpd
如果设置本地用户登录需要添加:
pam_service_name=vsftpd
3、虚拟用户配置
因为本地用户不安全,匿名用户也不安全,所以我们就设置一个虚拟用户吧。该用户是虚拟出的一个用户,所以不能用来登录服务器,但是可以登录ftp站点下载和上传文件。
配置虚拟用户登录需要有一个条件和三种文件:
一个条件:在 vsftpd.conf 主配置文件中 guest_enable=YES
开启虚拟用户(并指定配置文件目录)
三种文件:
- pam认证文件:PAM使用配置/etc/pam.d/下的文件,来管理对程序的认证方式
- 虚拟用户的用户账户的数据库文件:通过一个写有用户名和密码的普通文件加密得到
- 各用户(虚拟用户)自己的配置文件:各用户在 虚拟用户的配置文件 的家目录下有一份各自的权限配置文件
通过在在主配置文件中开启虚拟用户登录,在登录时验证预先设定的用户名和密码,实现虚拟用户的登录。以及通过各虚拟用户的配置文件来管理虚拟用户的权限。
3.1 创建虚拟用户名单
虚拟用户名单设置,主要有以下步骤:
3.1.1添加虚拟用户名单
- 创建 loguser.txt (文件名随意),在文件内奇数行写入虚拟用户名,偶数行写入密码
- 如 1:admin 2:123456 3:usr 4:123456 (1:代表第一行,同理2:……)
3.1.2把用户名单生成数据库文件
db4.8_load -T -t hash -f /etc/vsftpd/loguser.txt /etc/vsftpd/vsftpd_login.db
# db_load加密命令 -t 加密方式 -f 指定明文文件 生成密文文件格式为.db
3.1.3修改认证文件 /etc/pam.d/vsftpd
这里可以在原文件的基础上修改,也可以新建一个文件。我选择……当然是全都要了。
事实上:下面的登录文件在二选一即可。
# 以下二者选其一
vsftpd.vu # 虚拟用户与本地用户不共存,只验证虚拟用户
vsftpd # 虚拟用户与本地用户共存,都可以登录
1》新建 vim /etc/pam.d/vsftpd.vu 用作虚拟用户验证
写入以下两行内容:
# 注释不要写
# pam_userdb.so= 后面跟着你的登录数据库文件,不写后缀
account required pam_userdb.so db=/etc/vsftpd/vsftpd_login
auth required pam_userdb.so db=/etc/vsftpd/vsftpd_login
2》原文件 vim /etc/pam.d/vsftpd:
在 /etc/pam.d/vsftpd 中已经有一些内容了,不要动它们,在第二行写下两行内容
注意区别,将配置虚拟用户添加两行中的required改为sufficient
#%PAM-1.0
auth sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login
account sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login
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
上述两个文件的作用简单来说一下:
如果使用第一个文件,即需要在 vsftpd.conf 主配置文件中写上 pam_service_name=vsftpd.vu
此时,不管主配置文件是否允许本地用户登录,本地用户都无法登录。
而,第二个文件,使用pam_service_name=vsftpd
可同时让本地用户和虚拟用户登录。
准备工作已经做完,事实上 loguser.txt 已经没有用了,可以删掉。
3.2 在vsftpd.conf 中配置虚拟用户
因为虚拟用户没有实体,所以需要给虚拟用户指定一个本地用户实体(将虚拟用户映射到指定的系统账号),在这里我指定为usr用户guest_username=usr
。
另外,根据在 vsftpd.conf 的配置指定一个目录放置虚拟用户的权限配置文件 user_config_dir=/etc/vsftpd/vsftpd_user_conf
。
具体设置如下:
# ************* 虚拟用户 ********************************************
#开启虚拟用户的功能
guest_enable=YES
#指定虚拟用户的宿主用户
guest_username=usr
#加载pam哪个模块,我设置的加密认证是/etc/pam.d/vsftpd.vu sufficient
pam_service_name=vsftpd
# 仅使用虚拟用户和匿名用户,取消本地用户验证
#pam_service_name=vsftpd.vu
#指定虚拟用户权限配置文件目录
user_config_dir=/etc/vsftpd/vsftpd_user_conf
#vsftpd的服务日志保存路径,默认不存在
xferlog_file=/var/log/vsftpd.log
3.3 配置虚拟用户权限
在 /etc/vsftpd/ 下传创建目录 mkdir vsftpd_user_conf
,进入该目录,创建以虚拟用户名为文件名的文件,写入以下配置。
注意:有几个虚拟用户就配置几个文件,如本例中,主要有 usr、admin 两个文件。
write_enable=YES
#他为YES时候,文件的其他人必须有读的权限才允许下载
anon_world_readable_only=NO
# 上传权限
anon_upload_enable=YES
# 新建目录权限
anon_mkdir_write_enable=YES
# 修改目录及文件的权限 ---usr设置为NO不允许更改文件,admin设置为YES可以更改文件
anon_other_write_enable=YES
该用户的根目录 ---可以随意设置位置
local_root=/srv/ftp
端口设置
登录阿里云(我用的是阿里云的ECS服务器😏),点击你要配置的实例服务器,找到本实例安全组,点击配置规则
开放规则,检查防火墙等是否设置好。
5、重启服务器并简单测试
重启 ftp 服务器:
systemctl restart vsftpd
登录测试:
打开 Windows 自带的文件管理器,输入 ftp://xxx.xxx.xxx.xxx 回车
此时进入的是匿名用户
右键-》登录 输入用户名和密码 登录相应的账号
经测试,功能满足要求(偷个懒就不放截图了😂😂),以上就是配置 ftp 服务器全过程。
补一张手机端(安卓)ES文件浏览器的效果图
推荐客户端:
windows 客户端 :文件管理器或者浏览器,专业一点的有WinSCP、MobaXterm等。
安卓客户端:ES文件浏览器、x-plore、mt 文件管理器