环境声明

服务器

  • 系统: Centos7.4
  • IP地址: 192.168.132.111
  • 网卡模式: 桥接模式
  • 软件版本: vsftpd-3.0.2-22 | pam-1.1.8-18 | pam-devel-1.1.8-18

环境部署

服务安装

1
yum install vsftpd -y

image-20211214153021557

常用配置项

1
2
3
4
5
6
7
8
9
10
11
12
# 允许匿名登录
anonymous_enable=YES
# 匿名用户根目录
anon_root=/var/ftp/pub
# 允许匿名用户上传文件
anon_upload_enable=YES
# 允许匿名用户创建文件夹
anon_mkdir_write_enable=YES
# 开放匿名用户其他权限(命名名、删除等)
anon_other_write_enable=YES
# 匿名用户上传的文件的umask值
anon_umask=022
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 允许本地用户登录ftp
local_enable=YES
# 本地用户的ftp根目录
local_root=/var/ftp
# 将用户权限禁锢在FTP目录内 (不让访问其他目录)
chroot_local_user=YES
# 设置同一IP最大连接数 (0为无限制)
max_per_ip=0
# 设置最大客户端连接数 (0为无限制)
max_clients=0
# 设置服务监听端口 (连接指定端口: ftp 192.168.132.200 21)
listen_port=21
# 设置服务监听IP
listen_address=192.168.132.200
# 允许写
write_enable=YES
# 上传后文件的权限
local_umask=022
# 配置子配置文件目录 (用于存放子配置文件,无需后缀)
user_config_dir=/etc/vsftpd/user_config
1
2
3
4
5
6
7
8
9
# 主动模式:FTP服务端主动向FTP客户端发起连接请求。
# 被动模式:FTP服务端等待FTP客户端的连接请求。
# 开启主动模式
port_enable=YES
# 开启被动模式
pasv_enable=YES
pasv_min_port=port number # 被动模式开放端口的一个范围 (开始端口)
pasv_max_port=port number # (结束端口)
pasv_promiscuous=YES # 关闭pasv安全检查

配置文件

文件路径 文件说明
/etc/vsftpd/vsftpd.conf vsftp主配置文件
/etc/vsftpd/user_list userlist_deny=NO时仅允许该文件内的用户登录FTP,为YES时该文件内的用户不允许登录(默认YES)
/etc/vsftpd/ftpusers 该文件内的用户不允许登录FTP
/etc/vsftpd/chroot_list 该文件内的用户可进行目录浏览(需要自行创建文件)

ftp常用命令

1
2
3
4
5
6
7
8
9
10
11
12
cd 目录       # 切换目录
pwd # 查看服务器当前路径
!pwd # 查看本地当前路径
dir # 查看服务器当前路径文件
!dir # 查看本地当前路径文件

put 文件名 # 上传文件
get 文件名 # 下载文件
rename 旧名 新名 # 重命名文件
delete 文件名 # 删除文件
mkdir 文件夹名 # 创建文件夹
rmdir 文件夹名 # 删除文件夹

匿名开放模式

项目需求

  • 服务器IP: 192.168.132.111
  • 家目录: /var/anon_dir/
  • 备注: 要求可以使用匿名用户登录,且匿名用户的权限为可上传、可下载,其他均不允许

创建匿名用户的家目录,并将该目录的权限设置为755,必须是755否则登陆时报错500 OOPS: vsftpd: refusing to run with writable root inside chroot()

1
2
mkdir /var/anon_dir/
chmod 755 /var/anon_dir/

修改主配置文件vsftpd.conf,实现上述功能

1
2
3
anonymous_enable=YES
anon_root=/var/anon_dir/
anon_upload_enable=YES

修改完成后将服务重启,防火墙放行服务后进行测试

1
2
3
systemctl restart vsftpd
firewall-cmd --zone=public --add-service=ftp --permanent
firewall-cmd --reload

如果上传文件报错553 Could not create file.,则需要检查一下selinux有没有关闭,如关闭之后还是不行则需要在家目录下再创建一个文件夹,赋予该文件夹777权限,再进入该文件夹进行上传测试

image-20211214155248074

如果下载文件报错550 Failed to open file.,则是因为该文件没有读取权限,将需要下载的文件授予读取权限后再下载即可。

但匿名用户每次上传文件后想再次下载都要服务器重新该权限,可以在主配置文件中添加anon_umask=011来设置上传的文件的权限。umask的值换算成文件权限则为777 - umask,如umask=022则文件权限为777-022=755,但有时候umask权限设置完后还是不会生效,不知道为什么

1
chmod +r 文件名

image-20211214155650531

image-20211214160236372

本地用户模式

项目需求

  • 服务器IP: 192.168.132.111
  • 家目录: /home/用户名/
  • 用户名: f1 | f2 | f3 | fadmin
  • 用户配置目录: /etc/vsftpd_user_conf/
  • 备注: 密码与用户名相同,f1用户具有上传下载权限,f2用户具有下载权限、f3用户不允许登录、fadmin用户具有上传、下载、目录浏览权限

创建本地用户,将用户的密码设置为与用户名相同,将用户的家目录权限设置为755

1
2
3
4
useradd f1
useradd f2
useradd f3
useradd fadmin

image-20211214165612844

image-20211214191025929

修改主配置文件vsftpd.conf,创建文件夹/etc/vsftpd_user_conf用于存储用户配置信息

1
2
3
4
5
6
local_enable=YES
write_enable=YES
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
user_config_dir=/etc/vsftpd_user_conf/

在用户配置目录下创建与用户名相同的文件,并根据项目要求写入配置文件。如果不创建子配置文件时默认根目录为用户的家目录,权限为完全控制

1
2
3
4
5
6
7
8
9
10
# f1用户配置
local_root=/home/f1/
write_enable=YES

# f2用户配置
local_root=/home/f2/

# fadmin用户配置
local_root=/home/fadmin/
write_enable=YES

image-20211214191353594

创建文件/etc/vsftpd/chroot_list用来指定可以目录浏览的用户

image-20211214171635490

在文件/etc/vsftpd/ftpusers末尾加入f3,禁止该用户登录ftp服务

image-20211214193120835

测试f1权限(可上传、下载)

image-20211214192708832

测试f2权限(可下载)

image-20211214192915619

测试f3权限(不可登录)

image-20211214193202782

测试fadmin权限(可上传、下载、目录浏览)

image-20211214193411087

虚拟用户模式

项目需求

  • 服务器IP: 192.168.132.111
  • 家目录: /var/ftproot/
  • 宿主用户: ftpuser
  • 虚拟用户: ftp1 | ftp2 | ftp3
  • 用户配置目录: /etc/vsftpd_user_conf/
  • 备注: 密码与用户名相同,ftp1用户具有上传下载权限,ftp2用户具有下载权限、ftp3用户具有上传、下载、创建文件夹、删除文件、重命名、目录浏览权限

安装依赖

1
yum install pam pam-devel -y

image-20211215095111931

创建用户ftpuser作为虚拟用户的宿主用户,再创建文件夹作为ftp的根目录,并将该文件夹所有者设置为ftpuser

1
useradd -s /sbin/nologin ftpuser

image-20211215094500574

编辑主配置文件,修改成如下所示后保存退出

1
2
3
4
5
6
7
8
9
10
local_enable=YES    # 允许本地用户登录 (必要,默认开启)
user_config_dir=/etc/vsftpd_user_conf # 自定义用户配置文件目录
chroot_local_user=YES # 开启限制用户只能在ftp目录中
chroot_list_enable=YES # 开启chroot
chroot_list_file=/etc/vsftpd/diruser # 指定文件中包含的用户可以进行目录浏览
allow_writeable_chroot=YES # 允许写入(2.3.5之后的版本要添加,否则报错500)

guest_enable=YES # 开启虚拟用户功能
guest_username=vsftp # 指定虚拟用户的宿主用户
virtual_use_local_privs=YES # 设定虚拟用户的权限符合宿主用户

继续在/etc/vsftpd/目录下创建用户文件users,内容为一行账号一行密码。再使用db_load生成用户据数据库

1
db_load -T -t hash -f users users.db

image-20211215202005069

修改pam的配置文件/etc/pam.d/vsftpd,将原来的配置项全部注释,添加上如下几行

1
2
auth    required        pam_userdb.so   db=/etc/vsftpd/users
account required pam_userdb.so db=/etc/vsftpd/users

image-20211215100154353

再创建用户的配置文件用来划分权限,这是使用与匿名用户一样的配置项

1
2
3
4
5
6
7
8
9
10
11
12
# ftp1
local_root=/var/ftproot/
anon_upload_enable=YES

# ftp2
local_root=/var/ftproot/

# ftp3
local_root=/var/ftproot/
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES

image-20211215104557237

ftp3添加至目录浏览的用户组中,所有配置完成后重启服务进行测试(有时候权限会错乱,不知道具体原因)

1
echo "ftp3" >> /etc/vsftpd/chroot_list

多端口多服务

项目需求

  • 服务器IP: 192.168.132.111
  • 服务端口: 2121
  • 家目录: /var/new_ftp/
  • 配置文件: /etc/vsftp/vsftpd_2121.conf
  • 备注: 在原来的基础上创建一个端口为2121的新服务,该服务与原来的服务互相独立。该服务允许匿名用户登录,且匿名用户可上传、下载、重命名、创建文件夹等操作

将原来的配置文件复制出来一份,将名字修改为vsftpd_2121.conf

1
2
cd /etc/vsftpd
cp -p vsftpd.conf vsftpd_2121.conf

修改vsftpd_2121.conf,监听2121端口,开启匿名用户相关的权限

1
2
3
4
5
6
7
8
listen_port=2121

anonymous_enable=YES
anon_root=/var/new_ftp/
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
anon_umask=011

复制vsftpd服务文件,修改vsftpd_2121.conf文件中的ExecStart指向的配置文件

1
2
3
4
cd /usr/lib/systemd/system/
cp -p vsftpd.service vsftpd_2121.service

ExecStart=/usr/sbin/vsftpd /etc/vsftpd/vsftpd_2121.conf

image-20211215203159641

修改完成后启动服务,防火墙放行端口后测试

1
2
3
4
5
systemctl start vsftpd_2121.service
systemctl enable vsftpd_2121.service

firewall-cmd --zone=public --add-port=2121/tcp --permanent
firewall-cmd --reload

image-20211215204647784

如需配置虚拟用户可以修改配置文件vsftpd_2121.conf,指定pam_service_name的配置文件

1
pam_service_name=vsftpd_2121

再创建相关的用户数据库后,复制pam下vsftpd的配置文件,修改该文件的用户数据库路径即可

1
2
cd /etc/pam.d/
cp -p vsftpd vsftpd_2121

1
```