天天看点

RHEL6基础四十六之RHEL文件服务器VSFTP简介

VSFTP介绍:

   linux 系统下常用的FTP 是vsftp, 即Very Security File Transfer Protocol.是一种在GPL许可下开放源代码、安全、快速、稳定的FTP服务器,能够高效地处理大量的并发连接,所有服务里面只有vsftpd没有依耐关系.还有一个是proftp(Profession ftp)。

VSFTP端口和协议:

   控制连接:标准端口为21/tcp,用于发送FTP命令信息。

   数据连接:标准端口为20/tcp,用于上传、下载数据。

VSFTP数据链接模式:

主动模式(PORT模式):client 先连接服务器的 21端口(命令端口),然后client开放一个大于1024的端口A等待服务器的20端口连接,21号端口的链接建立以后,服务器就用20去连接client开放的A端口。如果client端有个防火墙,服务器的20端口就连接不进入,导致会连接失败.

被动模式(PASV模式):client开启大于1024的B端口连接服务器的21(命令端口),同时开启B+1端口,当21号端口连接成功后,client会发送PASV命令,通知服务器自己处于被动模式,服务器收到这个消息后就会开放一个大于1024的端口C通知client,client接到通知后就会用B+1来连接服务器的C端口.

从C/S模型来说,PORT对于服务器来说是OUTBOUND,而PASV模式对于服务器是INBOUND.一般我们使用的是主动模式

VSFTP数据传输模式:

   文本模式:ASCII模式,以文本序列传输数据。

   二进制模式:Binary模式,以二进制序列(比特流)传输数据。

ASCII模式一般只用于纯文本文件传输,而Binary模式更适合传输程序、图片等文件。尤其是对于可执行文件,如果把可执行文件以文本模式传输,则下载下来的文件将无法正常使用。在rhel6中默认采用二进制模式,在rhel6以前的版本中默认采用文本模式,为了提高可靠性,rhel6不再支持文本模式。

VSFTP用户类型:

   匿名用户:不需要用户名,密码访问服务端。

   本地用户:需要帐户名和密码才能访问。且这个帐户名和密码都是在你linux系统里面已经有的用户。帐号名称、密码等信息保存在passwd、shadow文件中。

   虚拟用户:同样需要用户名和密码才能登录。但是和上面的区别就是,这个用户名和密码,在你linux系统中是没有的(没有该用户帐号),使用独立的帐号/密码数据文件

安装VSFTP服务:

<a href="http://blog.51cto.com/attachment/201312/100724412.png" target="_blank"></a>

1

2

3

4

5

6

7

8

9

10

11

12

<code>[root@justin ~]</code><code># rpm -qa|grep vsftpd</code>

<code>[root@justin ~]</code><code># mount /dev/cdrom /mnt/cdrom/</code>

<code>mount</code><code>: block device </code><code>/dev/sr0is</code> <code>write-protected, mounting </code><code>read</code><code>-only</code>

<code>[root@justin ~]</code><code># find /mnt/cdrom/Packages/ -name *vsftp*</code>

<code>/mnt/cdrom/Packages/vsftpd-2</code><code>.2.2-11.el6.i686.rpm</code>

<code>[root@justin ~]</code><code># rpm -ivh /mnt/cdrom/Packages/vsftpd-2.2.2-11.el6.i686.rpm</code>

<code>warning: </code><code>/mnt/cdrom/Packages/vsftpd-2</code><code>.2.2-11.el6.i686.rpm: Header V3 RSA</code><code>/SHA256Signature</code><code>, key ID fd431d51: NOKEY</code>

<code>Preparing...                </code><code>########################################### [100%]</code>

<code>1:vsftpd                 </code><code>########################################### [100%]</code>

<code>vsftpd-2.2.2-11.el6.i686</code>

<code>[root@justin ~]</code><code>#</code>

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

<code>[root@justin ~]</code><code># iptables -L</code>

<code>Chain INPUT (policy ACCEPT)</code>

<code>target     prot opt sourcedestination</code>

<code>Chain FORWARD (policy ACCEPT)</code>

<code>Chain OUTPUT (policy ACCEPT)</code>

<code>[root@justin ~]</code><code># iptables -I INPUT -p tcp --dport 20 -j ACCEPT</code>

<code>[root@justin ~]</code><code># /sbin/iptables -I INPUT -p tcp --dport 21 -j ACCEPT</code>

<code>ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:</code><code>ftp</code>

<code>ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:</code><code>ftp</code><code>-data</code>

<code>[root@justin ~]</code><code># iptables -nL</code>

<code>ACCEPT     tcp  --  0.0.0.0</code><code>/00</code><code>.0.0.0</code><code>/0tcp</code> <code>dpt:21</code>

<code>ACCEPT     tcp  --  0.0.0.0</code><code>/00</code><code>.0.0.0</code><code>/0tcp</code> <code>dpt:20</code>

<code>[root@justin ~]</code><code># service iptables save</code>

<code>iptables:将防火墙规则保存到 </code><code>/etc/sysconfig/iptables</code><code>:     [确定]</code>

<code>[root@justin ~]</code><code># sestatus</code>

<code>SELinux status:                 disabled</code>

<code>[root@justin ~]</code><code># service iptables restart</code>

<code>iptables:清除防火墙规则:                                 [确定]</code>

<code>iptables:将链设置为政策 ACCEPT:nat filter                [确定]</code>

<code>iptables:正在卸载模块:                                   [确定]</code>

<code>iptables:应用防火墙规则:                                 [确定]</code>

VSFTP服务启动:

<code>[root@justin ~]</code><code># /etc/init.d/vsftpd status</code>

<code>vsftpd 已停</code>

<code>[root@justin ~]</code><code># service vsftpd start</code>

<code>为 vsftpd 启动 vsftpd:                                    [确定]</code>

<code>vsftpd (pid 2293) 正在运行...</code>

<code>[root@justin ~]</code><code># chkconfig --level 35 vsftpd on</code>

<code>[root@justin ~]</code><code># chkconfig --list|grep vsftpd</code>

<code>vsftpd          0:关闭    1:关闭    2:关闭    3:启用    4:关闭    5:启用    6:关闭</code>

VSFTP服务配置文件说明:

<code>[root@justin logrotate.d]</code><code># cd</code>

<code>[root@justin ~]</code><code># cd /etc/vsftpd/</code>

<code>[root@justin vsftpd]</code><code># ls</code>

<code>ftpusers  user_list  vsftpd.conf  vsftpd_conf_migrate.sh</code>

<code>[root@justin vsftpd]</code><code>#</code>

/etc/vsftpd是vsftpd服务配置文件存放目录,

ftpusers:用户控制文件,在这个文件里面的用户,默认是不可以使用vsftpd服务的

user_list:默认功能和第一个一样,但是通过配置,我们可以让只有在这个文件里的用户才能使用vsftpd服务,这样新加入的用户就不会自动拥有vsftp的使用权,这样可以让vsftpd服务器更加安全

vsftpd_conf_migrate.sh:vsftpd操作的一些变量和设置,这个不用管的

vsftpd.conf:vsftpd主配置文件,

<code>[root@justin vsftpd]</code><code># cat /etc/passwd|grep ftp</code>

<code>ftp</code><code>:x:14:50:FTP User:</code><code>/var/ftp</code><code>:</code><code>/sbin/nologin</code>

<code>[root@justin vsftpd]</code><code># ll -d /var/ftp/</code>

<code>drwxr-xr-x 3 root root 4096 12月 24 10:05 </code><code>/var/ftp/</code>

安装好FTP后会生成一个用户ftp,ftp为匿名用户登陆用户名,其家目录不在/home下而是/var/ftp,目录权限为755,注意这个权限不能改变

其他配置文件:

配置文件名

功能

/usr/sbin/vsftpd

vsftpd的主程序

/etc/rc.d/init.d/vsftpd

启动脚本

/etc/pam.d/vsftpd

PAM认证文件

/etc/vsftpd/ftpusers

禁止使用vsftpd的用户列表文件

/etc/vsftpd/user_list

禁止或允许使用vsftpd的用户列表文件

/var/ftp

匿名用户主目录

/var/ftp/pub

匿名用户的下载目录

/etc/logrotate.d/vsftpd.log

vsftpd的日志文件

ftpusers不受任何配制项的影响,它总是有效,它是一个黑名单!该文件存放的是一个禁止访问FTP的用户列表,通常为了安全考虑,管理员不希望一些拥有过大权限的帐号(比如root)登入FTP,以免通过该帐号从FTP上传或下载一些危险位置上的文件从而对系统造成损坏。

user_list则是和vsftpd.conf中的userlist_enable和userlist_deny两个配置项紧密相关的,它可以有效,也可以无效,有效时它可以是一个黑名单,也可以是一个白名单!

ftpusers和user_list没有任何关系,ftpusers文件总是生效,user_list则取决于userlist_enable和userlist_deny两项配置。

主配置文件/etc/vsftpd/vsftpd.conf里的各项参数作用文件里都有注释说明:

<code># Allow anonymous FTP? (Beware - allowed by default if you comment this out).</code>

<code>anonymous_enable=YES</code>

是否允许匿名登录FTP服务器,默认设置为YES即允许,用户可使用用户名ftp或者anonymous登陆,密码为空,如不允许匿名访问则设置为NO

<code># Uncomment this to allow local users to log in.</code>

<code>local_enable=YES</code>

是否允许本地用户(即linux系统中的用户帐号)登录FTP服务器,默认设置为YES允许,本地用户登录后默认只能访问自己的主目录,且具有读写权限,而不是vsftpd的主目录/var/ftp/,而匿名用户登录后进入匿名用户的下载目录/var/ftp/pub,若只允许匿名用户访问,前面加上#注释掉即可阻止本地用户访问FTP服务器

<code># Uncomment this to enable any form of FTP write command.</code>

<code>write_enable=YES</code>

是否允许本地用户对FTP服务器文件具有写权限,默认设置为YES允许,这项设置只是一个开关,要使匿名用户或系统用户具有写入权限,还得进行其它的设置。

<code># Default umask for local users is 077. You may wish to change this to 022,</code>

<code># if your users expect that (022 is used by most other ftpd's)</code>

<code>local_umask=022</code>

本地用户默认掩码为077,你可以设置本地用户的文件掩码为缺省022,也可根据个人喜好将其设置为其他值

<code># Uncomment this to allow the anonymous FTP user to upload files. This only</code>

<code># has an effect if the above global write enable is activated. Also, you will</code>

<code># obviously need to create a directory writable by the FTP user.</code>

<code>#anon_upload_enable=YES</code>

是否允许匿名用户上传文件,默认为YES,开启该项须设置全局的write_enable=YES。

<code># Uncomment this if you want the anonymous FTP user to be able to create</code>

<code># new directories.</code>

<code>#anon_mkdir_write_enable=YES</code>

是否允许匿名用户创建新文件夹,默认不启用

<code># You may fully customise the login banner string:</code>

<code>ftpd_banner=Welcome to blah FTP service.</code>

登录FTP服务器时显示的欢迎信息,如有需要,可在更改目录欢迎信息的目录下创建名为.message的文件,并写入欢迎信息保存后

<code>dirmessage_enable=YES</code>

当切换目录时,显示该目录下.message隐藏文件的内容。默认情况下有message_file=.message

<code>banner_file=</code><code>/etc/vsftpd/banner_file</code>

登录服务器成功后显示/etc/vsftpd/banner_file的信息。

<code>banner_fail=</code><code>/etc/vsftpd/banner_fail</code>

登录服务器失败后显示/etc/vsftpd/banner_fail的信息。

<code># Activate directory messages - messages given to remote users when they</code>

<code># go into a certain directory.</code>

<code>message_file=.message</code>

是否激活目录欢迎信息功能,当用户用CMD模式首次访问服务器上某个目录时,FTP服务器将显示欢迎信息,默认情况下,欢迎信息是通过家目录下的.message文件获得的,此文件保存自定义的欢迎信息直接vim .message,由用户自己建立.FTP信息默认的就是.message,所以可以不加 message_file= 来指定

如果设置了ftp_banner=的值,登录服务器将覆盖vsftpd默认的连接后的信息。l如果同时设置了ftp_banner=和banner_file=,那么banner_file将覆盖ftp_banner=的值

<code># The target log file can be vsftpd_log_file or xferlog_file.</code>

<code># This depends on setting xferlog_std_format parameter</code>

<code>xferlog_enable=YES</code>

是否让系统自动维护上传和下载的日志文件,默认情况该日志文件为/var/log/vsftpd.log,也可以通过xferlog_file选项对其进行设定,默认值为NO

<code># Make sure PORT transfer connections originate from port 20 (ftp-data).</code>

<code>connect_from_port_20=YES</code>

是否设定FTP服务器将启用FTP数据端口的连接请求,ftp-data数据传输,21为连接控制端口

<code># If you want, you can arrange for uploaded anonymous files to be owned by</code>

<code># a different user. Note! Using "root" for uploaded files is not</code>

<code># recommended!</code>

<code>#chown_uploads=YES</code>

<code>#chown_username=whoever</code>

设定是否允许改变上传文件的属主,与下面设置想要改变的上传文件的属主配合使用,如果需要,则输入一个系统用户名,可以把上传的文件都改成root属主,不推荐使用root用户上传文件,whoever:任何人

<code># The name of log file when xferlog_enable=YES and xferlog_std_format=YES</code>

<code># WARNING - changing this filename affects /etc/logrotate.d/vsftpd.log</code>

<code>#xferlog_file=/var/log/xferlog</code>

设定系统维护记录FTP服务器上传和下载情况的日志文件,/var/log/vsftpd.log是默认的,也可以另设其它

<code># Switches between logging into vsftpd_log_file and xferlog_file files.</code>

<code># NO writes to vsftpd_log_file, YES to xferlog_file</code>

<code>xferlog_std_format=YES</code>

是否以标准xferlog的格式书写传输日志文件,默认为/var/log/xferlog,也可以通过xferlog_file选项对其进行设定

<code># You may change the default value for timing out an idle session.</code>

<code>#idle_session_timeout=600</code>

设置数据传输中断间隔时间,此语句表示空闲的用户会话中断时间为600秒,即当数据传输结束后,用户连接FTP服务器的时间不应超过600秒。可以根据实际情况对该值进行修改

<code># You may change the default value for timing out a data connection.</code>

<code>#data_connection_timeout=120</code>

设置数据连接超时时间,该语句表示数据连接超时时间为120秒,可根据实际情况对其个修改

<code># It is recommended that you define on your system a unique user which the</code>

<code># ftp server can use as a totally isolated and unprivileged user.</code>

<code>#nopriv_user=ftpsecure</code>

运行vsftpd需要的非特权系统用户,缺省是nobody

<code># Enable this and the server will recognise asynchronous ABOR requests. Not</code>

<code># recommended for security (the code is non-trivial). Not enabling it,</code>

<code># however, may confuse older FTP clients.</code>

<code>#async_abor_enable=YES</code>

是否识别异步ABOR请求,如果FTP client会下达“async ABOR”这个指令时,这个设定才需要启用,而一般此设定并不安全,所以通常将其取消

<code># ASCII mangling is a horrible feature of the protocol.</code>

<code>#ascii_upload_enable=YES</code>

<code>#ascii_download_enable=YES</code>

是否以ASCII方式传输数据。默认情况下,服务器会忽略ASCII方式的请求,启用此选项将允许服务器以ASCII方式传输数据,不过,这样可能会导致由"SIZE /big/file"方式引起的DoS攻击

<code># You may specify a file of disallowed anonymous e-mail addresses. Apparently</code>

<code># useful for combatting certain DoS attacks.</code>

<code>#deny_email_enable=YES</code>

黑名单设置。如果很讨厌某些email address,就可以使用此设定来取消他的登录权限,可以将某些特殊的email address抵挡住。

<code>#banned_email_file=/etc/vsftpd/banned_emails</code>

当deny_email_enable=YES时,可以利用这个设定项来规定哪些邮件地址不可登录vsftpd服务器,此文件需用户自己创建,一行一个email address即可

<code># You may specify an explicit list of local users to chroot() to their home</code>

<code># directory. If chroot_local_user is YES, then this list becomes a list of</code>

<code># users to NOT chroot().</code>

<code>#chroot_local_user=YES</code>

<code>#chroot_list_enable=YES</code>

<code># (default follows)</code>

<code>#chroot_list_file=/etc/vsftpd/chroot_list</code>

chroot_local_user    将每个本地用户放置到chroot监牢中,限制所有的本地用户在自己的家目录;

chroot_list_enable   将选中的本地用户放入到chroot监牢中。若这个值设置为YES,则检查本地用户是否列在文件/etc/vsftpd/chroot_ list中或者由chroot_list_file指定的另一个文件中。当该用户位于这个列表中,并且chroot_local_user=NO时,该用户将被放入到以他的主目录为根的chroot监牢中。此时只有列在/etc/vsftpd/chroot_list中的用户才会被放入到chroot监牢中。如果该用户位于这个列表中,并且chroot_local_user=YES,那么该用户就不会放入到chroot监牢中。未列在/etc/vsftpd/chroot_list中的用户将会被放入到chroot监牢中。

简单说:chroot_local_user开启就是限制本地所有用户只能在自己的家目录里,此时chroot_list_enable开启的话chroot_list里的用户排除在外不受此限制可以随意切换到有权限的目录;而chroot_local_user关闭chroot_list_enable开启的话时只有chroot_list里的用户会被限制在家目录,而其他用户不受此限制

<code>#ls_recurse_enable=YES</code>

是否允许用户使用ls –R递归列表比较占用系统资源,以防止远程用户造成过量的I/O

<code>dirlist_enable=YES</code>

是否允许用户使用dir、ls 之类得列目录命令。

<code>download_enable=YES</code>

是否允许用户下载文件

是否允许用户上传(包括本地用户、匿名用户上传的前提条件)

<code>deny_file={*.exe,*.dll}</code>

设置不允许传输的文件类型{}包括上传下载。

<code>listen=YES</code>

是否允许监听。如果设置为YES,则vsftpd将以独立模式运行,由vsftpd自己监听和处理IPv4端口的连接请求

<code>pasv_min_port=30001</code>

<code>pasv_max_port=31000</code>

设置被动连接时客户端连接时的端口范围,传输数据的端口范围就在30001到31000 这个范围内传送

<code>#listen_ipv6=YES</code>

设定是否支持IPV6。如要同时监听IPv4和IPv6端口,则必须运行两套vsftpd,采用两套配置文件,同时确保其中有一个监听选项是被注释掉的

<code>pam_service_name=vsftpd</code>

设置PAM外挂模块提供的认证服务所使用的配置文件名,即/etc/pam.d/vsftpd文件,此文件中file=/etc/vsftpd/ftpusers字段,说明了PAM模块能抵挡的帐号内容来自文件/etc/vsftpd/ftpusers中

<code>tcp_wrappers=YES</code>

是否使用tcp_wrappers作为主机访问控制方式。tcp_wrappers可以实现linux系统中网络服务的基于主机地址的访问控制,在/etc目录中的hosts.allow和hosts.deny两个文件用于设置tcp_wrappers的访问控制,前者设置允许访问记录,后者设置拒绝访问记录。如想限制某些主机对FTP服务器192.168.57.2的匿名访问,编缉/etc/hosts.allow文件,如在下面增加两行命令:vsftpd:192.168.57.1:DENY 和vsftpd:192.168.57.9:DENY。表明限制IP为192.168.57.1/192.168.57.9主机访问IP为192.168.57.2的FTP服务器,此时FTP服务器虽可以PING通,但无法连接

<code>use_localtime=YES</code>

是否使用本地时间?默认使用GMT时间,文件时间比中国晚8个小时,建议设置为YES

<code>accept_timeout=60</code>

设置在空闲多长时间后自动断开链接

<code>connect_timeout=60</code>

设置重新连接最大激活时间,断开链接后多长时间重新链接

<code>max_clients=200</code>

指明服务器总的客户并发连接数为200

<code>max_per_ip=3</code>

指明每个客户机的最大连接数为3

<code>pasv-min-prot=protnumber</code>

<code>pasv-max-prot=protnumber</code>

定义最大与最小端口,为0表示任意端口;为客户端连接指明端口

<code>listen_address=ip address</code>

设置ftp服务来监听的地址,客户端可以用哪个地址来连接

<code>listen_port=21</code>

设置FTP工作的端口号,默认的为21,如需要修改FTP服务器的端口号,应尽量大于4000

<code>userlist_enable=YES</code>

<code>userlist_deny=YES</code>

<code>userlist_file=</code><code>/etc/vsftpd/user_list</code>

userlist_enable和userlist_deny两个选项联合起来针对的是:本地全体用户(除去ftpusers中的用户,这个文件中的用户始终是被禁止登陆的)和出现在user_list文件中的用户以及不在在user_list文件中的用户这三类用户集合进行的设置。

若userlist_enable项设为YES,则只允许user_list文件中的用户允许登录FTP服务器,文件中不包含的用户不能登陆,

若userlist_enable项设置为NO,则不允许usrlist_file文件中的用户登录FTP服务器,

而如果同时设置了userlist_deny=YES,则user_list文件是个黑名单,其中的用户将不允许登录FTP服务器,甚至连输入密码提示信息都没有,而userlist_deny=NO,user_list文件是个白名单,其中的用户将允许登录FTP服务器,当且仅当userlist_enable=YES时,userlist_deny项的配置才有效,user_list文件才会被使用。当userlist_enable=NO时,无论userlist_deny项为何值都是无效的,本地全体用户(除去ftpusers中的用户)都可以登入FTP。

决定禁止还是只允许由userlist_file指定文件中的用户登录FTP服务器。此选项在userlist_enable选项启动后才生效。YES为默认值,禁止文件中的用户登录,同时也不向这些用户发出输入密码的提示。NO表示只允许在文件中的用户登录FTP服务器

<code>local_root=</code><code>/home/ftp</code>

定义登录帐号的主目录, 若没有指定,每一个用户则进入到个人用户主目录,对匿名用户无效

<code>anon_max_rate=30000</code>

匿名用户的最大传输速度,单位是Byts/s

<code>local_max_rate=50000</code>

本地用户的最大传输速度,单位是Byts/s

是否允许下载

FTPS配置参数

<code>ssl_enable=YES</code>

指定vsftpd支持加密协议

<code>ssl_sslv2=YES</code>

<code>ssl_sslv3=YES </code>

<code>ssl_tlsv1=YES</code>

指定vsftpd支持安全套接字层v2,v3,tls加密方式v1

<code>force_local_logins_ssl=YES</code>

强制本地用户和虚拟用户 ssl 加密登录

<code>force_local_data_ssl=YES</code>

<code>rsa_cert_file=</code><code>/etc/vsftpd/</code><code>.sslkey</code><code>/vsftp</code><code>.pem</code>

指定证书存放位置

<code>allow_anon_ssl=YES</code>

允许匿名用户ssl加密登录

本文转自 justin_peng 51CTO博客,原文链接:http://blog.51cto.com/ityunwei2017/1345689,如需转载请自行联系原作者

继续阅读