本案例要求先快速搭建好一台FTP服务器,并创建相关测试文件:
然后验证以不同方式从客户机访问此FTP服务器:
使用2台RHEL6虚拟机,其中一台作为vsftpd服务器(192.168.4.5)、另外一台作为测试用的Linux客户机(192.168.4.205),如图-1所示。
图-1
在RHEL6系统中,vsftpd软件包默认已提供FTP服务的基本配置,因此只要装好vsftpd包并启动对应的服务,一台FTP服务器就搭建好了。默认的vsftpd服务具备一台标准FTP服务器的能力,服务功能和特点如表-1所示。
表-1 默认vsftpd配置的功能和特点
访问类型 |
下载/上传权限 |
FTP起始目录 |
是否禁锢 |
其他 |
匿名 |
允许/禁止 |
/var/ftp/ |
是 |
基于安全考虑,root、bin等系统用户默认被阻止登录 |
本地用户 |
允许/允许 |
~用户名/ |
否 |
需要访问FTP服务端提供的资源时,可以使用专门的FTP客户端/管理工具(FTP命令程序、Filezilla图形工具),也可以使用Web浏览器、下载工具(比如wget)等支持FTP协议的通用软件。
定位匿名访问FTP资源的地址形式如下:
对于要求登录验证才能访问的FTP资源,可以在地址中指定用户名、密码信息:
实现此案例需要按照如下步骤进行。
步骤一:构建vsftpd服务器
1)使用yum安装vsftpd软件包
[root@svr5 ~]# yum -y install vsftpd
.. ..
[root@svr5 ~]# rpm -q vsftpd
vsftpd-2.2.2-11.el6_4.1.x86_64
2)启用vsftpd服务,并设为开机自动运行
[root@svr5 ~]# service vsftpd restart ; chkconfig vsftpd on
关闭 vsftpd: [失败]
为 vsftpd 启动 vsftpd: [确定]
vsftpd服务默认通过TCP 21端口监听客户端请求:
[root@svr5 ~]# netstat -anptu | grep vsftpd
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 64869/vsftpd
3)为FTP访问建立测试文件
在匿名FTP起始目录/var/ftp/下默认有一个pub/子目录(用来提供开放资源),在此目录下建立一个名为anon.txt的文件:
[root@svr5 ~]# cat /var/ftp/pub/anon.txt
Anonymous Test
新建用户lisi并设好密码(如1234567),此用户即可作为FTP用户使用,在lisi的家目录下建立一个名为lisi.txt的文件,内容随意:
[root@svr5 ~]# useradd lisi
[root@svr5 ~]# echo 1234567 | passwd --stdin lisi
更改用户 lisi 的密码 。
passwd: 所有的身份验证令牌已经成功更新。
[root@svr5 ~]# vim ~lisi/lisi.txt
Local User Test
步骤二:从客户机访问FTP服务器
1)从Web浏览器访问FTP服务
以Firefox浏览器为例,只要在地址栏内输入 ftp://192.168.4.5,回车后即连接目标主机192.168.4.5的FTP服务,默认以匿名的方式验证。若访问成功,将会以网页形式列出FTP服务器上匿名FTP起始目录下的资源,如图-2所示。
图-2
单击相应的超链接即可进入指定的目录,或者打开/下载指定的文件,如图-3所示。
图-3
若要访问用户验证的FTP资源,则需要指定正确的用户信息即可。比如在地址栏内输入网址 ftp://[email protected]/ 或者 ftp://lisi:[email protected]/ 都能够成功访问本例中的FTP服务器,浏览服(前者会弹窗验证密码)务器上用户lisi的家目录,如图-4所示。
图-4
当输入的是带远程文件路径的完整FTP地址时,比如 ftp://lisi:[email protected]/lisi.txt,则可以直接打开目标文件(对于浏览器不支持的文件类型,会弹窗提示下载),如图-5所示。
图-5
2)使用ftp命令访问FTP服务
通常大多数Linux系统都自带ftp工具,如果没有也可以通过Yum手动安装。
[root@pc205 ~]# ftp
-bash: ftp: command not found
[root@pc205 ~]# yum -y install ftp
.. ..
指定目标服务器的地址作为参数,ftp命令将会发起FTP连接,若成功连接则根据提示依次验证用户名、密码即可。对于匿名FTP访问,使用ftp或anonymous作为用户名,密码任意;对于用户验证的FTP访问,应以确切的用户名和密码验证。
匿名登录FTP服务器,验证下载(允许)、上传(拒绝)操作:
[root@pc205 ~]# ftp 192.168.4.5 //连接FTP服务器
Connected to 192.168.4.5 (192.168.4.5).
220 (vsFTPd 2.2.2)
Name (192.168.4.5:root): ftp //匿名用户 ftp
331 Please specify the password.
Password: //任意密码,或直接回车
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls //查看FTP起始目录
227 Entering Passive Mode (192,168,4,5,63,132).
150 Here comes the directory listing.
drwxr-xr-x 2 0 0 4096 Jan 13 07:26 pub
226 Directory send OK.
ftp> cd pub //切换到pub子目录
250 Directory successfully changed.
ftp> ls
227 Entering Passive Mode (192,168,4,5,121,122).
150 Here comes the directory listing.
-rw-r--r-- 1 0 0 15 Jan 13 06:59 anon.txt
226 Directory send OK.
ftp> get anon.txt //测试下载文件
local: anon.txt remote: anon.txt
227 Entering Passive Mode (192,168,4,5,127,108).
150 Opening BINARY mode data connection for anon.txt (15 bytes).
226 Transfer complete. //提示成功
15 bytes received in 3.9e-05 secs (384.62 Kbytes/sec)
ftp> put install.log //测试上传文件
local: install.log remote: install.log
227 Entering Passive Mode (192,168,4,5,86,164).
550 Permission denied. //提示被拒绝
ftp> bye //bye断开FTP连接
221 Goodbye.
[root@pc205 ~]# cat anon.txt //确认下载结果
Anonymous Test
以用户lisi登录FTP服务器,验证下载(允许)、上传(允许)操作:
[root@pc205 ~]# ftp 192.168.4.5 //连接FTP服务器
Connected to 192.168.4.5 (192.168.4.5).
220 (vsFTPd 2.2.2)
Name (192.168.4.5:root): lisi //服务器本地用户 lisi
331 Please specify the password.
Password: //输入正确口令
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls //查看起始目录
227 Entering Passive Mode (192,168,4,5,250,165).
150 Here comes the directory listing.
-rw-r--r-- 1 0 0 16 Jan 13 07:01 lisi.txt
226 Directory send OK.
ftp> get lisi.txt //测试下载文件
local: lisi.txt remote: lisi.txt
227 Entering Passive Mode (192,168,4,5,171,31).
150 Opening BINARY mode data connection for lisi.txt (16 bytes).
226 Transfer complete. //提示成功
16 bytes received in 4.8e-05 secs (333.33 Kbytes/sec)
ftp> put install.log //测试上传文件
local: install.log remote: install.log
227 Entering Passive Mode (192,168,4,5,83,26).
150 Ok to send data.
226 Transfer complete. //提示成功
47884 bytes sent in 0.101 secs (473.44 Kbytes/sec)
ftp> ls //确认上传结果
227 Entering Passive Mode (192,168,4,5,29,68).
150 Here comes the directory listing.
-rw-r--r-- 1 507 508 47884 Jan 13 08:01 install.log
-rw-r--r-- 1 0 0 16 Jan 13 07:01 lisi.txt
226 Directory send OK.
ftp> quit //quit也可断开FTP连接
221 Goodbye.
[root@pc205 ~]# cat lisi.txt //确认下载结果
Local User Test
3)使用wget命令工具下载FTP资源
下载服务器上的 /var/ftp/pub/anon.txt 文件:
[root@pc205 ~]# rm -rf anon.txt //删除原有文件,避免干扰
[root@pc205 ~]# wget ftp://192.168.4.5/pub/anon.txt //匿名下载
--2015-01-13 16:10:31-- ftp://192.168.4.5/pub/anon.txt
=> “anon.txt”
正在连接 192.168.4.5:21... 已连接。
正在以 anonymous 登录 ... 登录成功!
==> SYST ... 完成。 ==> PWD ... 完成。
==> TYPE I ... 完成。 ==> CWD (1) /pub ... 完成。
==> SIZE anon.txt ... 15
==> PASV ... 完成。 ==> RETR anon.txt ... 完成。
长度:15 (非正式数据)
100%[=============================================================>] 15 --.-K/s in 0s
2015-01-13 16:10:31 (1.13 MB/s) - “anon.txt” 已保存 [15]
[root@pc205 ~]# cat anon.txt //确认下载结果
Anonymous Test
下载服务器上的 ~lisi/lisi.txt 文件:
[root@pc205 ~]# rm -rf lisi.txt //删除原有文件,避免干扰
[root@pc205 ~]# wget ftp://lisi:[email protected]/lisi.txt //用户验证下载
--2015-01-13 16:12:01-- ftp://lisi:*password*@192.168.4.5/lisi.txt
=> “lisi.txt”
正在连接 192.168.4.5:21... 已连接。
正在以 lisi 登录 ... 登录成功!
==> SYST ... 完成。 ==> PWD ... 完成。
==> TYPE I ... 完成。 ==> 不需要 CWD。
==> SIZE lisi.txt ... 16
==> PASV ... 完成。 ==> RETR lisi.txt ... 完成。
长度:16 (非正式数据)
100%[=============================================================>] 16 --.-K/s in 0.001s
2015-01-13 16:12:01 (21.4 KB/s) - “lisi.txt” 已保存 [16]
[root@pc205 ~]# cat lisi.txt //确认下载结果
Local User Test
沿用练习一,通过调整FTP服务端配置,实现以下目标:
对于匿名用户ftp来说,默认已经启用禁锢(仅限于起始目录/var/ftp);而对FTP本地用户来说,默认并没有禁锢(不仅可以访问宿主目录,还可以跳转到其他目录),存在一定安全隐患。若要禁锢本地用户,只需设置 chroot_local_user = YES即可。
vsftpd服务提供了两个用户列表文件,其中 /etc/vsftpd/ftpusers 作为默认的黑名单使用,列在此文件内的用户将无法登入FTP。
而另一个文件 /etc/vsftpd/user_list只是一个用户名列表,根据配置参数 userlist_enable 的值是YES(默认)还是NO来决定是否启用此列表。一旦启用此列表文件以后,如果配置参数 userlist_deny的值是YES(默认)则此列表为黑名单(拒绝指定的用户),如果是NO则此列表作为白名单使用。
实现此案例需要按照如下步骤进行。
步骤一:禁锢FTP本地用户账号
1)验证未启用禁锢前的风险
以普通用户lisi登入后,起始目录位于/home/lisi/,但可以通过cd命令切换到服务器上的其他目录(比如/etc/),并下载有读取权限的文件(比如passwd),可能导致未授权的信息泄露。
[root@pc205 ~]# ftp 192.168.4.5 //连接FTP服务器
Connected to 192.168.4.5 (192.168.4.5).
220 (vsFTPd 2.2.2)
Name (192.168.4.5:root): lisi //以FTP本地用户登录
331 Please specify the password.
Password: //验证口令
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd //查看起始目录
257 "/home/lisi" //位于用户lisi的家目录
ftp> cd /etc/ //切换到其他目录
250 Directory successfully changed.
ftp> get passwd //下载/etc/目录下的passwd文件
local: passwd remote: passwd
227 Entering Passive Mode (192,168,4,5,64,118).
150 Opening BINARY mode data connection for passwd (2122 bytes).
226 Transfer complete.
2122 bytes received in 4.5e-05 secs (47155.56 Kbytes/sec)
ftp> quit //断开连接
221 Goodbye.
[root@pc205 ~]# head -5 passwd //确认下载后的文件
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
2)修改vsftpd.conf配置文件,启用禁锢本地用户的设置
[root@svr5 ~]# vim /etc/vsftpd/vsftpd.conf
.. ..
chroot_local_user=YES //添加禁锢配置
[root@svr5 ~]# service vsftpd reload
关闭 vsftpd: [确定]
为 vsftpd 启动 vsftpd: [确定]
3)验证启用禁锢后的效果
再次以用户lisi登入FTP服务器,会发现起始目录(/home/lisi)已经被视为用户FTP会话的根目录,无法切换到/etc/等其他目录。
[root@pc205 ~]# ftp 192.168.4.5 //连接FTP服务器
Connected to 192.168.4.5 (192.168.4.5).
220 (vsFTPd 2.2.2)
Name (192.168.4.5:root): lisi //以FTP本地用户登录
331 Please specify the password.
Password: //验证口令
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd //查看起始目录
257 "/" //已经位于FTP根目录
ftp> ls //实际还是在lisi的家目录
227 Entering Passive Mode (192,168,4,5,239,27).
150 Here comes the directory listing.
-rw-r--r-- 1 507 508 47884 Jan 13 08:01 install.log
-rw-r--r-- 1 0 0 16 Jan 13 07:01 lisi.txt
226 Directory send OK.
ftp> cd /etc //尝试切换到其他目录失败
550 Failed to change directory.
ftp> quit //断开连接
221 Goodbye.
步骤二:使用FTP黑白名单
1)测试FTP黑名单文件/etc/vsftpd/ftpusers
添加一个用户mike,并设好密码:
[root@svr5 ~]# useradd mike
[root@svr5 ~]# echo 1234567 | passwd --stdin mike
更改用户 mike 的密码 。
passwd: 所有的身份验证令牌已经成功更新。
将用户mike加入FTP黑名单:
[root@svr5 ~]# vim /etc/vsftpd/ftpusers
.. ..
mike //添加到文件末尾,不要有多余空格
从客户机访问此FTP,尝试以mike登录时将会失败:
[root@pc205 ~]# ftp 192.168.4.5 //连接FTP服务器
Connected to 192.168.4.5 (192.168.4.5).
220 (vsFTPd 2.2.2)
Name (192.168.4.5:root): mike //尝试以用户mike验证
331 Please specify the password.
Password: //输入正确口令
530 Login incorrect.
Login failed. //因在黑名单内,此用户被拒绝登录
ftp> quit //断开连接
221 Goodbye.
2)将用户列表/etc/vsftpd/user_list作为FTP白名单
修改vsftpd服务配置,确认userlist_enable=YES,并在其下方添加一行新的配置语句userlist_deny=NO,然后重载服务:
[root@svr5 ~]# vim /etc/vsftpd/vsftpd.conf
.. ..
userlist_enable=YES
userlist_deny=NO //仅允许列表中的用户
[root@svr5 ~]# service vsftpd reload
关闭 vsftpd: [确定]
为 vsftpd 启动 vsftpd: [确定]
然后打开文件 /etc/vsftpd/user_list,清空原有记录,添加用户lisi、mike:
[root@svr5 ~]# vim /etc/vsftpd/user_list //不要有多余空格
lisi
mike
3)测试FTP白名单限制效果
以匿名用户ftp访问FTP服务器时,因不在白名单中,登录将会被拒绝:
[root@pc205 ~]# ftp 192.168.4.5
Connected to 192.168.4.5 (192.168.4.5).
220 (vsFTPd 2.2.2)
Name (192.168.4.5:root): ftp //匿名登录
530 Permission denied. //用户ftp不在白名单内,不接受验证
Login failed.
ftp> quit
221 Goodbye.
以用户lisi访问FTP服务器时,此用户在白名单中且不在ftpusers黑名单中,因此是可以正常登录的:
[root@pc205 ~]# ftp 192.168.4.5
Connected to 192.168.4.5 (192.168.4.5).
220 (vsFTPd 2.2.2)
Name (192.168.4.5:root): lisi //以用户lisi登录
331 Please specify the password.
Password: //输入正确口令
230 Login successful. //登入成功
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> quit
221 Goodbye.
以用户mike访问FTP服务器时,此用户虽然在白名单中,但同时也在ftpuser黑名单中,因此尽管接受了用户名,但在提交密码后会被拒绝:
[root@pc205 ~]# ftp 192.168.4.5
Connected to 192.168.4.5 (192.168.4.5).
220 (vsFTPd 2.2.2)
Name (192.168.4.5:root): mike //以用户mike登录
331 Please specify the password.
Password: //输入正确口令
530 Login incorrect.
Login failed. //登入失败
ftp> quit
221 Goodbye.
修改vsftpd服务器的白名单文件,将匿名用户ftp、anonymous加入:
[root@svr5 ~]# vim /etc/vsftpd/user_list //不要有多余空格
lisi
mike
ftp
anonymous
再次从客户端匿名访问FTP服务器,将可以成功登入:
[root@pc205 ~]# ftp 192.168.4.5
Connected to 192.168.4.5 (192.168.4.5).
220 (vsFTPd 2.2.2)
Name (192.168.4.5:root): ftp //匿名登录
331 Please specify the password.
Password:
230 Login successful. //因已在服务器白名单中,顺利登入
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> quit
221 Goodbye.
沿用练习一,通过调整FTP服务端配置,实现以下目标:
关于vsftpd服务器的并发及带宽限制,主要用到以下配置参数:
实现此案例需要按照如下步骤进行。
步骤一:限制并发连接数
1)修改vsftpd服务配置,在末尾添加并发限制并重载服务
[root@svr5 ~]# vim /etc/vsftpd/vsftpd.conf
.. ..
max_clients=100
max_per_ip=2
[root@svr5 ~]# service vsftpd reload
关闭 vsftpd: [确定]
为 vsftpd 启动 vsftpd: [确定]
2)从客户机开多个FTP连接进行测试
访问vsftpd服务器时,只要客户端不主动断开连接,且闲置不超过300秒(默认),vsftpd服务器都会保留此连接。因此可以开多个命令终端同时登入此FTP服务器,以测试并发限制效果。
比如,从客户机pc205上匿名登入FTP服务器且不退出,前两次连接都是成功的,当第三次(超过2)连接时,会出现“There are too many connections .. ..”的报错提示,连接失败:
[root@svr5 ~]# ftp 192.168.4.5
Connected to 192.168.4.5 (192.168.4.5).
421 There are too many connections from your internet address. //连接数超限
ftp> pwd
Not connected. //未连接成功
ftp> quit
步骤二:限制FTP传输速度
1)修改vsftpd服务配置,在末尾添加速度限制,并重载服务
[root@svr5 ~]# vim /etc/vsftpd/vsftpd.conf
.. ..
anon_max_rate=50000
local_max_rate=500000
[root@svr5 ~]# service vsftpd reload
关闭 vsftpd: [确定]
为 vsftpd 启动 vsftpd: [确定]
2)在匿名FTP起始目录、用户lisi的家目录下建立下载测试文件
为了方便看到效果,建立的测试文件可以稍大一点(比如100MB)。直接使用dd命令生成相应的文件即可:
[root@svr5 ~]# dd if=/dev/zero of=/var/ftp/pub/anon.tgz bs=1M count=100
.. ..
[root@svr5 ~]# dd if=/dev/zero of=~lisi/local.tgz bs=1M count=100
.. ..
[root@svr5 ~]# ls -lh /var/ftp/pub/anon.tgz ~lisi/local.tgz //确认结果
-rw-r--r--. 1 root root 100M 1月 15 15:12 /home/lisi/local.tgz
-rw-r--r--. 1 root root 100M 1月 15 15:12 /var/ftp/pub/anon.tgz
3)使用wget命令下载上述文件,观察稳定以后的速度
匿名访问下载测试文件anon.tgz,速度稳定在50KB/s左右:
[root@pc205 ~]# wget ftp://192.168.4.5/pub/anon.tgz
--2015-01-15 15:14:52-- ftp://192.168.4.5/pub/anon.tgz
=> “anon.tgz”
正在连接 192.168.4.5:21... 已连接。
正在以 anonymous 登录 ... 登录成功!
==> SYST ... 完成。 ==> PWD ... 完成。
==> TYPE I ... 完成。 ==> CWD (1) /pub ... 完成。
==> SIZE anon.tgz ... 104857600
==> PASV ... 完成。 ==> RETR anon.tgz ... 完成。
长度:104857600 (100M) (非正式数据)
.. ..
0% [ ] 601,408 49.9K/s eta(英国中部时间) 34m 55s
!!!! 必要时,可按Ctrl+c键中止下载,不需要等全部下完
以用户lisi访问下载测试文件local.tgz,速度稳定在500KB/s左右:
[root@pc205 ~]# wget ftp://lisi:[email protected]/local.tgz
--2015-01-15 15:21:29-- ftp://lisi:*password*@192.168.4.5/local.tgz
=> “local.tgz”
正在连接 192.168.4.5:21... 已连接。
正在以 lisi 登录 ... 登录成功!
==> SYST ... 完成。 ==> PWD ... 完成。
==> TYPE I ... 完成。 ==> 不需要 CWD。
==> SIZE local.tgz ... 104857600
==> PASV ... 完成。 ==> RETR local.tgz ... 完成。
长度:104857600 (100M) (非正式数据)
.. ..
0% [ ] 868,352 503K/s eta(英国中部时间) 34m 55s
4)取消vsftpd服务的速度限制,再次测试下载效果
修改vsftpd.conf配置文件,将此前添加的限制下载速度的配置语句注释(或删除),并重载服务:
[root@svr5 ~]# vim /etc/vsftpd/vsftpd.conf
.. ..
#anon_max_rate=50000
#local_max_rate=500000
[root@svr5 ~]# service vsftpd reload
关闭 vsftpd: [确定]
为 vsftpd 启动 vsftpd: [确定]
再次使用wget下载测试文件anon.tgz,会发现速度已不受服务端限制,而是取决于实际的网络带宽:
[root@pc205 ~]# wget ftp://192.168.4.5/pub/anon.tgz
--2015-01-15 15:29:08-- ftp://192.168.4.5/pub/anon.tgz
=> “anon.tgz”
正在连接 192.168.4.5:21... 已连接。
正在以 anonymous 登录 ... 登录成功!
==> SYST ... 完成。 ==> PWD ... 完成。
==> TYPE I ... 完成。 ==> CWD (1) /pub ... 完成。
==> SIZE anon.tgz ... 104857600
==> PASV ... 完成。 ==> RETR anon.tgz ... 完成。
长度:104857600 (100M) (非正式数据)
86% [==========================> ] 90,344,032 28.2M/s eta(英国中部时100%[=============================================================>] 104,857,600 31.8M/s in 3.1s
2015-01-15 15:29:12 (31.8 MB/s) - “anon.tgz” 已保存 [104857600]