前言

正如 vsftpd 官方宣传中所说 Probably the most secure and fastest FTP server for UNIX-like systems. 我相信这是大多数人选择 vsftpd 来搭建 Linux 的 FTP 服务器的原因,当然 ProFTPD 用的人应该也不在少数。文章将以清晰直观的方式介绍安装 vsftpd 以及配置 FTP 虚拟用户的过程,希望对大家有帮助。

首选的 FTP 服务器搭建方式


更新历史

2016 年 04 月 15 日 - 增加 vsftp 匿名用户上传和下载
2015 年 08 月 24 日 - 初稿

阅读原文 - https://wsgzao.github.io/post/vsftpd/

扩展阅读

CentOS 6.4 下安装 vsftpd - http://www.cnblogs.com/xiongpq/p/3384759.html
ProFTPD - http://www.proftpd.org/
vsftpd - http://vsftpd.beasts.org


设置匿名用户上传下载

使用最简单的方法设置 vsftp 匿名用户上传和下载

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
# 安装 vsftpd
yum -y install vsftpd
chkconfig vsftpd on

# 修改 vsftpd.conf
cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak
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=YES

pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES

# 增加匿名访问目录
anon_root=/var/ftp

# 打开匿名用户上传 / 删除 / 重命名权限
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES

# 匿名用户的掩码(如需要,需自己添加,含义:如 umask 是 022, 这时创建一个权限为 666 的文件,文件的实际权限为 666-022=644)
anon_umask=022

# 设定支持 ASCII 模式的上传和下载功能
ascii_upload_enable=YES
ascii_download_enable=YES

# 增加日志记录
xferlog_file=/var/log/xferlog
dual_log_enable=YES
vsftpd_log_file=/var/log/vsftpd.log

# 重启 vsftpd 服务并配置目录权限
service vsftpd restart
cd /var/ftp
mkdir pub
chmod 777 pub/

# 常见问题
默认情况下,ftp 的根目录为 / var/ftp,为了安全,这个目录默认不允许设置为 777 权限,否则 ftp 将无法访问。但是我们要匿名上传文件,需要 “other” 用户的写权限,正确的做法:
在 / var/ftp 中建立一个 pub(名子自己起吧)文件夹,将个文件夹权限设置为 777(视具体需要自己设),在 upload 这个文件夹中,匿名用户可以上传文件、创建文件夹、删除文件等。一般至此,便实现 vsftpd 匿名用户的上传下载了。如果还不行可能 selinux 的问题,关闭即可。

安装 vsftpd

1
2
3
4
5
6
7
8
9
# 查看当前系统版本
cat /etc/redhat-release
CentOS release 6.6 (Final)

# 查看是否已经安装 vsftpd
rpm -qa | grep vsftpd
# 如果没有,就安装,并设置开机启动
yum -y install vsftpd
chkconfig vsftpd on

基于虚拟用户的配置

所谓虚拟用户就是没有使用真实的帐户,只是通过映射到真实帐户和设置权限的目的。虚拟用户不能登录 CentOS 系统。

修改配置文件

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
vi /etc/vsftpd/vsftpd.conf

# 服务器独立运行
listen=YES
# 设定不允许匿名访问
anonymous_enable=NO
# 设定本地用户可以访问。注:如使用虚拟宿主用户,在该项目设定为 NO 的情况下所有虚拟用户将无法访问
local_enable=YES
# 使用户不能离开主目录
chroot_list_enable=YES
# 设定支持 ASCII 模式的上传和下载功能
ascii_upload_enable=YES
ascii_download_enable=YES
#PAM 认证文件名。PAM 将根据 / etc/pam.d/vsftpd 进行认证
pam_service_name=vsftpd
# 设定启用虚拟用户功能
guest_enable=YES
# 指定虚拟用户的宿主用户,CentOS 中已经有内置的 ftp 用户了
guest_username=ftp
# 设定虚拟用户个人 vsftp 的 CentOS FTP 服务文件存放路径。存放虚拟用户个性的 CentOS FTP 服务文件(配置文件名 = 虚拟用户名)
user_config_dir=/etc/vsftpd/vuser_conf
# 配置 vsftpd 日志(可选)
xferlog_enable=YES
xferlog_std_format=YES
xferlog_file=/var/log/xferlog
dual_log_enable=YES
vsftpd_log_file=/var/log/vsftpd.log

进行认证

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
# 安装 Berkeley DB 工具,很多人找不到 db_load 的问题就是没有安装这个包
yum install db4 db4-utils

# 创建用户密码文本,注意奇行是用户名,偶行是密码
vi /etc/vsftpd/vuser_passwd.txt

test
123456

# 生成虚拟用户认证的 db 文件
db_load -T -t hash -f /etc/vsftpd/vuser_passwd.txt /etc/vsftpd/vuser_passwd.db

# 编辑认证文件,全部注释掉原来语句,再增加以下两句
vi /etc/pam.d/vsftpd

auth required pam_userdb.so db=/etc/vsftpd/vuser_passwd
account required pam_userdb.so db=/etc/vsftpd/vuser_passwd

# 创建虚拟用户配置文件
mkdir /etc/vsftpd/vuser_conf/
# 文件名等于 vuser_passwd.txt 里面的账户名,否则下面设置无效
vi /etc/vsftpd/vuser_conf/test

# 虚拟用户根目录, 根据实际情况修改
local_root=/data/ftp
write_enable=YES
anon_umask=022
anon_world_readable_only=NO
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES

设置 FTP 根目录权限

1
2
3
4
5
6
7
8
9
10
11
# 最新的 vsftpd 要求对主目录不能有写的权限所以 ftp 为 755,主目录下面的子目录再设置 777 权限
mkdir /data/ftp
chmod -R 755 /data
chmod -R 777 /data/ftp

# 建立限制用户访问目录的空文件
touch /etc/vsftpd/chroot_list

# 如果启用 vsftpd 日志需手动建立日志文件
touch /var/log/xferlog
touch /var/log/vsftpd.log

配置 PASV 模式(可选)

vsftpd 默认没有开启 PASV 模式,现在 FTP 只能通过 PORT 模式连接,要开启 PASV 默认需要通过下面的配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

打开 / etc/vsftpd/vsftpd.conf,在末尾添加

# 开启 PASV 模式
pasv_enable=YES
# 最小端口号
pasv_min_port=40000
# 最大端口号
pasv_max_port=40080
pasv_promiscuous=YES

# 在防火墙配置内开启 40000 到 40080 端口
-A INPUT -m state --state NEW -m tcp -p -dport 40000:40080 -j ACCEPT

# 重启 iptabls 和 vsftpd
service iptables restart
service vsftpd restart

现在可以使用 PASV 模式连接你的 FTP 服务器了~

Selinux 和防火墙

该关闭的关闭,该放行的放行

1
2
3
4
5
# 关闭 selinux/iptables
sed -i '/SELINUX/s/enforcing/disabled/' /etc/selinux/config
setenforce 0
chkconfig iptables off
service iptables stop

常见问题

如果登录时出现

500 OOPS: priv_sock_get_result. Connection closed by remote host.

这样的错误,需要升级 pam

yum update pam
文章目录
  1. 1. 前言
  2. 2. 更新历史
  3. 3. 设置匿名用户上传下载
  4. 4. 安装 vsftpd
  5. 5. 基于虚拟用户的配置
    1. 5.1. 修改配置文件
    2. 5.2. 进行认证
    3. 5.3. 设置 FTP 根目录权限
    4. 5.4. 配置 PASV 模式(可选)
    5. 5.5. Selinux 和防火墙
  6. 6. 常见问题