|
根据公司的业务发展要求,需要面向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. [iyunv@localhost ~]# yum -y install vsftpd
2. [iyunv@localhost ~]# rpm -qc vsftpd
在配置vsfptd服务的过程中, 可以参考vsftpd.conf的man手册页,也可以充分利用其提供的样本配置文件 —— 具体路径可通过rpm –ql vsftpd找到:
1. [iyunv@localhost ~]# rpm -ql vsftpd | grep -i example
2.配置可匿名访问的vsftpd服务。
1)实现可匿名下载的vsftpd服务。
安装好vsftpd软件包以后,默认的配置即支持匿名下载、本地用户下载/上传,只需要启动vsftpd服务,就可以测试匿名FTP下载了。确认配置的操作及结果如下所示;
1. [iyunv@localhost ~]# grep -m2 -i _enable /etc/vsftpd/vsftpd.conf
匿名FTP在Linux系统中有一个名为ftp的系统用户,其宿主目录就是匿名FTP访问的根目录。以下操作可以了解匿名FTP目录位置、启动vsftpd服务。
1. [iyunv@localhost ~]# grep ftp /etc/passwd
2. ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
3. [iyunv@localhost ~]# service vsftpd start
4. 为 vsftpd 启动 vsftpd: [确定]
5. [iyunv@localhost ~]# chkconfig vsftpd on //设为开机后自启动
dd工具在/var/ftp/目录下新建一个20MB的测试文件tdd.file:
1. [iyunv@localhost ~]# 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. [iyunv@localhost ~]# ls -lh /var/ftp/tdd.file //确认新建的测试文件
6. -rw-r--r--1 root root 20M 09-2213:50/var/ftp/tdd.file
在客户机上通过FTP下载、确认下载后文件的权限:
1. [iyunv@svr6 ~]# 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 [20971520]
15.[iyunv@svr6 ~]# 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. [iyunv@svr6 ~]# 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. [iyunv@localhost ~]# ls -ld /var/ftp/pub/ //原有权限
2. drwxr-xr-x 2 root root 40962012-09-25/var/ftp/pub/
3. [iyunv@localhost ~]# chown ftp /var/ftp/pub/ //调整目录归属
4. [iyunv@localhost ~]# 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. [iyunv@localhost ~]# cd /etc/vsftpd/
2. [iyunv@localhost vsftpd]# cp vsftpd.confvsftpd.conf.origin
3. //备份配置文件
4. [iyunv@localhost vsftpd]# grep -vE "#|^$" vsftpd.conf.origin > vsftpd.conf
5. //提取有效配置行
6. [iyunv@localhost vsftpd]# 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. [iyunv@localhost vsftpd]# service vsftpd restart
2. 关闭 vsftpd: [确定]
3. 为 vsftpd 启动 vsftpd: [确定]
在客户机上使用ftp命令访问,验证上传权限:
1. [iyunv@svr6 ~]# 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.[iyunv@svr6 ~]#
回到FTP服务器192.168.4.5上,可确认刚上传的文件及目录的权限:
1. [iyunv@localhost vsftpd]# 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. [iyunv@svr6 ~]# 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 01 2009 debug
21.drwxr-xr-x 20 0 4096 Oct 01 2009 kernels
22.drwxr-xr-x 70 0 4096 Nov 01 2012 vmware-tools-distrib
23.226 Directory send OK.
根据实验要求,需要限制系统用户访问其他目录,只要修改vsftpd.conf配置文件,添加一行配置chroot_local_user=YES并重启服务即可:
1. [iyunv@localhost ~]# vim /etc/vsftpd/vsftpd.conf
2. ....
3. local_enable=YES
4. chroot_local_user=YES //禁锢系统用户
5. write_enable=YES
6. local_umask=022
7. [iyunv@localhost ~]# service vsftpd restart //重启vsftpd服务
8. 关闭 vsftpd: [确定]
9. 为 vsftpd 启动 vsftpd: [确定]
再次从客户机以kdev用户登录,会发现宿主目录已经变成FTP根,无法再切换到其他路径下去:
1. [iyunv@svr6 ~]# 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. [iyunv@localhost ~]# 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. [iyunv@localhost ~]# service vsftpd restart
8. 关闭 vsftpd: [确定]
9. 为 vsftpd 启动 vsftpd: [确定]
将前面创建的下载测试文件/var/ftp/tdd.file复制到用户kdev的宿主目录,以便在下一步测试下载速度:
1. [iyunv@localhost ~]# cp /var/ftp/tdd.file /home/kdev/
2. [iyunv@localhost ~]# ls -lh /home/kdev/tdd.file
3. -rw-r--r--1 root root 20M 09-2214:58/home/kdev/tdd.file
2)验证FTP下载速度。
1. [iyunv@svr6 ~]# 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/s eta 3m 8s
按组合键Ctrl+c终止下载,继续下一项测试——指定以系统用户名kdev和密码1234567访问,并下载文件(/home/kdev/tdd.file),速度稳定后保持在200KB左右:
1. [iyunv@svr6 ~]# 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/s eta 98s |
|