Linux 服务器 vsftpd 安装与配置

前言

本文,主要以 vsftp 软件为主进行讲解,版本为 3.0.2。以介绍设置虚拟用户、权限验证为主,linux 权限知识默认大家都有所了解。vsftpd 设置有两种模式:主动模式、被动模式。

Linux 网络文件共享。例如 NFS、Sambs、FTP,其中以 FTP 应用最为广泛,成为了当下 linux 文件系统中主流的网络文件共享工具。介绍 FTP 主要有几种常见的工具 vsftp、proftp、wu-ftp、pureftp,各种 FTP 软件无优劣之分,实际工作中选择自己熟悉的一款即可。

正文

一、vsftp 安装

注意:以 Redhat7 系列(或者支持 systemd 环境的 linux 系统)

1、准备安装包

可以到此网站下载各个版本:http://www.rpmfind.net/linux/rpm2html/search.php?query=vsftpd

1
vsftpd-3.0.2-29.el7_9.x86_64.rpm

2、安装

1
rpm -ivh vsftpd-3.0.2-29.el7_9.x86_64.rpm

查询是否安装

1
rpm -qa | grep vsftpd

二、启动与停止

1、设置开启自启

1
systemctl enable vsftpd.service

2、启动 vsftpd 服务

1
systemctl start vsftpd.service

3、查看 vsftpd 服务状态

1
systemctl status vsftpd.service

4、查看 vsftpd 进程

1
2
3
ps -ef | grep vsftpd
#或者
ps -aux | grep vsftpd

三、错误排查

1、通过 Git Bash 验证 ftp 登录

在本机会提示没有 ftp 命令,直接就在远端测试连接。

1
ftp remote_ip

2、排查错误

其实翻译一下就知道了,chroot 配置没有写入的权限。

1
2
OOPS: vsftpd: refusing to run with writable root inside chroot()
Login failed.

3、在 vsftpd.conf 加入如下配置

后续的版本更新了,需要手动加上 allow_writeable_chroot=YES 参数配置

1
allow_writeable_chroot=YES

4、重启 vsftpd 服务(Redhat7 系列)

1
systemctl restart vsftpd.service

四、优化设置

1、设置防火墙规则

关于防火墙的设置,可以参考我的历史文章(在站内搜索 firewalld 与 iptables)

重启测试 vsftpd 上传文件,默认存储路径为该用户的 home 目录下

1
2
#例如
/home/vsftpd/test

如需更改配置,如下设置

1
local_root=/var/ftp/pub

防火墙加入 ftp 服务

1
firewall-cmd --zone=public --add-service=ftp --permanent

主动模式,防火墙开启 20、21 端口

1
2
firewall-cmd --zone=public --add-port=21/tcp --permanent 
firewall-cmd --zone=public --add-port=20/tcp --permanent

设置当前 ftp 存储目录用户权限、chroot_list 文件配置用户登录、设置虚拟用户。

注意:在 Windows 资源管理访问,网络共享中心 ->Internet 属性 -> 高级,开启被动访问 ftp(开启兼容模式)

2、设置 selinux

1、设置 SELinux 为宽容模式或者临时关闭

1
2
3
4
5
#临时改成宽容模式
setenforce 0
#查看selinux
[root@dywangk test]# getenforce
Permissive

2、永久设置 selinux,修改配置文件 /etc/sysconfig/selinux

1
2
3
4
5
6
7
#查看,默认配置文件是开启的
cat /etc/sysconfig/selinux
SELINUX=enforcing
#禁用selinux
SELINUX=disable
#宽容模式
SELINUX=Permissive

五、配置参考

1、示例配置虚拟用户

编辑配置文件 vim /etc/vsftpd/vsftpd.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# Example config file /etc/vsftpd/vsftpd.conf
#绑定本机IP
listen_address=192.168.245.134
#禁止匿名用户登录
anonymous_enable=NO
#允许本地用户访问
local_enable=YES
#开启写入权限
write_enable=YES
#在后续比较高的版本中需要加入允许chroot写的权限
allow_writeable_chroot=YES
#上传文件后默认权限掩码
local_umask=022
#默认不开放匿名用户上传权限
#anon_upload_enable=YES
#默认不开放匿名用户创建于写的权限
#anon_mkdir_write_enable=YES
#
dirmessage_enable=YES
#
# Activate logging of uploads/downloads.
xferlog_enable=YES
#
# Make sure PORT transfer connections originate from port 20 (ftp-data).
#默认为FTP主动模式,需要开启防火墙20、21端口
connect_from_port_20=YES
#
#chown_uploads=YES
#chown_username=whoever
#
#xferlog_file=/var/log/xferlog
#
xferlog_std_format=YES
#
#idle_session_timeout=600
#
#data_connection_timeout=120
#
#nopriv_user=ftpsecure
#
#async_abor_enable=YES
#
#ascii_upload_enable=YES
#ascii_download_enable=YES
#
#ftpd_banner=Welcome to blah FTP service.
#
#deny_email_enable=YES

#banned_email_file=/etc/vsftpd/banned_emails
#禁止FTP用户离开自己的主目录
chroot_local_user=YES
chroot_list_enable=NO
# (default follows)
#虚拟用户列表,设置默认允许登录FTP的用户,每行一个用户
chroot_list_file=/etc/vsftpd/chroot_list
#开启虚拟用户功能
guest_enable=YES
#虚拟用户宿主目录
guest_username=ftp
#用户登录后操作主目录和本地用户具有同样的权限
virtual_use_local_privs=YES
#虚拟用户主目录配置文件
user_config_dir=/etc/vsftpd/vconf

#ls_recurse_enable=YES
#开启监听,开启ipv4就禁用listen_ipv6
listen=YES
#
listen_ipv6=NO
#权限验证需要的加密文件
pam_service_name=vsftpd.vu
#pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES

在 /etc/vsftpd/chroot_list 加入虚拟用户 user1 和 user2。这里直接用 vim 编辑是一样的加入配置,每行对应一个用户。

1
2
echo 'user1' >> /etc/vsftpd/chroot_list
echo 'user2' >> /etc/vsftpd/chroot_list

2、新增用户并指定目录

建议:linux 下赋予权限底线,在最小权限范围内满足需求即可

1
2
3
4
5
#创建虚拟用户目录
mkdir -p /data/{user1,user2}
#赋予权限,测试直接赋予最高权限了,实际工作中建议在最小权限范围内满足即可。
chmod -R 777 /data/user1
chmod -R 777 /data/user2

3、设置用户名密码数据库

下面使用的 \n 并非错误输入,是的,就是正常的换行。熟悉编程的小伙伴应该不陌生,在 Java 语言的打印输出大家应该有印象吧!

1
2
3
4
5
class test{
public static void main(String args){
system.out.println("hello world!!!");
}
}

在虚拟用户存储用户名以及密码

1
2
3
4
5
6
7
8
#用vusers.list来区分本机用户与虚拟用户配置
echo -e "user1\n123456\nuser2\n123456" > /etc/vsftpd/vusers.list
#切换到vsftpd配置目录
cd /etc/vsftpd/
#解析vusers.list到vusers.db
db_load -T -t hash -f vusers.list vusers.db
#赋予权限
chmod 600 vusers.*

4、指定认证方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
echo -e "#%PAM-1.0\n\nauth required pam_userdb.so db=/etc/vsftpd/vusers\naccount required  pam_userdb.so db=/etc/vsftpd/vusers" > /etc/pam.d/vsftpd.vu
#创建虚拟配置文件目录
mkdir /etc/vsftpd/vconf
#进入虚拟用户配置文件目录
cd vconf/
#新增配置
echo 'local_root=/data/user1' > user1
echo 'local_root=/data/user2' > user2
#查看配置
ls
user1 user2
#查看user1与user2的主目录
cat user1
local_root=/data/user1
cat user2
local_root=/data/user2

#新建测试文件
touch /data/user1/test1
touch /data/user2/test2

如果没有指定虚拟用户的 ftp 目录,默认访问目录如下

1
/var/ftp/pub/

经过测试设置的虚拟用户 user2 禁锢在了 /data/user2 目录下

1
2
3
#在Windows下访问到新增的test1、test2文件,如果没变过来多刷新几遍
/data/user1/test1
/data/user2/test2

5、ftp 命令登录验证

Git Bash 验证

1
ftp remote_ip

或者在资源管理验证测试新增、删除、修改。

1
ftp://remote_ip