虚拟机配置vsftpd服务

虚拟机配置vsftpd服务

要求

练习vsftpd服务器的各种配置:

  1. 使用本地yum源安装vsftpd软件
  2. FTP服务器IP地址为192.168.5.10
  3. 采用本地用户模式
  4. 创建本地用户mednight4
  5. 设置本地用户的根目录为/data/ftp_data且在目录中创建ftp_test空文件
  6. 允许用户mednight4上传和下载文件
  7. 锁定用户mednight4在其根目录中

说明

模式

vsftpd服务程序允许三种认证方式登陆到ftp服务器上

  • 匿名开放模式:任何人都可以无需密码直接登陆到ftp服务器

  • 本地用户模式:通过linux本地账户密码认证的模式

  • 虚拟用户模式:需要服务器单独建立ftp用户数据库,仅供ftp服务程序使用

本次介绍前两种模式。

常用参数

位置:/etc/vsftpd/vsftpd.conf

参数 作用
listen=[YES|NO] 是否以独立运行的方式监听服务
listen_address=IP地址 设置要监听的ip地址
listen_port=21 设置ftp服务的监听端口
download_enable=[YES|NO] 是否允许下载文件
userlist_enbale=[YES|NO] 设置用户列表为-允许-还是-禁止-操作
userlist_deny=[YES|NO] 设置用户列表为-允许-还是-禁止-操作
max_clients=0 最大客户端连接数,0位不限制
max_per_ip=0 同一ip的最大连接数,0位不限制
anonymous_enable=[YES|NO] 是否允许匿名访问
ano_upload_enable=[YES|NO] 是否允许匿名用户上传文件
anon_umask=022 匿名用户上传文件的umask值
anon_root=/var/ftp 匿名用户的ftp根目录
anon_mkdir_write_enable=[YES|NO] 是否允许匿名用户创建目录
anon_other_write_enable=[YES|NO] 是否开放匿名用户的其他写入权限,包括重命名、删除…
anon_max_rate=0 匿名用户的最大传输速率(字节/秒),0为不限制
local_enable=[YES|NO] 是否允许本地用户登陆ftp
local_umask=022 本地用户上传文件的umask值
local_root=/var/ftp 本地用户的ftp根目录
chroot_local_user=[YES|NO] 是否将用户权限禁锢在ftp目录,以保证安全
local_max_rate=0 本地用户最大传输速率(字节/秒),0为不限制
allow_writeable_chroot=YES 允许对禁锢的ftp根目录执行写入操作,而且不拒绝用户登陆请求

配置

匿名开放模式

向匿名用户开放的权限参数

参数 作用
anonymous_enable=YES 允许匿名访问模式
anon_umask=022 匿名用户上传文件的umask值
anon_upload_enable=YES 允许匿名用户上传文件
anon_mkdir_write_enable=YES 允许匿名用户创建用户
anon_other_write_enable=YES 允许匿名用户修改目录名称或删除目录
  1. 安装ftp
1
2
3
4
5
[root@localhost ~]# yum install vsftpd
...
Is this ok [y/d/N]: y
...
Complete!
  1. 配置参数

vsftpd命令可以查看配置参数是否出错

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
[root@localhost /]# ls /etc/vsftpd/
ftpusers user_list vsftpd.conf vsftpd_conf_migrate.sh
[root@localhost /]# cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak
[root@localhost /]# cd /etc/vsftpd/
[root@localhost vsftpd]# cat /etc/vsftpd/vsftpd.conf.bak | grep -v "#" | grep -v "#$" > /etc/vsftpd/vsftpd.conf
[root@localhost vsftpd]# vi /etc/vsftpd/vsftpd.conf

anonymous_enable=YES
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES

pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES

# 加上下面的参数
anon_umask=022
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
~
~
: wq
  1. 防火墙打开端口20、21
1
2
3
4
[root@localhost vsftpd]# firewall-cmd --add-port=20/tcp
success
[root@localhost vsftpd]# firewall-cmd --add-port=21/tcp
success
  1. 启动服务
1
[root@localhost vsftpd]# systemctl start vsftpd
  1. 创建一个文件
1
[root@localhost pub]# echo "hello world" > /var/ftp/pub/hello.txt
  1. 连接

看到ls和拉取操作失败了,

1
2
3
ftp> ls
200 PORT command successful. Consider using PASV.
425 Failed to establish connection.

查了一下错,朝晖的博客,然后把window防火墙关了,问题解决了。

匿名方式就这样。

本地用户模式

向linux本地账户用户开放的权限参数

参数 作用
anonymous_enable=NO 禁止匿名访问模式
local_enable=YES 允许本地用户模式
write_enable=YES 设置可写权限
local_umask=YES 本地用户模式创建文件的umask值
userlist_enable=YES 允启用禁止用户名单,名单为ftpusers和user_list
userlist_deny=YES 开启用户作用名单文件功能
allow_writeable_chroot=YES 允许对禁锢的ftp根目录执行写入操作,而且不拒绝用户登陆请求
  1. 安装ftp
1
2
3
4
5
[root@localhost ~]# yum install vsftpd
...
Is this ok [y/d/N]: y
...
Complete!
  1. 配置参数为本地用户模式

vsftpd命令可以查看配置参数是否出错

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
[root@localhost /]# ls /etc/vsftpd/
ftpusers user_list vsftpd.conf vsftpd_conf_migrate.sh
[root@localhost /]# cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak
[root@localhost /]# cd /etc/vsftpd/
[root@localhost vsftpd]# cat /etc/vsftpd/vsftpd.conf.bak | grep -v "#" | grep -v "#$" > /etc/vsftpd/vsftpd.conf
[root@localhost vsftpd]# vi /etc/vsftpd/vsftpd.conf

anonymous_enable=YES
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES


# 默认开启本地用户模式,只需要将第一个参数修改为
anonymous_enable=NO
~
~
: wq
  1. 防火墙打开端口20、21
1
2
3
4
[root@localhost vsftpd]# firewall-cmd --add-port=20/tcp
success
[root@localhost vsftpd]# firewall-cmd --add-port=21/tcp
success
  1. 创建本地用户mednight4
1
2
3
4
5
6
7
[root@localhost vsftpd]# useradd mednight4
[root@localhost vsftpd]# passwd mednight4
Changing password for user mednight4.
New password:
BAD PASSWORD: The password fails the dictionary check - it is too simplistic/systematic
Retype new password:
passwd: all authentication tokens updated successfully.
  1. 创建ftp特定目录和文件
1
2
[root@localhost mednight4]# mkdir -p /data/ftp_data
[root@localhost mednight4]# echo "helloworld" > /data/ftp_data/hello.txt
  1. 调整参数满足要求
  • 设置本地用户的根目录为/data/ftp_data且在目录中创建ftp_test空文件

  • 允许用户mednight4上传和下载文件

  • 锁定用户mednight4在其根目录中

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
[root@localhost vsftpd]# vi /etc/vsftpd/vsftpd.conf

anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES

# 设置本地用户的根目录为/data/ftp_data
local_root=/data/ftp_data
# 锁定用户mednight4在其根目录中
chroot_local_user=YES
# 允许对禁锢的ftp根目录执行写入操作
allow_writeable_chroot=YES
~
~
: wq
  1. 根目录权限全开

要想用户在root所属的目录下操作文件,先把权限打开再说。

1
2
[root@localhost mednight4]# chmod 777  /data/ftp_data/
[root@localhost mednight4]# systemctl restart vsftpd
  1. 连接

常见问题

无法登陆

报错

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

原因

开启了将用户禁锢在根目录,目录权限包含写权限

从2.3.5之后,vsftpd增强了安全检查,如果用户被限定在了其主目录下,则该用户的主目录不能再具有写权限了!如果检查发现还有写权限,就会报该错误。

解决方法

  1. 在vsftpd.conf中新增allow_writeable_chroot=YES
  2. 删除根目录的写权限,不过用户将不能做写相关操作

无法ls和get

报错

vsftp:425 failed to establish connection

200 PORT command successful. Consider using PASV.

425 Failed to establish connection.

解决办法

无法在锁定的根目录中新建文件

原因

检查根目录(此处是/data/ftp_data)对于用户(mednight4)的权限

解决办法

  • 就是简单粗暴777