vsftpd服务
1.ftp的定义: ftp:// ##文件传输协议
2.ftp协议提供的软件: 在rhel7中:vsftpd
3.部署ftp服务
[root@localhost ~]# vim /etc/sysconfig/selinux ##更改防火墙状态 SELINUX=disabled
[root@localhost ~]# reboot ##reboot之后火墙状态才会更改
[root@localhost ~]# getenforce ##查看火墙状态
[root@localhost ~]# yum install vsftpd lftp -y ##安装ftp和lftp
[root@localhost ~]# systemctl start vsftpd ##开启ftp
[root@localhost ~]# systemctl enable vsftpd
[root@localhost ~]# lftp 172.25.254.228
lftp 172.25.254.228:~> ls
drwxr-xr-x 2 0 0 6 Mar 07 2014 pub
报错:
[root@localhost ~]# lftp 172.25.254.228
lftp 172.25.254.228:~> ls
`ls' at 0 [Delaying before reconnect: 29] ##说明没有连接上,防火墙阻止
[root@localhost ~]# firewall-cmd --permanent --add-service=ftp ##将ftp服务加进防火墙
success
[root@localhost ~]# firewall-cmd --reload ##重新加载防火墙
success
[root@localhost ~]# lftp 172.25.254.228 ##再次查看就可以了
lftp 172.25.254.228:~> ls
drwxr-xr-x 2 0 0 6 Mar 07 2014 pub
4.ftp服务的基本信息
软件安装包:vsftpd
默认发布目录:/var/ftp
协议接口: 21/tcp
服务配置文件:/etc/vsftpd/vsftpd.conf
报错id的解析:500 ##文件系统权限过大
530 ##用户认证失败
550 ##服务本身功能未开放
553 ##本地文件系统权限过小
(1)匿名用户家目录修改
[root@localhost ~]# cd /var/ftp
[root@localhost ftp]# ls
pub
[root@localhost ftp]# touch westosfile ##建立一个文件有利于后面操作查看的结果
[root@localhost ftp]# ls
pub westosfile
[root@localhost ftp]# mkdir /ftpdir/westosdir -p ##建立一个新的家目录
[root@localhost ftp]# vim /etc/vsftpd/vsftpd.conf
13 anon_root=/ftpdir ##用户家目录修改
[root@localhost ftp]# systemctl restart vsftpd ##重启vsftpd
[root@localhost ftp]# lftp 172.25.254.228
lftp 172.25.254.228:~> ls
drwxr-xr-x 2 0 0 6 May 07 11:10 westosdir ##可以看到家目录的修改
(2)用匿名用户是否可以登陆
[root@localhost ftp]# vim /etc/vsftpd/vsftpd.conf
12 anonymous_enable=NO ##用匿名用户不可以登陆
[root@localhost ftp]# systemctl restart vsftpd
[root@localhost ftp]# lftp 172.25.254.228
lftp 172.25.254.228:~> ls
##登录不上,处于无法连接状态 (如图所示)
(3)本地用户是否可以登陆
[root@localhost ftp]# vim /etc/vsftpd/vsftpd.conf
12 anonymous_enable=YES
16 local_enable=NO ##本地用户是否可以登陆
[root@localhost ftp]# systemctl restart vsftpd
[root@localhost ftp]# useradd westos ##建立用户
[root@localhost ftp]# lftp 172.25.254.228 -u westos
Password:
lftp dmf@172.25.254.228:~> ls
ls: Login failed: 530 This FTP server is anonymous only. ##服务本身功能未开放
注意: 要将之前做的匿名登录改为YES,否则会出现报错,如下:
报错:
[root@localhost ftp]# vim /etc/vsftpd/vsftpd.conf
[root@localhost ftp]# systemctl restart vsftpd
[root@localhost ftp]# useradd westos
[root@localhost ftp]# lftp 172.25.254.228 -u westos
Password:
lftp westos@172.25.254.228:~> ls
`ls' at 0 [Delaying before reconnect: 8] ##会显示连接不上
(4)是否对登陆的用户可写
[root@localhost ~]# su - student
[student@localhost ~]$ cd /home/student
[student@localhost ~]$ ls
[student@localhost ~]$ mkdir pub ##建立一个目录
[student@localhost ~]$ ls
pub
[student@localhost ~]$ exit
logout
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
local_enable=YES ##本地用户可登录
write_enable=YES ##本地用户登录可写
[root@localhost ~]# systemctl restart vsftpd
[root@localhost ~]# lftp 172.25.254.228 -u student
Password:
lftp student@172.25.254.228:~> cd pub
cd ok, cwd=/home/student/pub
lftp [email protected]:~/pub> put /etc/passwd ##可以上传文件说明对登录的用户是可写的
2048 bytes transferred
(5)匿名用户上传
[root@localhost ftp]# vim /etc/vsftpd/vsftpd.conf
28 anon_upload_enable=YES ##匿名用户上传
[root@localhost ftp]# systemctl restart vsftpd
[root@localhost ftp]# chgrp ftp /var/ftp/pub ##建立一个组
[root@localhost ftp]# chmod 775 /var/ftp/pub
[root@localhost ftp]# lftp 172.25.254.228 ##匿名用户
lftp 172.25.254.228:~> ls
drwxr-xr-x 2 0 0 6 Mar 07 2014 pub
-rw-r--r-- 1 0 0 0 May 05 07:33 westosfile
[root@localhost ftp]# lftp 172.25.254.228
lftp 172.25.254.228:~> cd /pub ##必须要有这个目录才可以上传到这里
cd ok, cwd=/pub
lftp 172.25.254.228:/pub> put /etc/passwd
2397 bytes transferred ##上传成功
(6)匿名用户下载
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
13 anon_world_readable_only=NO ##设定参数为no表示匿名用户可以下载
[root@localhost ~]# systemctl restart vsftpd
[root@localhost ~]# lftp 172.25.254.228
lftp 172.25.254.228:~> cd /pub
cd ok, cwd=/pub
lftp 172.25.254.228:/pub> ls
-rw------- 1 14 50 2048 May 08 12:40 passwd
lftp 172.25.254.228:/pub> get passwd ##下载pub目录里有的文件
2048 bytes transferred ##下载成功
(7)匿名用户删除
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
12 anonymous_enable=YES ##需要可以匿名登录
13 anon_world_readable_only=NO
14 anon_other_write_enable=YES ##删除
[root@localhost ~]# systemctl restart vsftpd
[root@localhost ~]# lftp 172.25.254.228
lftp 172.25.254.228:~> cd /pub
cd ok, cwd=/pub
lftp 172.25.254.228:/pub> rm passwd ##删除pub里的文件
rm ok, `passwd' removed ##删除成功
(8)匿名用户建立目录
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
34 anon_mkdir_write_enable=YES ##匿名用户建立目录
[root@localhost ~]# systemctl restart vsftpd
[root@localhost ~]# lftp 172.25.254.228
lftp 172.25.254.228:~> cd /pub
cd ok, cwd=/pub
lftp 172.25.254.228:/pub> mkdir test ##建立一个目录
mkdir ok, `test' created ##建立成功
lftp 172.25.254.228:/pub> ls
drwx------ 2 14 50 6 May 08 12:57 test
(9)限制上传速度
没有限制时的速度:
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
30 anon_upload_enable=YES ##匿名上传
[root@localhost ~]# systemctl restart vsftpd
[root@localhost ~]# dd if=/dev/zero of=/mnt/bigfile bs=1M count=2000 ##截取一个文件
2000+0 records in
2000+0 records out
2097152000 bytes (2.1 GB) copied, 26.685 s, 78.6 MB/s
[root@localhost ~]# lftp 172.25.254.228
lftp 172.25.254.228:~> cd /pub
cd ok, cwd=/pub
lftp 172.25.254.228:/pub> put /mnt/bigfile
2097152000 bytes transferred in 65 seconds (30.92M/s) ###没有限制的时候速度
lftp 172.25.254.228:/pub> quit
[root@localhost ~]# rm -fr /var/ftp/pub/bigfile ##删除刚才上传的文件(保证再做下一个限速实验的时候是没有上传过的,不然会出错)
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
30 anon_upload_enable=YES
31 anon_max_rate=102400(设定的字节) ##限制网速
[root@localhost ~]# systemctl restart vsftpd
[root@localhost ~]# lftp 172.25.254.228
lftp 172.25.254.228:~> cd /pub
cd ok, cwd=/pub
lftp 172.25.254.228:/pub> put /mnt/bigfile ##限制网速
(10)本地用户上传文件权限
没有修改权限时:
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
24 local_umask=022 ##本地用户上传权限
[root@localhost ~]# systemctl restart vsftpd
[root@localhost ~]# lftp 172.25.254.228 -u student
Password:
lftp student@172.25.254.228:~> put /etc/passwd
2048 bytes transferred
lftp student@172.25.254.228:~> ls
-rw-r--r-- 1 1000 1000 2048 May 08 13:26 passwd ##上传的passwd权限为644
drwxrwxr-x 2 1000 1000 19 May 08 12:27 pub
更改本地用户的上传权限后:
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
24 local_umask=077 ##本地用户上传权限
25 anon_umask=022 ##匿名用户上传权限
[root@localhost ~]# systemctl restart vsftpd
[root@localhost ~]# lftp 172.25.254.228 -u student
Password:
lftp student@172.25.254.228:~> put /etc/group
865 bytes transferred in 10 seconds (86b/s)
lftp student@172.25.254.228:~> ls
-rw------- 1 1000 1000 865 May 08 13:32 group ##再一次上传的权限为600
-rw-r--r-- 1 1000 1000 2048 May 08 13:26 passwd
drwxrwxr-x 2 1000 1000 19 May 08 12:27 pub
lftp student@172.25.254.228:~> rm group ##在开启本地用户删除的情况下可以先把文件删除,以便于下一次实验
rm ok, `group' removed
lftp [email protected]:~> rm passwd
rm ok, `passwd' removed
(11)限制本地用户浏览/目录
不可以访问家目录:
[root@localhost ~]# chmod u-w /home/* ##所有用户被锁定到自己的家目录中
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
102 chroot_local_user=YES ##默认任何人都不可以访问家目录
[root@localhost ~]# systemctl restart vsftpd
[root@localhost ~]# lftp 172.25.254.228 -u student
Password:
lftp student@172.25.254.228:~> ls
drwxrwxr-x 2 1000 1000 19 May 08 12:27 pub
lftp student@172.25.254.228:/> cd / ##切换到 / 下家目录,不能访问到
lftp student@172.25.254.228:/> ls
drwxrwxr-x 2 1000 1000 19 May 08 12:27 pub
lftp student@172.25.254.228:/> quit
任何人可以随意浏览/目录:
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
102 chroot_local_user=NO ##表示默认任何人可以随意浏览
[root@localhost ~]# systemctl restart vsftpd
[root@localhost ~]# chmod u-w /home/*
[root@localhost ~]# lftp 172.25.254.228 -u student
Password:
lftp student@172.25.254.228:~> ls
drwxrwxr-x 2 1000 1000 19 May 08 12:27 pub
lftp student@172.25.254.228:~> cd /
cd ok, cwd=/
lftp [email protected]:/> ls ##可以查看到/下的家目录
lrwxrwxrwx 1 0 0 7 May 07 2014 bin -> usr/bin
dr-xr-xr-x 4 0 0 4096 Jul 10 2014 boot
drwxr-xr-x 18 0 0 2860 May 08 12:10 dev
drwxr-xr-x 134 0 0 8192 May 08 12:09 etc
(12)用户黑名单建立
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
102 chroot_local_user=NO ##黑名单
103 chroot_list_enable=YES
105 chroot_list_file=/etc/vsftpd/chroot_list
[root@localhost ~]# systemctl restart vsftpd
[root@localhost ~]# vim /etc/vsftpd/chroot_list ##编写黑名单,list是黑名单,默认任何人都可以,只有名单里的人不可以
[root@localhost ~]# cat /etc/vsftpd/chroot_list
westos ##westos为黑名单
[root@localhost ~]# lftp 172.25.254.228 -u westos ##用westos登录
Password:
lftp westos@172.25.254.228:~> cd /
cd ok, cwd=/
lftp westos@172.25.254.228:/> ls ##查看不到家目录里的内容
[root@localhost ~]# lftp 172.25.254.228 -u student ##登录到没有添加到黑名单的用户
Password:
lftp student@172.25.254.228:~> ls ##可以查看到目录
drwxrwxr-x 2 1000 1000 19 May 08 12:27 pub
lftp student@172.25.254.228:~> cd /
cd ok, cwd=/
lftp student@172.25.254.228:/> ls ##可以看到家目录
lrwxrwxrwx 1 0 0 7 May 07 2014 bin -> usr/bin
dr-xr-xr-x 4 0 0 4096 Jul 10 2014 boot
drwxr-xr-x 18 0 0 2860 May 09 08:11 dev
drwxr-xr-x 134 0 0 8192 May 09 08:23 etc
(13)用户白名单建立
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
102 chroot_local_user=YES ##白名单
103 chroot_list_enable=YES
105 chroot_list_file=/etc/vsftpd/chroot_list
[root@localhost ~]# systemctl restart vsftpd
[root@localhost ~]# cat /etc/vsftpd/chroot_list
westos ##白名单中只有名单里的人可以,默认任何人都不可以
[root@localhost ~]# lftp 172.25.254.228 -u westos
Password:
lftp westos@172.25.254.228:~> ls
lftp westos@172.25.254.228:~> cd /
cd ok, cwd=/
lftp westos@172.25.254.228:/> ls ##在白名单中的用户可以访问到家目录
lrwxrwxrwx 1 0 0 7 May 07 2014 bin -> usr/bin
dr-xr-xr-x 4 0 0 4096 Jul 10 2014 boot
drwxr-xr-x 18 0 0 2860 May 09 08:11 dev
[root@localhost ~]# lftp 172.25.254.228 -u student ##登录不在白名单的用户
Password:
lftp student@172.25.254.228:~> ls
drwxrwxr-x 2 1000 1000 19 May 08 12:27 pub
lftp student@172.25.254.228:/> cd / ##访问不到家目录
lftp student@172.25.254.228:/> ls
drwxrwxr-x 2 1000 1000 19 May 08 12:27 pub
注意: 黑白名单的区分就是chroot_local_user=YES | NO,当这个命令为YES时,默认/etc/vsftpd/chroot_list为白名单,若为NO时,则反之为黑名单。
(14)限制本地用户登陆
用户黑名单:
[root@localhost ~]# vim /etc/vsftpd/ftpusers ##用户黑名单
[root@localhost ~]# cat /etc/vsftpd/ftpusers
westos ##将westos设为黑名单里
[root@localhost ~]# lftp 172.25.254.228 -u student ##登录不是黑名单的用户可以看到目录
Password:
lftp student@172.25.254.228:~> ls
drwxrwxr-x 2 1000 1000 19 May 08 12:27 pub
lftp student@172.25.254.228:/> quit
[root@localhost ~]# lftp 172.25.254.228 -u westos ##登录到黑名单用户
Password:
lftp westos@172.25.254.228:~> ls
ls: Login failed: 530 Login incorrect. ##用户认证失败
注意:
vim /etc/vsftpd/user_list ##用户临时黑名单
ftpusers的黑名单强度大于user_list黑名单
用户白名单:
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
128 userlist_enable=YES
129 userlist_deny=NO
[root@localhost ~]# systemctl restart vsftpd
[root@localhost ~]# vim /etc/vsftpd/user_list ##参数设定,此文件变成用户白名单,只在名单中出现的用户可以登陆ftp
将student写入
[root@localhost ~]# lftp 172.25.254.228 -u student ##白名单中的用户登录
Password:
lftp student@172.25.254.228:~> ls ##可以查看
drwxrwxr-x 2 1000 1000 19 May 08 12:27 pub
lftp student@172.25.254.228:/> quit
[root@localhost ~]# lftp 172.25.254.228 -u westos ##不在白名单中的用户
Password:
lftp westos@172.25.254.228:~> ls
ls: Login failed: 530 Permission denied. ##530表示用户认证失败
分析: 将student写进白名单时,westos就不可以登陆
(15)ftp虚拟用户的设定
[root@localhost ~]# cd /etc/vsftpd
[root@localhost vsftpd]# ls
[root@localhost vsftpd]# vim userdb ##文件名称任意
user1 ##用户名
123 ##登陆密码
user2
123
user3
123
[root@localhost vsftpd]# db_load -T -t hash -f userdb userdb.db ##加密
[root@localhost vsftpd]# file userdb
userdb: ASCII text
[root@localhost vsftpd]# file userdb.db
userdb.db: Berkeley DB (Hash, version 9, native byte-order)
[root@localhost vsftpd]# vim /etc/pam.d/westos ##文件名称任意,加密的认证钥匙
account required pam_userdb.so db=/etc/vsftpd/userdb ##自己建立的帐号和密码
auth required pam_userdb.so db=/etc/vsftpd/userdb
[root@localhost vsftpd]# vim /etc/vsftpd/vsftpd.conf
127 pam_service_name=westos
128 guest_enable=YES
129 guest_username=ftp ##虚拟帐号身份指定
##如果用student的权限过大chmod u-w /home/student
130 userlist_enable=YES
[root@localhost vsftpd]# systemctl restart vsftpd
[root@localhost vsftpd]# lftp 172.25.254.228 -u user1 ##登录user1
Password:
lftp user1@172.25.254.228:~> ls ##可以查看到目录或文件
drwxrwxr-x 3 0 50 31 May 08 13:10 pub
-rw-r--r-- 1 0 0 0 May 07 11:06 westosfile
报错:
[root@localhost vsftpd]# lftp 172.25.254.228 -u user1
Password:
lftp user1@172.25.254.228:~> ls
ls: Login failed: 530 Permission denied.
注意: 要是有以上报错是需要将上次实验的白名单在/etc/vsftpd/vsftpd.conf注释掉,否则会出现用户认证失败。
在/etc/pam.d/westos下写的帐号和密码是自己建立并编写的
(16)虚拟帐号家目录独立设定
[root@localhost ~]# mkdir /vftpdir ##文件名任意
[root@localhost ~]# cd /vftpdir
[root@localhost vftpdir]# ls
[root@localhost vftpdir]# mkdir user{1..3}
[root@localhost vftpdir]# ll
total 0
drwxr-xr-x 2 root root 6 May 6 02:39 user1
drwxr-xr-x 2 root root 6 May 6 02:39 user2
drwxr-xr-x 2 root root 6 May 6 02:39 user3
[root@localhost vftpdir]# touch user1/user1file
[root@localhost vftpdir]# touch user2/user2file
[root@localhost vftpdir]# touch user3/user3file
[root@localhost vftpdir]# vim /etc/vsftpd/vsftpd.conf
133 local_root=/vftpdir/$USER ##虚拟帐号家目录独立设定
134 user_sub_token=$USER ##执行USER
[root@localhost vftpdir]# systemctl restart vsftpd
[root@localhost vftpdir]# lftp 172.25.254.228 -u user1
Password:
lftp user1@172.25.254.228:~> ls
-rw-r--r-- 1 0 0 0 May 06 07:38 user1file
(17)虚拟帐号配置独立
[root@localhost vftpdir]# mkdir user{1..3}/pub
[root@localhost vftpdir]# chgrp westos user{1..3}/pub
[root@localhost vftpdir]# chmod 775 user{1..3}/pub
[root@localhost vftpdir]# vim /etc/vsftpd/vsftpd.conf
##注释掉14 anon_other_write_enable=YES
31 anon_upload_enable=YES
32 anon_max_rate=102400
##写入:135 user_config_dir=/etc/vsftpd/conf_dir
[root@localhost vftpdir]# systemctl restart vsftpd
[root@localhost vftpdir]# lftp 172.25.254.228 -u user1 ##此时是没有给user1的配置独立的结果
Password:
lftp user1@172.25.254.228:~> ls
drwxrwxr-x 2 0 1001 6 May 06 07:41 pub
-rw-r--r-- 1 0 0 0 May 06 07:38 user1file
lftp user1@172.25.254.228:/> cd /pub
lftp user1@172.25.254.228:/pub> put /etc/passwd
put: Access failed: 550 Permission denied. (passwd) ##550服务本身功能
虚拟帐号user1配置独立:
[root@localhost vftpdir]# mkdir /etc/vsftpd/conf_dir -p
[root@localhost vftpdir]# vim /etc/vsftpd/conf_dir/user1 ##在此文件中设定配置文件中的所有参数,此文件的优先级高
anon_upload_enable=YES ##里面编写的只允许user1的上传
[root@localhost vftpdir]# lftp 172.25.254.228 -u user1
Password:
lftp user1@172.25.254.228:~> ls
drwxrwxr-x 2 0 1001 6 May 06 07:41 pub
-rw-r--r-- 1 0 0 0 May 06 07:38 user1file
lftp user1@172.25.254.228:/> cd /pub
lftp user1@172.25.254.228:/pub> put /etc/passwd ##上传
2085 bytes transferred
lftp user1@172.25.254.228:/pub> rm passwd ##删除passwd
rm: Access failed: 550 Permission denied. (passwd) ##550服务本身功能未开放,没有在/etc/vsftpd/conf_dir/user1里面编入可删除功能
lftp user1@172.25.254.228:/pub> quit
[root@localhost vftpdir]# lftp 172.25.254.228 -u user2
Password:
lftp user2@172.25.254.228:~> cd /pub
cd ok, cwd=/pub
lftp user2@172.25.254.228:/pub> put /etc/group ##在上面文件只写了user1可上传,所以其他用户没有权力
put: Access failed: 550 Permission denied. (group)
lftp user2@172.25.254.228:/pub> quit
报错:
[root@localhost vftpdir]# lftp 172.25.254.228 -u user1
Password:
lftp user1@172.25.254.228:~> ls
drwxrwxr-x 2 0 1001 6 May 09 09:47 pub
-rw-r--r-- 1 0 0 0 May 09 09:39 user1file
lftp user1@172.25.254.228:/> cd /pub
lftp user1@172.25.254.228:/pub> put /etc/passwd
put: Access failed: 553 Could not create file. (passwd)
注意: 以上报错553说明本地文件系统权限过小,需要给一个权限
看/etc/vsftpd/vsftpd.conf配置文件里的该开的权限有没有开启。