3dwqe 发表于 2014-8-14 17:16:11

构建FTP服务器(vsftpd)

根据公司的业务发展要求,需要面向Internet搭建一台FTP文件服务器,以提供公测软件、市场资料的下载,以及员工的一些资源上传分享。同时,需要对用户下载/上传流量进行控制。

1.开放匿名访问,任何人都可以下载服务器/var/ftp/目录下的资料,而且可以向服务器的/var/ftp/pub上传文件。

2.允许服务器的系统用户通过FTP方式访问宿主目录,但禁止访问其他目录。

3.最多允许100个并发用户连接,其中来自相同IP地址的并发连接不超过5个。

4.匿名访问此FTP服务时,最大传输速度限制为100KB/s;系统用户访问此FTP服务时,最大传输速度限制为200KB/s。

方案

使用2台RHEL6虚拟机,其中一台作为vsftpd服务器(192.168.4.5)、另外一台作为测试用的Linux客户机(192.168.4.6)。

实现

1.确认安装vsftpd软件包。

通过YUM方式安装vsfptd软件包,并确认其主要配置文件:

1.# yum -y install vsftpd

2.# rpm -qc vsftpd

在配置vsfptd服务的过程中, 可以参考vsftpd.conf的man手册页,也可以充分利用其提供的样本配置文件 —— 具体路径可通过rpm –ql vsftpd找到:

1.# rpm -ql vsftpd | grep -i example

2.配置可匿名访问的vsftpd服务。

1)实现可匿名下载的vsftpd服务。

安装好vsftpd软件包以后,默认的配置即支持匿名下载、本地用户下载/上传,只需要启动vsftpd服务,就可以测试匿名FTP下载了。确认配置的操作及结果如下所示;

1. # grep -m2 -i _enable /etc/vsftpd/vsftpd.conf

匿名FTP在Linux系统中有一个名为ftp的系统用户,其宿主目录就是匿名FTP访问的根目录。以下操作可以了解匿名FTP目录位置、启动vsftpd服务。

1. # grep ftp /etc/passwd

2. ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

3. # service vsftpd start

4. 为 vsftpd 启动 vsftpd:                     [确定]

5. # chkconfig vsftpd on             //设为开机后自启动

dd工具在/var/ftp/目录下新建一个20MB的测试文件tdd.file:

1.# dd if=/dev/zeroof=/var/ftp/tdd.filebs=1M count=20

2.20+0 records in                                    //创建测试文件

3.20+0 records out

4.20971520bytes(21 MB) copied,0.020122 seconds,1.0 GB/s

5.# ls -lh /var/ftp/tdd.file          //确认新建的测试文件

6.-rw-r--r--1 root root 20M 09-2213:50/var/ftp/tdd.file

在客户机上通过FTP下载、确认下载后文件的权限:

1.# wget ftp://192.168.4.5/tdd.file      //从FTP服务器下载文件

2.--2013-09-2213:57:18--ftp://192.168.4.5/tdd.file

3.             => `tdd.file'

4.Connecting to 192.168.4.5:21... 已连接。

5.正在以 anonymous 登录 ... 登录成功!

6.==> SYST ... 完成。    ==> PWD ... 完成。

7.==> TYPE I ... 完成。==> 不需要 CWD。

8.==> SIZE tdd.file ... 20971520

9.==> PASV ... 完成。    ==> RETR tdd.file ... 完成。

10.长度:20971520 (20M)

11.

12.100%[================================>] 20,971,520--.-K/s   in 0.1s

13.

14.2013-09-22 13:57:18 (191 MB/s) - `tdd.file' saved

15.# ls -lhtdd.file                      //确认下载后的文件

16.-rw-r--r--1 root root 20M 09-2213:57 tdd.file

2)实现可匿名上传的vsftpd服务。

由于vsftpd服务内建的安全机制要求,匿名访问的用户ftp或其他人是不能对FTP根目录/var/ftp/有写入权限的。例如,假如在服务器上将/var/ftp/目录的权限设置为777,则在登录服务时会报OOPS错误:

1.# ftp 192.168.4.5            //使用ftp命令访问FTP服务器

2.Connected to 192.168.4.5.

3.220(vsFTPd 2.0.5)

4.530 Please login with USER and PASS.

5.530 Please login with USER and PASS.

6.KERBEROS_V4 rejected as an authentication type

7.Name(192.168.4.5:root): ftp                        //匿名FTP用户

8.331 Please specify the password.

9.Password:                                              //密码任意

10.500 OOPS: vsftpd: refusing to run with writable anonymous root

11.Loginfailed.

12.ftp>

因此不能简单调整/var/ftp/的权限来实现匿名上传,但是可以在/var/ftp/下建立一个用户ftp可写入的子目录,匿名访问时可以向这个子目录下上传。默认情况下,已建有一个开放目录pub,只需要适当调整归属以使ftp用户能够写入:

1.# ls -ld /var/ftp/pub/                      //原有权限

2.drwxr-xr-x 2 root root 40962012-09-25/var/ftp/pub/

3.# chown ftp /var/ftp/pub/                  //调整目录归属

4.# ls -ld /var/ftp/pub/

5.drwxr-xr-x 2 ftp root 40962012-09-25/var/ftp/pub/          //调整后的权限

接下来修改主配置文件/etc/vsftpd/vsftpd.conf,确认打开“anon_”开头的上传及建目录的配置,并添加anon_mask、anon_other_write_enable配置,以设置上传权限掩码、开放其他写入权限(改名、删除、覆盖等)。配置操作及主要内容如下所示:

1.# cd /etc/vsftpd/

2.# cp vsftpd.confvsftpd.conf.origin

3.                                                    //备份配置文件

4.# grep -vE "#|^$" vsftpd.conf.origin > vsftpd.conf

5.                                                      //提取有效配置行

6.# vim vsftpd.conf

7.anonymous_enable=YES                      //启用匿名FTP访问

8.anon_umask=022                              //匿名上传的权限掩码

9.anon_upload_enable=YES                     //允许匿名上传

10.anon_mkdir_write_enable=YES            //匿名访问时允许创建子目录

11.anon_other_write_enable=YES            //允许匿名访问时的其他写入权限

12.local_enable=YES

13.write_enable=YES                        //允许本服务器开放写入权限

14.local_umask=022

15.dirmessage_enable=YES

16.xferlog_enable=YES

17.connect_from_port_20=YES

18.xferlog_std_format=YES

19.listen=YES

20.pam_service_name=vsftpd

21.userlist_enable=YES

22.tcp_wrappers=YES

确认配置无误后,再次重启vsftpd服务。

1.# service vsftpd restart

2.关闭 vsftpd:                                              [确定]

3.为 vsftpd 启动 vsftpd:                                    [确定]

在客户机上使用ftp命令访问,验证上传权限:

1.# ftp 192.168.4.5

2.Connected to 192.168.4.5.

3.220(vsFTPd 2.0.5)

4.530 Please login with USER and PASS.

5.530 Please login with USER and PASS.

6.KERBEROS_V4 rejected as an authentication type

7.Name(192.168.4.5:root): ftp                         //匿名FTP用户

8.331 Please specify the password.

9.Password:                                             //密码任意

10.230 Login successful.

11.Remote system type is UNIX.

12.Using binary mode to transfer files.

13.ftp> cd pub                                          //切换到可上传的子目录

14.250 Directory successfully changed.

15.ftp> put install.log                                  //上传一个文件

16.local: install.logremote: install.log

17.227 Entering Passive Mode(192,168,4,4,166,53)

18.150 Ok to send data.

19.226 File receive OK.

20.1351680 bytes sent in 0.015seconds(8.8e+04 Kbytes/s)

21.ftp> mkdir tdir                                    //创建一个子目录

22.257"/pub/tdir" created

23.ftp> quit                                              //断开FTP连接

24.221 Goodbye.

25.#

回到FTP服务器192.168.4.5上,可确认刚上传的文件及目录的权限:

1.# ls -lh /var/ftp/pub/

2.总计 1.3M

3.-rw-r--r--1 ftp ftp 1.3M 09-2214:28 install.log

4.drwxr-xr-x 2 ftp ftp 4.0K 09-2214:28 tdir

3.实现用户验证的vsftpd服务。

这个默认已经打开了(配置项local_enable=YES),但是目录切换未作限制,因此以系统用户登录后,虽然默认位于宿主目录,却可以通过cd命令切换到其他位置,带来安全隐患。以服务器上的用户kdev(若没有请先添加)为例,登录及目录切换的相关操作如下所示:

1.# ftp 192.168.4.5

2.Connected to 192.168.4.5.

3.220(vsFTPd 2.0.5)

4.530 Please login with USER and PASS.

5.530 Please login with USER and PASS.

6.KERBEROS_V4 rejected as an authentication type

7.Name(192.168.4.5:root): kdev                      //以用户kdev登录

8.331 Please specify the password.

9.Password:                                          //验证用户kdev的密码

10.230 Login successful.

11.Remote system type is UNIX.

12.Using binary mode to transfer files.

13.ftp> pwd                                          //当前位于kdev的宿主目录

14.257"/home/kdev"

15.ftp> cd /usr/src/                                  //可切换到其他目录

16.250 Directory successfully changed.

17.ftp> ls                                          //查看其他目录的资源

18.227 Entering Passive Mode(192,168,4,4,129,159)

19.150 Here comes the directory listing.

20.drwxr-xr-x    20      0            4096 Oct 012009 debug

21.drwxr-xr-x    20      0            4096 Oct 012009 kernels

22.drwxr-xr-x    70      0            4096 Nov 012012 vmware-tools-distrib

23.226 Directory send OK.

根据实验要求,需要限制系统用户访问其他目录,只要修改vsftpd.conf配置文件,添加一行配置chroot_local_user=YES并重启服务即可:

1.# vim /etc/vsftpd/vsftpd.conf

2.....

3.local_enable=YES

4.chroot_local_user=YES                                  //禁锢系统用户

5.write_enable=YES

6.local_umask=022

7.# service vsftpd restart      //重启vsftpd服务

8.关闭 vsftpd:                                  [确定]

9.为 vsftpd 启动 vsftpd:                     [确定]

再次从客户机以kdev用户登录,会发现宿主目录已经变成FTP根,无法再切换到其他路径下去:

1.# ftp 192.168.4.5

2.Connected to 192.168.4.5.

3.220(vsFTPd 2.0.5)

4.530 Please login with USER and PASS.

5.530 Please login with USER and PASS.

6.KERBEROS_V4 rejected as an authentication type

7.Name(192.168.4.5:root): kdev                      //以用户kdev登录

8.331 Please specify the password.

9.Password:                                          //验证用户kdev的密码

10.230 Login successful.

11.Remote system type is UNIX.

12.Using binary mode to transfer files.

13.ftp> pwd

14.257"/"                                          //登入位置已变为“/”,

15.                                                //实际是kdev的宿主目录

16.ftp> ls

17.227 Entering Passive Mode(192,168,4,4,120,249)

18.150 Here comes the directory listing.

19.226 Directory send OK.

4.限制并发访问数、传输速度。

1)修改vsftpd服务配置,添加并发访问限制、传输速度限制。

限制最大连接数的配置项为max_clients,限制每IP地址最大并发数的配置项为max_per_ip;限制FTP传输速度的配置项为anon_max_rate、local_max_rate,分别对应匿名访问、系统用户访问,单位为字节/秒。

相关配置操作及内容如下所示:

1.# vim /etc/vsftpd/vsftpd.conf

2.....

3.max_clients=100                                  //最大并发连接数

4.max_per_ip=5                                    //每IP最大并发连接数

5.anon_max_rate=100000                        //匿名访问限制为100KB/s

6.local_max_rate=200000                      //系统用户访问时限速为200KB/s

7.# service vsftpd restart

8.关闭 vsftpd:                        [确定]

9.为 vsftpd 启动 vsftpd:               [确定]

将前面创建的下载测试文件/var/ftp/tdd.file复制到用户kdev的宿主目录,以便在下一步测试下载速度:

1.# cp /var/ftp/tdd.file /home/kdev/

2.# ls -lh /home/kdev/tdd.file

3.-rw-r--r--1 root root 20M 09-2214:58/home/kdev/tdd.file

2)验证FTP下载速度。


1.# wget ftp://192.168.4.5/tdd.file

2.--2013-09-2215:02:17--ftp://192.168.4.5/tdd.file

3.             => `tdd.file.1'

4.Connecting to 192.168.4.5:21... 已连接。

5.正在以 anonymous 登录 ... 登录成功!

6.==> SYST ... 完成。    ==> PWD ... 完成。

7.==> TYPE I ... 完成。==> 不需要 CWD。

8.==> SIZE tdd.file ... 20971520

9.==> PASV ... 完成。    ==> RETR tdd.file ... 完成。

10.长度:20971520 (20M)

11.

12.10% [===>                                 ] 2,244,608   98.5K/seta 3m 8s

按组合键Ctrl+c终止下载,继续下一项测试——指定以系统用户名kdev和密码1234567访问,并下载文件(/home/kdev/tdd.file),速度稳定后保持在200KB左右:

1.# wget ftp://kdev:1234567@192.168.4.5/tdd.file

2.--2013-09-2215:05:38--ftp://kdev:*password*@192.168.4.5/tdd.file

3.             => `tdd.file.2'

4.Connecting to 192.168.4.5:21... 已连接。

5.正在以 kdev 登录 ... 登录成功!

6.==> SYST ... 完成。    ==> PWD ... 完成。

7.==> TYPE I ... 完成。==> 不需要 CWD。

8.==> SIZE tdd.file ... 20971520

9.==> PASV ... 完成。    ==> RETR tdd.file ... 完成。

10.长度:20971520 (20M)

11.

12. 5% [=>                                     ] 1,186,888    197K/seta 98s
页: [1]
查看完整版本: 构建FTP服务器(vsftpd)