linux 下 vsftp配置


一 .

vsftpd是一款在Linux发行版中最受推崇的FTP服务器程序。特点是小巧轻快,安全易用。

如果你想在你的Linux/Unix服务器上搭建一个安全、高性能、稳定性好的FTP 服务器,那么vsftpd可能是你的首选应用。vsftpd意思为“very secure FTP daemon(非常安全的FTP进程)”,是一个基于GPL发布的类UNIX类操作系统上运行的服务器的名字(是一种守护进程),可以运行在诸如 Linux、BSD、Solaris、HP-UX以及Irix等系统上面。vsftpd支持很多其他传统的FTP服务器不支持的良好特性。

CentOS vsftpd软件配置

1 安装软件
2 配置为超级服务
3 使用匿名用户登入
4 本地用户登入
5 使用虚拟用户登入
6 使用ssl加密
7 vsftpd.conf 配置文件详解

 

1 安装 vsftpd

centos 或Redhat 系统;
[root@localhost ~]# yum install vsftpd
如果是debian ubuntu 类系统;

[root@localhost ~]# apt-get install vsftpd

 

2 启用超级服务启动

[root@localhost ~]#vi /etc/xinetd.d/vsftpd
service ftp
{
disable = no
socket_type = stream
wait = no
user = root server = /usr/sbin/vsftpd
server_args = /etc/vsftpd/vsftpd.conf
# 上面这个 server 的设定请依照您的主机环境来设定!
# 至于 server_args 则请写入您的 vsftpd 的配置文件完整名称即可!
per_source = 5 <==与同一 IP 的联机数目有关
instances = 200 <==同一时间最多的联机数目
no_access = 192.168.1.3
banner_fail = /etc/vsftpd/vsftpd.busy_banner
# 上面这个文件就是当主机忙碌中,则在 Client 端显示的内容!
log_on_success += PID HOST DURATION
log_on_failure += HOST
}

[root@localhost ~]#vi /etc/vsftpd/vsftpd.conf
listen=NO

 

3 使用匿名用户登入

[root@localhost ~]#vi /etc/vsftpd/vsftpd.conf

anonymous_enable=YES

 

4 使用本地用户登入

[root@localhost ~]#vi /etc/vsftpd/vsftpd.conf

#下面是允许某些用户登入的项目 存在user_list文件中的用户不允许登入
userlist_enable=YES
userlist_deny=YES #如果这里改为NO 反过来只能存在user_list文件中的用户允许登入
userlist_file=/etc/vsftpd/user_list
anonymous_enable=NO

#下面是限制用户只能访问自己的主目录 存在chroot_list文件中的用户只能访问自己的主目录
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list

新建个用户 这样重启服务 可以在客户端使用新建的本地用户登入了。

5 使用虚拟用户登入

#创建两个目录
[root@localhost ~]#mkdir /home/vsftpd/ftp1
[root@localhost ~]# mkdir /home/vsftpd/ftp3

[root@localhost ~]# vi /etc/vsftpd/loginuser.txt

#加入两个用户 奇数行代表用户名 偶数行代表密码
xftpadmin
123456
xftpuser
123456

#执行命令 生成虚拟数据库
[root@localhost ~]# db_load -T -t hash -f /etc/vsftpd/loginuser.txt /etc/vsftpd/login.db
#设置数据库文件的访问权限

[root@localhost ~]# chmod 600 /etc/vsftpd/login.db

[root@localhost ~]#vi /etc/pam.d/vsftpd

#将以下内容增加的原文件前面两行:
auth required pam_userdb.so db=/etc/vsftpd/login
account required pam_userdb.so db=/etc/vsftpd/login
#我们建立的虚拟用户将采用PAM进行验证,这是通过/etc/vsftpd.conf文件中的 语句pam_service_name=vsftpd.vu来启用的。

vsftpd使用的pam文件
auth sufficient pam_userdb.so db=/etc/vsftpd/login
account sufficient pam_userdb.so db=/etc/vsftpd/login

#auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd.ftpusers onerr=succeed
#auth required pam_stack.so service=system-auth
#auth required pam_shells.so
#account required pam_stack.so service=system-auth
#session required pam_stack.so service=system-auth

可以看出前面两行是对虚拟用户的验证,后面是对系统用户的验证。 为了安全我一般把系统用户的登入关闭 使用虚拟账号登入ftp
对虚拟用户的验证使用了sufficient这个控制标志。
这个标志的含义是如果这个模块验证通过,就不必使用后面的层叠模块进行验证了;但如果失败了,
就继续后面的认证,也就是使用系统真实用户的验证。
虚拟用户创建本地系统用户

#新建一个系统用户vsftpd, 用户登录终端设为/bin/false(即使之不能登录系统)

[root@localhost ~]# useradd vsftpd -d /home/vsftpd -s /bin/false
[root@localhost ~]# chown vsftpd:vsftpd /home/vsftpd#改变目录所属用户组

根据需要创建/etc/vsftpd/vsftpd.conf,以下设置:
listen=YES #监听为专用模式
anonymous_enable=NO #禁用匿名登入
dirmessage_enable=YES
xferlog_enable=YES
xferlog_file=/var/log/vsftpd.log #记录ftp操作日志
xferlog_std_format=YES
chroot_local_user=YES #对用户访问只限制在主目录 不能访问其他目录
guest_enable=YES #启用guest
guest_username=vsftpd #使用虚拟账号形式
user_config_dir=/etc/vsftpd_user_conf #虚拟账号配置目录
pam_service_name=vsftpd #对vsftpd的用户使用pam认证
local_enable=YES

#执行以下命令
[root@localhost ~]# mkdir /etc/vsftpd/user_conf
[root@localhost ~]# cd /etc/vsftpd/user_conf
[root@localhost ~]# touch xftpuser xftpadmin #创建两个文件

[root@localhost ~]# vi /etc/vsftpd/user_config/xftpadmin

#加入以下内容 拥有所有权限
write_enable=YES
anon_world_readable_only=NO
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
local_root=/home/vsftpd/ftp3

[root@localhost ~]# vi /etc/vsftpd/user_config/xftpuser

#加入以下内容 只读权限
local_root=/home/vsftpd/ftp1

#登入 使用ftp1用户登入看看
如果不能读写操作 可能是目录权限不够需要设置权限 试试看

[root@localhost ~]# chmod 777 /home/vsftpd/ftp3

这样就可以用虚拟账号登入了 ftpadmin、ftpuser分别登入之后访问的是ftp3、ftp1目录。


6 使用ssl登入

[root@localhost ~]# cd /etc/pki/tls/certs/
[root@localhost ~]# openssl req -new -x509 -nodes -out vsftpd.pem -keyout vsftpd.pem

4 修改vsftpd.conf文件
[root@localhost ~]#vi/usr/local/etc/vsftpd.conf .

ssl_enable=YES(开启vsftpd对ssl协议的支持)
ssl_sslv2=YES(支持SSL v2 protocol)
ssl_sslv3=YES(支持SSL v3 protocol)
ssl_tlsv1=YES(支持TSL v1)
rsa_cert_file=/etc/pki/tls/certs/vsftpd.pem(证书的路径)

ssl_enable=YES
ssl_sslv2=YES
ssl_sslv3=YES
ssl_tlsv1=YES

这样重启vsftpd 就可以用客户端来尝试进行SSL加密连接了 。

7 vsftpd.conf 设定详细说明
/etc/vsftpd/vsftpd.conf 本身就是一个挺详细的配置文件,且使用『 man 5 vsftpd.conf 』则可以得到完整的参数说明。

与主机较相关的设定值
connect_from_port_20=YES (NO)
ftp-data 的端口;

listen_port=21
vsftpd 使用的命令通道之端口号,如果您想要使用非正规的端口,在这个设定项目修改吧! 不过你必须要知道,这个设定值仅适合以 stand alone 的方式来启动(对于 super daemon 无效)

dirmessage_enable=YES (NO)
当用户进入某个目录时,会显示该目录需要注意的内容,显示的文件默认是 .message ,你可以使用底下的设定项目来修改!

message_file=.message
当 dirmessage_enable=YES 时,可以设定这个项目来让 vsftpd 寻找该文件来显示信息!

listen=YES (NO)
若设定为 YES 表示 vsftpd 是以 standalone 的方式来启动的

pasv_enable=YES (NO)
启动被动式联机模式(passive mode),一定要设定为 YES 的

use_localtime=YES (NO)
是否使用本地时间?vsftpd 预设使用 GMT 时间(格林威治)

write_enable=YES (NO)
如果你允许用户上传数据时,就要启动这个设定值;

connect_timeout=60
单位是秒,在数据连接的主动式联机模式下,我们发出的连接讯号在 60 秒内得不到客户端的响应,则不等待并强制断线。

accept_timeout=60
当用户以被动式 PASV 来进行数据传输时,如果主机启用 passive port 并等待 client 超过 60 秒而无回应, 那么就给他强制断线!这个设定值与 connect_timeout 类似,不过一个是管理主动联机,一个管理被动联机。

data_connection_timeout=300
如果服务器与客户端的数据联机已经成功建立 (不论主动还是被动联机),但是可能由于线路问题导致 300 秒内还是无法顺利的完成数据的传送,那客户端的联机就会被我们的 vsftpd 强制剔除!

idle_session_timeout=300
如果使用者在 300 秒内都没有命令动作,强制脱机

max_clients=0
如果 vsftpd 是以 stand alone 方式启动的,那么这个设定项目可以设定同一时间,最多有多少 client 可以同时连上 vsftpd

max_per_ip=0
与上面 max_clients 类似,这里是同一个 IP 同一时间可允许多少联机?

pasv_min_port=0, pasv_max_port=0
上面两个是与 passive mode 使用的 port number 有关,如果您想要使用 65400 到 65410 这 11 个 port 来进行被动式联机模式的连接,可以这样设定 pasv_max_port=65410 以及 pasv_min_port=65400。 如果是 0 的话,表示随机取用而不限制。

ftpd_banner=一些文字说明
当使用者联机进入到 vsftpd 时,在 FTP 客户端软件上头会显示的说明文字。不过,这个设定值数据比较少啦! 建议你可以使用底下的设定值来取代这个项目;

banner_file=/path/file
这个项目可以指定某个纯文本档作为使用者登入 vsftpd 服务器时所显示的欢迎字眼。

与实体用户较相关的设定值
guest_enable=YES (NO)

若这个值设定为 YES 时,那么任何非 anonymous 登入的账号,均会被假设成为 guest (访客) 至于访客在 vsftpd 当中,预设会取得 ftp 这个使用者的相关权限。但可以透过 guest_username 来修改。

guest_username=ftp
在 guest_enable=YES 时才会生效,指定访客的身份而已。

local_enable=YES (NO)
这个设定值必须要为 YES 时,在 /etc/passwd 内的账号才能以实体用户的方式登入我们的 vsftpd 主机

local_max_rate=0
实体用户的传输速度限制,单位为 bytes/second, 0 为不限制。

chroot_local_user=YES (NO)
将用户限制在自己的家目录之内(chroot)!这个设定在 vsftpd 当中预设是 NO,因为有底下两个设定项目的辅助喔! 所以不需要启动他!
chroot_list_enable=YES (NO)
是否启用将某些实体用户限制在他们的家目录内?预设是 NO ,不过,如果您想要让某些使用者无法离开他们的家目录时, 可以考虑将这个设定为 YES ,并且规划下个设定值

chroot_list_file=/etc/vsftpd.chroot_list
如果 chroot_list_enable=YES 那么就可以设定这个项目了! 他里面可以规定那一个实体用户会被限制在自己的家目录内而无法离开!(chroot) 一行一个账号即可!

userlist_enable=YES (NO)
是否藉助 vsftpd 的抵挡机制来处理某些不受欢迎的账号,与底下的设定有关;

userlist_deny=YES (NO)
当 userlist_enable=YES 时才会生效的设定,若此设定值为 YES 时,则当使用者账号被列入到某个文件时, 在该文件内的使用者将无法登入 vsftpd 服务器!该文件名与下列设定项目有关。
userlist_file=/etc/vsftpd.user_list
若上面 userlist_deny=YES 时,则这个文件就有用处了!在这个文件内的账号都无法使用 vsftpd

匿名者登入的设定值
anonymous_enable=YES (NO)

设定为允许 anonymous 登入我们的 vsftpd 主机!预设是 YES ,底下的所有相关设定都需要将这个设定为 anonymous_enable=YES 之后才会生效!

anon_world_readable_only=YES (NO)
仅允许 anonymous 具有下载可读文件的权限,预设是 YES。

anon_other_write_enable=YES (NO)
是否允许 anonymous 具有写入的权限?预设是 NO!如果要设定为 YES, 那么开放给 anonymous 写入的目录亦需要调整权限,让 vsftpd 的 PID 拥有者可以写入才行!

anon_mkdir_write_enable=YES (NO)
是否让 anonymous 具有建立目录的权限?默认值是 NO!如果要设定为 YES, 那么 anony_other_write_enable 必须设定为 YES !

anon_upload_enable=YES (NO)
是否让 anonymous 具有上传数据的功能,默认是 NO,如果要设定为 YES , 则 anon_other_write_enable=YES 必须设定。

deny_email_enable=YES (NO)
将某些特殊的 email address 抵挡住,不让那些 anonymous 登入! 如果以 anonymous 登入主机时,不是会要求输入密码吗?密码不是要您 输入您的 email address 吗?如果你很讨厌某些 email address , 就可以使用这个设定来将他取消登入的权限!需与下个设定项目配合:

banned_email_file=/etc/vsftpd.banned_emails
如果 deny_email_enable=YES 时,可以利用这个设定项目来规定哪个 email address 不可登入我们的 vsftpd 喔!在上面设定的文件内,一行输入一个 email address 即可!

no_anon_password=YES (NO)
当设定为 YES 时,表示 anonymous 将会略过密码检验步骤,而直接进入 vsftpd 服务器内喔!所以一般预设都是 NO

anon_max_rate=0
这个设定值后面接的数值单位为 bytes/秒 ,限制 anonymous 的传输速度,如果是 0 则不限制(由最大带宽所限制),如果您想让 anonymous 仅有 30 KB/s 的速度,可以设定『anon_max_rate=30000』

anon_umask=077
限制 anonymous 的权限!如果是 077 则 anonymous 传送过来的文件 权限会是 -rw-------

关于系统安全方面的一些设定值
ascii_download_enable=YES (NO)
如果设定为 YES ,那么 client 就可以使用 ASCII 格式下载文件。

ascii_upload_enable=YES (NO)
与上一个设定类似的,只是这个设定针对上传而言!预设是 NO

one_process_model=YES (NO)
这个设定项目比较危险一点~当设定为 YES 时,表示每个建立的联机 都会拥有一支 process 在负责,可以增加 vsftpd 的效能。不过, 除非您的系统比较安全,而且硬件配备比较高,否则容易耗尽系统资源一般建议设定为 NO

tcp_wrappers=YES (NO)
当然我们都习惯支持 TCP Wrappers 的 所以设定为 YES

xferlog_enable=YES (NO)
当设定为 YES 时,使用者上传与下载文件都会被纪录起来。记录的文件与下一个设定项目有关:

xferlog_file=/var/log/vsftpd.log
如果上一个 xferlog_enable=YES 的话,这里就可以设定了!这个是登文件的名称

xferlog_std_format=YES (NO)
是否设定为 wu ftp 相同的登录档格式?!预设为 NO ,因为登录档会比较容易读! 不过,如果您有使用 wu ftp 登录文件的分析软件,这里才需要设定为 YES

nopriv_user=nobody
我们的 vsftpd 预设以 nobody 作为此一服务执行者的权限。因为 nobody 的权限 相当的低,因此即使被入侵,入侵者仅能取得 nobody 的权限

pam_service_name=vsftpd
这个是 pam 模块的名称,我们放置在 /etc/pam.d/vsftpd 即是这个

二。

1. 解压软件

[root@redhat local]# tar -zxvf vsftpd-2.3.2.tar.gz //解压vsftp source文件
[root@redhat local]# cd vsftpd-2.3.2 //进入解压后的目录

[root@redhat vsftpd-2.3.2]# more INSTALL //看看安装说明。比如要做什么工作。是个英文文档.

2. 提供安装vsftpd服务的前提条件(根据上面more INSTALL的安装说明)

[root@redhat vsftpd-2.3.2]# useradd nobody //这里需要加一个nobody用户。大家可以使用finger nobody查看下。看是否有这个用户,如果有就不需要加了.

useradd: user nobody exists

[root@redhat vsftpd-2.3.2]# mkdir /usr/share/empty/ //这一步同上。服务器需要一个empty的空目录放在/usr/share/下。可以使用ls /usr/share/empty查看。如果存在就不需要了,这步也可以跳过。

mkdir: 无法创建目录 `/usr/share/empty': 文件已存在

如果需要开启匿名用户访问,需要做下面几步工作
[root@redhat vsftpd-2.3.2]# mkdir /var/ftp/ //创建供匿名用户使用的目录
 [root@redhat vsftpd-2.3.2]# useradd -d /var/ftp ftp //创建ftp用户并且指定家目录为/var/ftp,这个步骤一般的系统也有。如果创建提示:user ftp exists(FTP用户存在)就表示此用户已经存在。

3. 编译源代码及安装

[root@redhat vsftpd-2.3.2]# make //编译二进制文件

问题1.

在执行make命令时却出现了问题,具体如下:
sysdeputil.o: In function `vsf_sysdep_check_auth':
sysdeputil.c:(.text+0x109): undefined reference to `crypt'
sysdeputil.c:(.text+0x13a): undefined reference to `crypt'
collect2: ld 返回 1
make: *** [vsftpd] 错误 1

解决方法:

打开Makefile

vimMakefile

LIBS=`./vsf_findlibs.sh`

末尾增加-lcrypt变成

LIBS=`./vsf_findlibs.sh`-lcrypt

 

 
问题2
install: cannot create regular file `/usr/local/man/man8/vsftpd.8': No such file or directory
install: cannot create regular file `/usr/local/man/man5/vsftpd.conf.5': No such file or directory
make: *** [install] Error 1
解决方法:
root@ubuntu:/home/linting/work/tools/vsftpd-3.0.2# mkdir /usr/local/man/man5
root@ubuntu:/home/linting/work/tools/vsftpd-3.0.2# mkdir /usr/local/man/man8
 
 
root@ubuntu:/home/linting/work/tools/vsftpd-3.0.2# make install
if [ -x /usr/local/sbin ]; then \
install -m 755 vsftpd /usr/local/sbin/vsftpd; \
else \
install -m 755 vsftpd /usr/sbin/vsftpd; fi
if [ -x /usr/local/man ]; then \
install -m 644 vsftpd.8 /usr/local/man/man8/vsftpd.8; \
install -m 644 vsftpd.conf.5 /usr/local/man/man5/vsftpd.conf.5; \
elif [ -x /usr/share/man ]; then \
install -m 644 vsftpd.8 /usr/share/man/man8/vsftpd.8; \
install -m 644 vsftpd.conf.5 /usr/share/man/man5/vsftpd.conf.5; \
else \
install -m 644 vsftpd.8 /usr/man/man8/vsftpd.8; \
install -m 644 vsftpd.conf.5 /usr/man/man5/vsftpd.conf.5; fi
if [ -x /etc/xinetd.d ]; then \
install -m 644 xinetd.d/vsftpd /etc/xinetd.d/vsftpd; fi

4. 安装、编辑配置

[root@redhat vsftpd-2.3.2]# cp vsftpd.conf /etc/ //将默认配置文件考贝到/etc/
[root@redhat vsftpd-2.3.2]# cp RedHat/vsftpd.pam /etc/pam.d/vsftpd //为了让vsftpd支持本地用户登录,我们将身份认证模块文件(PAM安全验证文件)拷贝到验证文件所在的目录。

[root@redhat vsftpd-2.3.2]# vi /etc/vsftpd.conf
  然后按,跳到行尾。设置 pam_server_name=vsftpd(要与你的PAM文件同名);userlist_enable=YES(用户列表的用户不允许登入服务器)。然后:wq保存退出

[root@redhat vsftpd-2.3.2]# cp vsftpd.conf.5 /usr/local/man/man5
 [root@redhat vsftpd-2.3.2]# cp vsftpd.8 /usr/local/man/man8

  基本到这里。所有工作就做完了。

配置vsftpd服务

服务的启动与停止
启动服务之前,我们先编辑配置文件/etc/vsftpd.conf. 打开配置文件后可以看到许多以“#”开始的行,这些行都是注释行,大多是帮助信息,可以仔细阅读。vsftpd.conf文件的所有项目都是以“参数=值 ”来设置的,对格式要求比较严格,必须严格区分大小写,等号两边不能有空格,每行的最后也不能有空格。每个参数都有一个默认值,没有在配置文件中明确指定 的参数就会使用默认值。我们这里不理会配置文件本来的信息,把所有内容都删掉或注释掉,最后加上下面四行,每行右边的//及后的文字是含义说明,不要输入 到文件中:
listen=yes //vsftpd工作在standalone 模式下
anonymous_enable=yes //允许匿名用户登陆服务器
local_enable=yes //允许本地用户登录到服务器
pam_service_name=vsftpd //使用PAM认证

vsftpd有两种工作模式,standalone模式和xinetd守护进程模式,第1行就是让其工作在standalone模式下。此种模式中,每次 修改配置文件必须重新启动vsftpd服务才能生效,关于两种模式在后面有详细介绍。我们安装时还把 Redhat 目录下的 vsftpd.pam 文件复制成了/etc/pam.d/vsftpd 文件。这个文件就是本地用户登陆的 pam 验证配置文件。关于这个文件我们会在后面具体介绍。这里我们要知道,必须得有这个配置文件,而且主配置文件里要加上 pam_service_name=vsftpd语句,我们才能让本地用户登陆。用以下命令启动服务:
[root@redhat vsftpd-2.3.2]# /usr/local/sbin/vsftpd & //后台启动vsftp

问题3:

500 OOPS: bad bool value in config file for: anonymous_enable

看似配置文件错误,看了一下配置相应的行: anonymous_enable=NO 语句没什么错误,不过把这行注释后又到下一行报错,看来是整个文件都有问题,百度了一下,大部分都是说语句后面不能有多余的空格,但是用VI看来不了行末是否有多余的字符,干脆把配置文件下载下来,发现这个文件是一般PC(WINDOWS,CRLF)的格式的,所文件改为UNIX(LF)格式再上传,VSFTP就可以启动了

以下 sed 调用将把 DOS/Windows 格式的文本转换成可信赖的 UNIX 格式:

$ sed -e 's/.$//' mydos.txt > myunix.txt

怎么查看一个既有文件的格式:

unix上: file filename

为保证服务确实启动,我们用如下命令检测:
[root@redhat vsftpd-2.3.2]# netstat -an |grep 22
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN
我们看到服务器已经打开了tcp21端口,表明ftp确实已经启动。

再登录服务器:
[root@redhat vsftpd-2.3.2]# ftp 127.0.0.1
Connected to 127.0.0.1.
220 (vsFTPd 2.0.5)
530 Please login with USER and PASS.
530 Please login with USER and PASS.
KERBEROS_V4 rejected as an authentication type
Name (127.0.0.1:root): ftp
331 Please specify the password.
Password:
230 Login successful.
这时我们已经用匿名用户(用户名ftp或anonymous,密码任意)登录到服务器了,还可以用本地用户登录。我们做测试时建议使用如上所示的ftp命 令(windows、Linux及Unix都带这个命令,用法都是一样的)来登录服务器,这样可以看到更详细的信息,对于我们调试服务器是非常有帮助的。 最简单的ftp服务器就已经达建起来了。

使用如下命令关闭ftp服务:
[root@redhat vsftpd-2.3.2]# killall vsftpd //或是 pkill vsftpd

[root@redhat vsftpd-2.3.2]# pgrep vsftpd //查看vsftpd服务器是否已经关闭

开机自启动
用vi打开etc/rc.local在里面加入/usr/local/bin/vsftpd & 即可。

service vsftpd restart重启vsftpd服务


相关内容