Linux下vsFTP配置全方案(限制用户/端口/速度/空间)

VsFTPd的简述
-------------------------------------------------------------------------
VSFTP(Very Secure FTP Daemon,非常安全的FTP服务器)。顾名思义,VSFTPD设计的出发点就是安全性。同时随着版本的不断升级,VSFTPD在性能和稳定性上也取得了极大的进展。除了安全和性能方面很优秀的外,还有很好的易用性。Red Hat公司在自己的FTP服务器(ftp.redhat.com)上就使用了vsFTPd

Linux下vsFTPD实战方案
-------------------------------------------------------------------------
要求:
1. 用户:netseek_com;FTP:ftp.netseek.com(192.168.0.21,我已经配置好了相关的DNS)
2. 禁止匿名登陆,禁止用户离开用户目录
3. 命令通道端口使用5021,数据通道端口使用5020(你可以改成你想设置的端口如1021,1020)
4. 允许使用被动模式使用端口范围为10010~10020.
5. 用户带宽设置为200kps;用户空间大小限制为300M,允许宽限期限内有10MB的缓冲

具体操作步骤如下:
为了更完全的描述安装全过程,我在我的另一台主机(netseek)上进行配置,在台机IP:192.168.0.20上绑定了192.168.0.21,也配置好了相关的DNS解析,在这里我就不多说了请参照”Linux全能web服务器架设”。
1、配置相关服务
启动服务:
[root@netseek root]# #rpm –qa | grep vsftpd ;查看是否安装vsftpd服务
#/etc/init.d/vsftpd start ;启动服务
#chkconfig vsftpd on ;让系统服务随着系统启动而启动
配置相关文档:
#vi /etc/vsftpd.conf (在ubuntu 10.04中为/etc/vsftpd.conf)
禁止匿名用户访问:
anonymous_enable=YES,将YES改为NO
在文件末尾加如下的设置:
# new added by netseek
listen_port=5021 ;命令通道端口,默认为21
listen_data_port=5020 ;数据通道端口,默认为20
pasv_enable=YES ;允许被动模式
pasv_min_port=10000 ;被动模式使用端口范围
pasv_max_port=10010
local_max_rate=200000 ;用户宽带限制
chroot_local_user=YES ;禁止用户离开主目录
listen_address=192.168.0.21 ;让他监听ip:192.168.0.21
注:在添加过程中请不要加上”;”和这些中文注释,在这里我上为了方便大家了解才加上的。
2、添加虚拟主机用户
添加用户netseek_com,用户目录指定为/var/www/netseek.com,且此用户不能登陆系统.
#mkdir /var/www/netseek.com
#useradd –s /sbin/nologin –d /var/www/netseek.com netseek_com (注意:如果无法登录,问题就在这个命令,如果改为useradd -s /bin/false 那就可以了)
注-s /sbin/nologin是让其不能登陆系统,-d 是指定用户目录为/var/www/netseek.com
#passwd netseek_com 新密码
#chown –R netseek_com:netseek_com /var/www/netseek.com
注:将用户目录及其子目录的所有和所属的组设置为netseek_com
3、配置磁盘配额
我在安装过程中磁盘了多个区,分别/home,/var,/,/www,tmp,swap,/boot多个分区。建议你将磁盘分多个独单的分区,这样可以降低磁盘分区损坏造成的数据丢失风险.
#[root@netseek root]# rpm -qa | grep quota
quota-3.06-9 ; 我的系统已经安装了磁盘配额工具
#vi /etc/fstab
找到类似
LABEL=/var /var ext3 defaults 1 2
在defaults后加入usrquota,改为如下:
LABEL=/var /var ext3 defaults,usrquota 1 2
重新加载/var这个分区:
#mount –o remount /var
#cd /var 进入这个目录
#touch quota.user
#chmod 600 quota.user
#quotacheck –mf /var 对磁盘分区空间使用情况进行强制检测
[root@localhost var]# quotacheck -mf /var
quotacheck: WARNING - Quotafile /var/quota.user was probably truncated. Can't save quota settings...
重新启动系统
第一次运行时都会出现这个警告,再次运行的时候就不会啦
为指定用户定额:
#edquota netseek_com 为用户netseek_com设置磁盘配额。
Disk quotas for user netseek_com (uid 501):
Filesystem blocks soft hard inodes soft hard
/dev/sda5 6616 307200 0 15 0 0
注:
ilesystem blocks soft hard inodes soft hard
filesystem-正在设置的文件系统,不要修改或删除
bolock-当前使用的碰盘空间,单位为KB
soft(第一个)-软磁盘空间限制,默认0,表示无限制,我在这里设为300M。
hard(第一个)-硬配额限制,0表示无限制。
inodes-当前文件数量
soft(第二个)-对文件数量的软限制,0表示无限制
hard(第二个)-对文件数量的硬限制,0表示无限制

让系统启动是自动加载:
#vi /etc/rc.d/rc.local ,加入以下:
/etc/init.d/vsftpd start
/sbin/quotacheck
/sbin/quotaon –avu
现在查看netseek_com 用户使用磁盘空间的情况
[root@localhost ~]# quota -u netseek_com
Disk quotas for user netseek_com (uid 501):
Filesystem blocks quota limit grace files quota limit grace
/dev/sda5 6616 307200 0 15 0 0

注:关于更多的quota命令,请用man命令查看吧,乌哥(VBird)说,我们要学会找男人 !


VsFTPd相关的配置详解
-------------------------------------------------------------------------
1.匿名用户相关设置
anonymous_enable=YES ,如果将YES改为NO, 禁止匿名用户登陆
#non_mkdir_write_enable=YES ,如果将#注释去掉,允许匿名用户创建目录
#non_upload_enalbe=YES ,如果将#去掉,允许匿名用户上传
anon_world_readable_only=YES ,允许匿名用户下载,默认是禁止的,这个可以自行添加。
Anon_other_write_enable=YES ,将其设为YES的话,就除了上传和创建目录外,还可以重命名,删除文件,默认是NO
no_anon_password=NO ,将其设为YES,匿名用户不会查询用户密码直接登陆。
ftp_username=ftp ,匿名用户登陆系统的账号默认为ftp,此项最好不要改,否则设置不当会给系统的安全带来威胁。
2.FTP服务端口的指定
listen_port=8021 ,指定命令通道为8021,默认为21
listen_data_port=8020 ,指定数据通道为8020,默认为20
3.上传模式的设置
pasv_enable=YES ,是否允使用被动模式,默认是允许的。
pasv_min_port=10000 ,指定使用被动模式时打开端口的最小值
pasv_max_port=10004 ,指定使用被动模式时打开端口的最大值。
4.Vsftp服务器指定IP地址
listen_address=192.168.0.21 ,指定FTP,IP地址
注:只有当vsftp运行于独立模式时才允许使用指定IP,如果在/etc/xinetd.d目录下已经建立了vsftpd文件,就要将该文件中的disable设置为yes,方可。
5. 锁定用户,禁止用户离开用户主目录
chroot_local_user=YES ,将其设为YES,则将把所有FTP用户都锁定在用户主目录(如果需要再对某些用户例外,则可以启用下面两行配置),设为NO则表示允许切换(当然还要看chroot_list_enable的设置)
#chroot_list_enable=YES ,当上面chroot_local_user为NO时,可以通过启用这项来将指定用户设置为锁定用户主目录。当上面为YES,可以通过启用这项来将指定用户设置为不锁定到用户主目录。
#chroot_list_file=/etc/vsftpd.chroot_list ,在该文件中加入用户名单,如: netseek_com
6.FTP服务器的流量控制
max_clients=100 ;允许的最大连接数,定义为100,默认为0,表没有限制
max_per_ip=5 ;每个IP允许的连接数,0表没有限制,需要运行于独立模式方可
anon_max_rate=50000 ;匿名用户最大带宽,单位为bps
local_max_rate=200000 ;系统用户最大带宽
如何对指定用户进行流量限制呢?
#vi /etc/vsftpd.conf,添加一行:
user_config_dir=/etc/vsftpd/userconf
#touch /etc/vsftpd/userconf/netseek_com 为netseek_com这个用户建立一个netseek_com文件
#vi /etc/vsftpd/userconf/netseek_com 添加以下内容
local_max_rate=100000
保存重启服务即可.
7.定制欢迎信息
目录说明设置
#vi /etc/vsftpd.conf
#dirmessage_enable=YES,前的#去掉。
然后我们定制一个.message,写上你想写的东西,然后把这个文件复制到各个用户的家目录中,就OK。

系统欢迎消息设置
ftpd_banner=Welcome to ftp.netseek.com , Yeah!!!
系统欢迎消息文件设置
banner_file=/etc/vsftpd/welcome 与ftpd_banner相类似,不同之处在于,banner_file指定欢迎文件.


配置实例
----------------------------------------
1、只能上传。不能下载、删除、重命名。
cmds_allowed=FEAT,REST,CWD,LIST,MDTM,MKD,NLST,PASS,PASV,PORT,PWD,QUIT,RMD,SIZE,STOR,TYPE,USER,ACCT,APPE,CDUP,HELP,MODE,NOOP,REIN,STAT,STOU,STRU,SYST
对于参数的详细的解释
cmds_allowed=ABOR,ACCT,APPE,CWD,CDUP,DELE,HELP,LIST,MODE,MDTM,MKD,NOOP,NLST,PASS,PASV,PORT,PWD,QUIT,REIN,RETR,RMD,RNFR,RNTO,SITE,SIZE,STOR,STAT,STOU,STRU,SYST,TYPE,USER
CWD - change working directory 更改目录
DELE - delete a remote file 删除文件
LIST - list remote files 列目录
MKD - make a remote directory 新建文件夹
NLST - name list of remote directory
PWD - print working directory 显示当前工作目录
RETR - retrieve a remote file 下载文件
RMD - remove a remote directory 删除目录
RNFR - rename from 重命名
RNTO - rename to 重命名
STOR - store a file on the remote host 上传文件

# ABOR - abort a file transfer 取消文件传输
# CWD - change working directory 更改目录
# DELE - delete a remote file 删除文件
# LIST - list remote files 列目录
# MDTM - return the modification time of a file 返回文件的更新时间
# MKD - make a remote directory 新建文件夹
# NLST - name list of remote directory
# PASS - send password
# PASV - enter passive mode
# PORT - open a data port 打开一个传输端口
# PWD - print working directory 显示当前工作目录
# QUIT - terminate the connection 退出
# RETR - retrieve a remote file 下载文件
# RMD - remove a remote directory
# RNFR - rename from
# RNTO - rename to
# SITE - site-specific commands
# SIZE - return the size of a file 返回文件大小
# STOR - store a file on the remote host 上传文件
# TYPE - set transfer type
# USER - send username
# less common commands:
# ACCT* - send account information
# APPE - append to a remote file
# CDUP - CWD to the parent of the current directory
# HELP - return help on using the server
# MODE - set transfer mode
# NOOP - do nothing
# REIN* - reinitialize the connection
# STAT - return server status
# STOU - store a file uniquely
# STRU - set file transfer structure
# SYST - return system type
2、只能下载。不能上传、删除、重命名。write_enable=NO
3、只能上传、删除、重命名。不能下载。download_enable=NO
4、只能下载、删除、重命名。不能上传。
cmds_allowed=FEAT,REST,CWD,LIST,MDTM,MKD,NLST,PASS,PASV,PORT,PWD,QUIT,RMD,RNFR,RNTO,RETR,DELE,SIZE,TYPE,USER,ACCT,APPE,CDUP,HELP,MODE,NOOP,REIN,STAT,STOU,STRU,SYST


###################虚拟用户设置###################
说明:如果只是想让某FTP用户无法通过FTP访问别的目录,直接用chroot_local_user就好了。但如果该用户通过SSH或直接在本机登陆,还是能看到其它目录的(虽然可以通过用chmod o-rwx把所有目录文件都设置为不允许其它组查看,但这样会使系统出问题。虽然也可以一个一个目录设置,但子目录就不太好控制了)。如果只想让某用户能通过FTP访问某指令目录,或者想方便地控制每个用户的权限,还是用虚拟用户最方便)
虚拟用户使用PAM认证方式。
pam_service_name=vsftpd.virtual  #设置PAM使用的名称(将会在下面创建这个新文件),默认值为/etc/pam.d/vsftpd
check_shell=YES   #注意:仅在没有pam验证版本时有用,是否检查用户有一个有效的shell来登录
guest_enable= YES/NO  #启用虚拟用户。默认值为NO。
guest_username=ftp  #这里用来映射虚拟用户。默认值为ftp。
virtual_use_local_privs=YES/NO #当该参数激活(YES)时,虚拟用户使用与本地用户相同的权限。反之,虚拟用户使用与匿名用户相同的权限。默认情况下此参数是关闭的(NO)。

首先先新建文件夹
sudo mkdir /home/vsftpd
cd /home/vsftpd
sudo mkdir down upload wsn
(1)、创建虚拟用户数据库
新建loguser.txt文件,
$sudo vi /etc/vsftpd_login.txt
里面输入虚拟用户名和密码,格式如下
nan306
mima11111111111
wsn
mima22222222222
upload
mima33333333333
down
mima44444444444
注意不要多空格和空行,其中nan306,upload等为虚拟用户名,另外两行为相应密码
生成数据库
先装一个软件
$sudo apt-get install db4.7-util
然后执行
$sudo db4.7_load -T -t hash -f /etc/vsftpd_login.txt /etc/vsftpd_login.db
最后设置一下数据库文件的访问权限
$sudo chmod 600 /etc/vsftpd_login.db
配置PAM文件
$sudo vi /etc/pam.d/vsftpd.virtual
输入内容如下:
auth required /lib/security/pam_userdb.so db=/etc/vsftpd_login
account required /lib/security/pam_userdb.so db=/etc/vsftpd_login
* 我们上一步建立的数据库 vsftpd_login 在此处被使用
* 我们建立的虚拟用户将采用PAM进行验证,这是通过/etc/vsftpd.conf文件中的 语句pam_service_name=vsftpd.virtual来启用的,稍后你将发现。
(2)、为虚拟用户建立本地用户
新建一个系统用户virtual,用户家目录为/home/vsftpd, 用户登录终端设为/bin/false(即使之不能登录系统)
udo useradd virtual -d /home/vsftpd -s /bin/false
sudo chown virtual:virutal /home/vsftpd
现在为止,我们的3个用户都可以工作了,可是它们的根目录现在都是/home/vsftpd,权限也都一样。 那么怎么才能完成我们预定的目标呢?
(3)新建etc/vsftpd_user_conf文件夹
在上面的配置中,有这么一行  user_config_dir=/etc/vsftpd/vsftpd_user_conf
现在,我们要把各个用户的配置文件放到目录/etc/vsftpd/vsftpd_user_conf中
sudo mkdir /etc/vsftpd/vsftpd_user_conf
cd /etc/vsftpd/vsftpd_user_conf
sudo touch nan306 wsn upload down

每个文件既为一个配置文件,如nan306是个系统管理用户,里面配置如下:
打开nan306
sudo vi /etc/vsftpd/vsftpd_user_conf/nan306
里面添加
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
这里要注意不能有空格,不然登录的时候会提示出错。下同

wsn用了管理wsn文件夹,配置如下:
打开wsn
sudo vi /etc/vsftpd/vsftpd_user_conf/wsn
里面添加
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/wsn
wsn目录下面还要挂载down文件夹的虚拟路径
在wsn目录下新建目录down
sudo mkdir /home/vsftpd/wsn/down
然后系统启动是将/home/vsftpd/down挂载到/home/vsftpd/wsn/down
改写/etc/rc.local实现开机启动
sudo vi /etc/rc.local
添加    mount –bind /home/vsftpd/down /home/vsftpd/wsn/down

upload目录中
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/upload

down目录中
local_root=/home/vsftpd/upload

至此配置完了。重启vsftpd我们就可以看到效果了^_^
/etc/init.d/vsftpd restart

500 OOPS: cannot change directory:

linux打开ftp遇到的问题 500 OOPS: cannot change directory:

google好多都是 执行下面的就OK了
setsebool ftpd_disable_trans 1
service vsftpd restart

但是执行的时候遇到这个问题  Could not change active booleans: Invalid boolean

搜了好久终于解决

setsebool -P ftp_home_dir=1

###################访问控制设置###################
两种控制方式:一种控制主机访问,另一种控制用户访问。
1、控制主机访问:
tcp_wrappers=YES/NO
设置vsftpd是否与tcp wrapper相结合来进行主机的访问控制。默认值为YES。如果启用,则vsftpd服务器会检查/etc/hosts.allow 和/etc/hosts.deny 中的设置,来决定请求连接的主机,是否允许访问该FTP服务器。这两个文件可以起到简易的防火墙功能。
比如:若要仅允许192.168.10.1—192.168.10.254的用户可以连接FTP服务器,则在
/etc/hosts.allow
/etc/hosts.deny
文件中添加以下内容:
vsftpd:192.168.1.
vsftpd:192.168.1.12
vsftpd:192.168.1.0/255.255.255.0这里不能写成192.168.1.0/24
2、控制用户访问:
vsftpd.ftpusers  #用于保存不允许进行FTP登录的本地用户帐号。就是vsftp用户的黑名单
vsftpd.user_list
(1)设置禁止vsftpd.user_list文件中的用户登录:要在主配置文件vsftpd.conf中修改如下两项,
userlist_enable=yes
userlist_deny=yes
说明:配置完以后,除了vsftpd.ftpusers文件和vsftpd.user_list文件中记录的ftp用户不能登录vsftp服务以外,其他的ftp用户都可以登录。
(2)设置只允许vsftpd.user_list文件中的用户登录;同样的道理要把主配置文件vsftpd.conf 中的语句修改如下两项:
userlist_enable=yes
userlist_deny=no
 说明:配置完以后,只允许vsftpd.user_list文件中记录的ftp用户能登录vsftp服务,其他的ftp用户都不可以登录。


################### 山风 实战记录 ###################

实战问题:为什么我设置了local_umask=002,却还是只有上传者自己有权限呢?
drwx------ 2 ftpvirtual www-data 4096 2015-02-06 08:50 111
drwx------ 2 ftpvirtual www-data 4096 2015-02-06 09:38 222

试了整整一天,终于发现了这个规率:
当在/etc/vsftpd.conf设置virtual_use_local_privs=NO时,无论我在虚拟用户配置文件中怎么改local_umask,上传的文件永远都是属于www-data且只有属主是rw组和其它都是空权限(即使我在虚拟用户配置文件中另外指定了chown_uploads=YES和chown_username=lanyd都没用,还是使用/etc/vsftpd.conf中的chown_username?),即虚拟用户配置文件中真正生效的只有下面几个:
local_root=/var/www
write_enable=YES
download_enable=NO

另外,anon_upload_enable=YES以及其它几个anon开头的好像也是有效,如果这个设置为NO就无法上传文件!我只是觉得有点奇怪,这个明明是给匿名用户的,为什么也会影响虚拟用户?虚拟用户明明是绑定到一个LOCAL用户的啊。
更神奇的是anon_world_readable_only=yes 。这个从字面上看是“匿名用户世界只读”,如果为YES应该是表示只读,可实际上却表示不返回文件目录列表!请取的名字啊,神经真大条

如果我在/etc/vsftpd.conf设置virtual_use_local_privs=YES时,local_umask、chown_username和anon开头的指令无论是何处的都不生效了,而是由linux系统根据宿主用户ftpvirtual对目录文件的权限来决定的(自动从上级目录中继承而来)


最后,我特别想知道的是,难道vsFTP就没有办法让虚拟用户也能有自己的umask和chown_username吗?有知道的大神指教一下,先谢过了

 

你可能感兴趣的:(开源Linux,服务器配置优化)