ftp基本知识vsftpd的名字代表“very secure FTP daemon”,它的开发者Chris Evans考虑的首要问题就是数据传输的安全性。所以,在上述所有的特性当中,较高的安全性是处于最重要的地位。vsftpd比其他诸如Wu-ftpd和 Proftpd之类的FTP服务器更加优越。另外,在速度方面,据统计,使用ASCⅡ模式下载数据的速度是Wu-ftpd的两倍。在Linux2.4系列版本的内核下,千兆以太网的下载速度可以达到86MB/S;在稳定性方面,根据ftp.redhat.com的数据,它可以支持15000个并发用户,所以其总体性能也是非常高的,vsftpd在安全性、高性能及稳定性三个方面有上佳的表现。它提供的主要功能包括虚拟IP设置、虚拟用户、Standalone、inetd操作模式、强大的单用户设置能力及带宽限流等。在安全方面,它从原理上修补了大多数Wu-FTP、ProFTP,乃至BSD-FTP的安装缺陷,使用安全编码技术解决了缓冲溢出问题,并能有效避免“globbing”类型的拒绝服务攻击。目前正在使用vsftpd的官方网站有Red Hat、SuSE、Debian、GNU、GNOME、KDE、Gimp和OpenBSD等。
linux里有三个主要的FTP服务器,分别是VsFTPd、ProFTPd和Pure-FTPd,其中VsFTPd以安全和性能著称,ProFTPd则以众多的特性取胜,Pure-FTPd的性能和特性介乎两者中间
论坛很多都是介绍怎么配置ftp的,这里就只说下关于ftp的一点基本知识
ftp使用者的分类,根据服务器对象的不同将ftp使用者分为3类
1:本地用户(real用户)
2:虚拟用户(guest用户)
3:匿名用户
本地用户:如果用户在远程ftp服务器上拥有服务器的本地帐号,本地用户可以通过输入自己的帐号和口令来进行授权登陆
虚拟用户:如果用户在远程ftp服务器上拥有帐号,且此帐号只能用于文件的传输服务,则称此用户为虚拟用户或guest用户(实际多个虚拟用户只是本地一个用户的影射)
匿名用户:如果用户在远程ftp服务器上没有帐号,则称此用户为匿名用户
ftp协议中定义的典型消息,用来判断问题
125 :数据连接打开,传输开始
200 :命令ok
226 :数据传输完毕
331 :用户名OK,需要输入密码
425 :不能打开数据连接
426 :数据连接被关闭,传输被中断
452 :错误写文件
500 :语法错误,不可识别的命令
530 :未登入。
基本命令:
这里说下建立ftp可能会涉及到的一些命令
ls (显示目录列表,如果太多,可以使用分页命令:ls /etc | more ,按q结束)
touch (建立文件,注意是文件,不是目录)
cp (复制文件或目录,如:cp /etc/vsftpd.conf /home/xxx 复制vsftpd.conf到/home/xxx目录下)
mv (移动文件或目录或改名 如:mv /home/xxx.conf /etc/ 移动/home/xxx.conf到/etc下)
rm (删除文件或目录 如果删除目录需要加 -R 参数)
cd (切换路径,可以用tab键补全路径 cd ..代表退到上个路径)
mkdir (建立目录)
chown (改变目录或文件所有者,如 sudo chown root.root /etc/vsftpd.conf 所有者和组都为root)
chmod (改变目录或文件权限,配合ls -l使用)
(如,chmod ugo+rwx /home/ftp/xxx
u:文件或目录所有者的权限
g:组的权限
o:其他用户权限
+添加权限
-减少权限
r w x (读,写,执行)
)
ls -l (查看文件或目录权限等信息
ftp的数据传输模式
可能很多人都感到pasv_enable这个参数很奇怪,只是默认是打开的,所以很多人不关心它
这里就要说下ftp的传输模式,分为2种模式
1:主动模式(Active FTP)
2:被动模式(Passive FTP)
主动模式:简单说就是客户提交请求到服务器21端口,然后监听,服务器用默认20端口连接客户监听的端口,进 行数据传输
就是说是服务器向客户发起一个用于传输的连接。
被动模式:客户提交请求到服务器21端口,然后开启x端口,再向服务器发送PASV命令,告诉服务器自己处于被动模式,服务器收到命令,就会开放一个p端口监听,然后通知客户自己数据端口p,客户收到命令,又会开启一个端口v进行连接服务器的p端口,然后两个v-p端口进行数据传输,就是说数据传输是客户发起的,相对服务器就是被动的。
(被动模式通常用在处于防火墙之后的FTP客户端访问外界FTP服务器的情况,因为防火墙通常配置是不允许外界访问防火墙之后的机器,只允许由防火墙之后的主机发起的连接请求)
vsftpd主配置文件常用参数说明:
listen=<YES/NO> :设置为YES时vsftpd以独立运行方式启动,设置为NO时以xinetd方式启动(xinetd是管理守护进程的,将服务集中管理,可以减少大量服务的资源消耗)
listen_port=<port> :设置控制连接的监听端口号,默认为21
listen_address=<ip address> :将在绑定到指定IP地址运行,适合多网卡
connect_from_port_20=<YES/NO> :若为YES,则强迫FTP-DATA的数据传送使用port 20,默认YES
pasv_enable=<YES/NO> :是否使用被动模式的数据连接,如果客户机在防火墙后,请开启为YES
pasv_min_port=<n>
pasv_max_port=<m> :设置被动模式后的数据连接端口范围在n和m之间,建议为50000-60000端口
message_file=<filename> :设置使用者进入某个目录时显示的文件内容,默认为 .message
dirmessage_enable=<YES/NO> :设置使用者进入某个目录时是否显示由message_file指定的文件内容
ftpd_banner=<message> :设置用户连接服务器后的显示信息,就是欢迎信息
banner_file=<filename> :设置用户连接服务器后的显示信息存放在指定的filename文件中
connect_timeout=<n> :如果客户机连接服务器超过N秒,则强制断线,默认60
accept_timeout=<n> :当使用者以被动模式进行数据传输时,服务器发出passive port指令等待客户机超过N秒,则强制断线,默认60
accept_connection_timeout=<n> :设置空闲的数据连接在N秒后中断,默认120
data_connection_timeout=<n> : 设置空闲的用户会话在N秒后中断,默认300
max_client=<n> : 在独立启动时限制服务器的连接数,0表示无限制
max_per_ip=<n> :在独立启动时限制客户机每IP的连接数,0表示无限制(不知道是否跟多线程下载有没干系)
local_enable=<YES/NO> :设置是否支持本地用户帐号访问
guest_enable=<YES/NO> :设置是否支持虚拟用户帐号访问
write_enable=<YES/NO> :是否开放本地用户的写权限
local_umask=<nnn> :设置本地用户长传的文件的生成掩码,默认为077
local_max_rate<n> :设置本地用户最大的传输速率,单位为bytes/sec,值为0表示不限制
local_root=<file> :设置本地用户登陆后的目录,默认为本地用户的主目录
chroot_local_user=<YES/NO> :当为YES时,所有本地用户可以执行chroot
chroot_list_enable=<YES/NO>
chroot_list_file=<filename> :当chroot_local_user=NO 且 chroot_list_enable=YES时,只有filename文件指定的用户可以执行chroot
anonymous_enable=<YES/NO> :设置是否支持匿名用户访问
anon_max_rate=<n> :设置匿名用户的最大传输速率,单位为B/s,值为0表示不限制
anon_world_readable_only=<YES/NO> 是否开放匿名用户的浏览权限
anon_upload_enable=<YES/NO> 设置是否允许匿名用户上传
anon_mkdir_write_enable=<YES/NO> :设置是否允许匿名用户创建目录
anon_other_write_enable=<YES/NO> :设置是否允许匿名用户其他的写权限(注意,这个在安全上比较重要,一般不建议开,不过关闭会不支持续传)
anon_umask=<nnn> :设置匿名用户上传的文件的生成掩码,默认为077
anon_root=<file> :设置匿名用户登陆后的目录
no_anon_password=<YES/NO> :设置匿名用户登陆是否询问密码
ascii_download_enable=<YES/NO>
ascii_upload_enable=<YES/NO> :一般为NO,启动这个可能会导致DoS的攻击
hide_ids=<YES/NO> :如果启动,所有档案拥有者与组群都为FTP,也是就ls -l之类指令看到的拥有者和组均为FTP
ls_recurse_enable=<YES/NO> :启动此功能,则允许登录者使用ls -R这个指令,默认为NO
tcp_wrappers=<YES/NO> :设置服务器是否支持tcp_wrappers(就是支持/etc/hosts.allow和/etc/hosts.deny这两个文件)
pam_service_name=vsftpd :设置PAM模块的名称
xferlog_enable=<YES/NO> :是否启动FTP日志记录
xferlog_file=/var/log/vsftpd.log :设置日志记录文件的名称
xferlog_std_format=<YES/NO> :当设置为YES时,将使用与wu-ftpd相同的日志记录格式
问题篇-------------------------------
1.匿名用户问题
下面说下匿名用户上传的问题
要使匿名用户可以上传,需要激活两个选项,
1.anon_upload_enable=YES
2.anon_mkdir_write_enable=YES
然后打开写权限:write_enable=YES
同时还要anon_world_readable_only=NO ,开放匿名用户对整个服务器的浏览权限。
需要注意的是匿名用户对文件权限而言,属于其他用户,所以一定要把允许匿名用户上传目录的权限修改为其他用户可写,如果配置anon_root=/home/ftp ( 匿名的根目录为/home/ftp)
那么/home/ftp的其他用户权限就不能有写权限,如果根目录所有者是ftp的话,所有者的权限也不能有w,否则出同样的错误
可以在建立个文件/home/ftp/public目录,打开public其他用户的写权限,就可以个public上传了(匿名用户根目录是不可以有写权限的),如果只让下载,就可以再建立目录
/home/ftp/down 然后设置其他用户没有写权限就可以了
需要注意的是anon_other_write_enable这个参数,YES会开放文件更名,删除文件等权限,官方是不建议开启的,但关闭会无法进行续传,
这就需要管理员作出权衡了
(这里解释下续传的问题,就我自己的理解续传是指:在已经上传的文件目录中继续添加文件或目录
如果继续使用默认的022文件掩码,就会产生不能续传问题,因为022不允许写入,
当然你可以打开anon_other_write_enable来解决,不过就会产生混乱,安全问题
这时候文件掩码就很重要了,下边会介绍到文件掩码,你可以根据自己的环境设置
)
2.文件掩码问题
在配置文件中有umask=xxx的参数,这个参数挺让新手费解的,其实它的意思简单
:建立的文件不能拥有的权限
相信大家都见过,sudo chmod 777 /xxx/xxx
其实umask的数值和那个777是一样的系统,8进值表示的权限
第一个是目录所有者权限,第二个是组的权限,第三个是其他用户权限。
有关umask的有这几个参数:
local_umask,anon_umask.
分别代表本地用户,和匿名用户的文件掩码。
可以根据不同需要设置用户创建文件的权限。
umask还是比较重要的,设置好的话,可以很省事,而且安全
下边是关于8近制权限的列表:
0:没有权限
1:允许执行
2:允许写入
3:允许执行和写入
4:允许读取
5:允许执行和读取
6:允许写入和读取
7:允许执行,写入和读取
3.虚拟用户问题
首先要了解,虚拟用户和本地用户是不可以同时存在的
关于虚拟用户的设置论坛里有很多,我只实验了一种可以完整配置成功
特别提醒,必须把local_enable=YES打开才能允许虚拟用户登录
这里要说的是关于虚拟用户权限的问题
虚拟用户本质上是本地用户的一个影射,默认的文件掩码是077,这是有原因的
对与虚拟用户这个团体来说用到的权限只跟文件的所有者的权限有关,就是第一组的rwx
虚拟用户要访问另一个虚拟用户的文件,除了需要可以浏览到对方文件外,就需要相应的权限了
能看到文件,就需要有r权限
如果要进入目录,就需要x权限
要想写入目录,就需要w权限
另外提下,在每个虚拟用户各自的配置文件中,更改anon_umask可以改变每个用户上传的文件掩码,但必须在主配置文件中注释掉local_umask。
4.本地用户的访问控制
论坛的置顶贴中有一个简单的ftp,是一个本地用户的配置,实际中可能不只需要一个
这里就说下本地用户的访问控制,基本有两种方法
都是通过修改主配置文件:
1:指定的本地用户不能访问,其他可以访问
userlist_enable=YES
userlist_deny=YES
userlist_file=/etc/vsftpd.user_list (这个文件需要自己建立,并添加不能访问的用户名)
2:指定的本地用户可以访问,其他不可以(这个比较常用)
userlist_enable=YES
userlist_deny=NO
userlist_file=/etc/vsftpd.user_list(同上,添加可以访问的用户名)
关于chroot的配置1:如果想把所有用户都限制在主目录内活动可以使用下边配置
chroot_local_user=YES
chroot_list_enable=YES(这行可以没有, 也可以有)
chroot_list_file=/etc/vsftpd.chroot_list
那么, 凡是加在文件vsftpd.chroot_list中的用户都是不受限止的用户
即, 可以浏览其主目录的上级目录.
2: 如果不希望某用户能够浏览其主目录上级目录中的内容,可以如上设置, 然后在
文件vsftpd.chroot_list中不添加该用户即可(此时, 在该文件中的用户都是可以浏览其主目录之外的目录的).
或者, 设置如下
chroot_local_user=NO
chroot_list_enable=YES(这行必须要有, 否则文件vsftpd.chroot_list不会起作用)
chroot_list_file=/etc/vsftpd.chroot_list
然后把所有不希望有这种浏览其主目录之上的各目录权限的用户添加到文件vsftpd.chroot_list(此时, 在该文件中的用户都是不可以浏览其主目录之外的目录的)
最后要说下tcp_wrappers参数,这个参数是为独立启动vsftpd提供基于主机的访问控制的配置,可以限制特定主机访问,又可以对不同主机或
网络实施不同的配置(可以理解为不同的待遇)
tcp_wrappers使用/etc/hosts.allow和/etc/hosts.deny两个配置文件实现访问控制,hosts.allow是一个许可表,hosts.deny是一个拒绝表
在hosts.allow中也可以使用DENY,所以通常可以只使用hosts.allow来实现访问控制。
对vsftpd而言,书写hosts.allow有三种语法形式
1: vsftpd:主机表 (设置允许访问的主机表)
2: vsftpd:主机表:DENY (设置拒绝访问的主机表)
3: vsftpd:主机表:setenv VSFTPD_LOAD_CONF 配置文件名 (对指定的主机使用另外的配置)
setenv VSFTPD_LOAD_CONF的值为指定的配置文件名,意图是让vsftpd守护进程读取新的配置项来覆盖主配置文件中的项,实现特定待遇
这有一个小例子来说明tcp_wrappers
功能:
》1.拒绝192.168.2.0/24访问
》2.对192.168.1.0/24内的所有主机不作连接限制和最大传输速率限制
》3.对其他主机的访问限制为:每ip连接数为1,最大传输速率为10kb/s (在主配置文件中设置就好了)
首先保证设定tcp_wrappers=YES
然后编辑 sudo vi /etc/hosts.allow 输入
vsftpd:192.168.2.0/24: DENY (阻止192.168.2.0子网的访问)
vsftpd:192.168.1.0/24 (允许192.168.1.0子网的访问)
vsftpd:192.168.1.0/24: setenv VSFTPD_LOAD_CONF /etc/xxx.conf (对192.168.1.0/24指定专有配置文件xxx.conf,xxx可以自己指定文件名,需要建立)
然后建立xxx.conf文件,并编辑 (建立文件可以用sudo touch /etc/xxx.conf建立)
local_max_rate=0
anon_max_rate=0
max_per_ip=0
!
Read more...