FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议”。用于Internet上的控制文件的双向传输。同时,它也是一个应用程序(Application)。基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议以传输文件。
FTP服务的基本信息:
软件安装包:vsftpd
默认发布目录: /var/ftp
协议接口: 21/tcp
服务配置文件:/etc/vsftpd/vsftpd.conf
报错id的解析:500 ##文件系统权限过大
530 ##用户认证失败
550 ##服务本身功能未开放
553 ##本地文件系统权限过小
一、发布环境搭建--->软件vsftpd
1.下载服务
vim /etc/yum.repos.d/rhel_dvd.repo
---->设置为网络镜像
yum clean all
yum search ftp
yum install vsftpd.x86_64 -y
systemctl start vsftpd
systemctl enable vsftpd
2.设置火墙
firewall-config
---->Permanent--->ftp--->Option--->Reload Firewalld ###启用vsftpd服务
或
firewall-cmd --permanent --add-service=ftp ##添加ftp服务到火墙白名单(不关闭防火墙)
firewall-cmd --reload ##重新加载防火墙配置
firewall-cmd --list-all
public (default, active)
interfaces: eth0
sources:
services: dhcpv6-client ftp ssh ##查看启用成功
vim /etc/sysconfig/selinux ###修改加强性认证火墙
reboot ###内核中修改的,需要重启
ssh [email protected] -X
getenforce ###查看加强性火墙
-->Disabled ###回显
检测搭建成功:
[root@localhost ftp]# touch file
[root@localhost ~]# lftp 172.25.254.87
bash: lftp: command not found... ###软件lftp:相当于浏览器
[root@localhost ftp]# yum install lftp -y
[root@localhost ftp] lftp 172.25.254.87
lftp 172.25.254.87:~> ls
-rw-r--r-- 1 0 0 0 Oct 28 03:26 file
drwxr-xr-x 2 0 0 6 Aug 03 2015 pub
二、用户登陆管理
1.匿名、本地用户登陆方法
[root@localhost ftp]# lftp 172.25.254.87 ###匿名用户登陆,下载文件位置/var/ftp
lftp 172.25.254.87:/> rm -fr /var/ftp/file ###匿名用户不可删除
lftp 172.25.254.87:/> ls
-rw-r--r-- 1 0 0 0 Oct 28 03:26 file
drwxr-xr-x 2 0 0 6 Aug 03 2015 pub
lftp 172.25.254.87:/> put /etc/passwd ###匿名用户不可写入
put: Access failed: 550 Permission denied. (passwd) ###550本地服务不允许
[root@localhost ~]# lftp 172.25.254.87 -u student
Password: ###本地用户登陆,服务的文件位置/home/用户
lftp [email protected]:~> ls
lftp [email protected]:~> put /etc/passwd ###服务中上传文件(绝对路径)
2040 bytes transferred
lftp [email protected]:~> ls
-rw-r--r-- 1 1000 1000 2040 Oct 28 03:54 passwd
lftp [email protected]:~> rm -fr passwd ###也可在服务中删除文件
rm ok, `passwd' removed
lftp [email protected]:~> ls
lftp [email protected]:~> quit
2.管理用户
vim /etc/vsftpd/vsftpd.conf
anonymous_enable=YES | NO ###匿名用户是否允许登陆
local_enable=YES | NO ###本地用户是否允许登陆
write_enable=YES | NO ###本地用户是否允许写入
#non_upload_enable=YES ###匿名用户是否可写,默认注释(不可写)
anon_world_readable_only=NO ###匿名用户可下载
anon_mkdir_write_enable=YES ###匿名用户可建目录
anon_other_write_enable=YES ###匿名用户可删除/var/ftp/pub,重命名
anon_max_rate=102400 ###匿名用户上传的最大速率100K(自定义)
max_clients=2 ###最多允许几个同时连接
anon_root=/westos ###匿名用户登陆后默认文件位置为/westos
chown_uploads=YES
chown_username=westos ###匿名用户使用的用户身份修改
chown_upload_mode=0644 ###westos用户上传文件权限
anon_umask=022 ##必须注释上一步 ###匿名用户上传文件权限777-022=755-111=644
systemctl restart vsftpd ###更改完需要重启服务
local_root=/westos ###更改本地用户默认位置
local_umask=077 ##更改本地用户上传文件权限,默认022
chroot_local_user=YES #本地用户是否锁定在家目录,不可切到根目录
chroot_local_user=YES ###切换根目录白名单建立
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
chroot_local_user=NO ###切换根目录黑名单建立
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
userlist_enable=YES ####本地用户登陆黑名单
/etc/vsftpd/ftpusers ###永久黑名单
/etc/vsftpd/user_list ###临时黑名单
userlist_deny=NO ###本地用户登陆白名单
#userlist_enable=YES
/etc/vsftpd/user_list
操作:
1)匿名用户开启写入
vim /etc/vsftpd/vsftpd.conf
加入:non_upload_enable=YES
systemctl restart vsftpd
测试:
[root@localhost ~]# lftp 172.25.254.87
lftp 172.25.254.87:~> ls
-rw-r--r-- 1 0 0 0 Oct 28 03:26 file
drwxr-xr-x 2 0 0 6 Aug 03 2015 pub
lftp 172.25.254.87:/> cd pub/
lftp 172.25.254.87:/pub> ls
lftp 172.25.254.87:/pub> put /etc/passwd
put: Access failed: 553 Could not create file. (passwd) ###553:服务器文件系统不允许
依然不可写,匿名用户是ftp身份,/var/ftp/pub只有root可写
chmod 775 /var/ftp/pub/
chgrp ftp /var/ftp/pub/
测试:
[root@localhost ~]# ll -d /var/ftp/pub/
drwxrwxr-x. 2 root ftp 6 Aug 3 2015 /var/ftp/pub/
[root@localhost ~]# lftp 172.25.254.87
lftp 172.25.254.87:~> cd pub/
cd ok, cwd=/pub
lftp 172.25.254.87:/pub> put /etc/passwd
2040 bytes transferred
lftp 172.25.254.87:~> get passwd ###本来不可以下载
get: Access failed: 550 Failed to open file. (passwd)
2)匿名用户开启下载
vim /etc/vsftpd/vsftpd.conf
加入:anon_world_readable_only=NO
systemctl restart vsftpd
测试:[root@localhost ~]# lftp 172.25.254.87
lftp 172.25.254.87:~> cd pub/
cd ok, cwd=/pub
lftp 172.25.254.87:/pub> get passwd
2040 bytes transferred ###可下载
lftp 172.25.254.87:/pub> rm -fr passwd
lftp 172.25.254.87:/pub> ls ###依然不可删除
-rw------- 1 14 50 2040 Oct 28 05:35 passwd
3)匿名用户开启建立目录
vim /etc/vsftpd/vsftpd.conf
加入:anon_mkdir_write_enable=YES
systemctl restart vsftpd
测试:[root@localhost ~]# lftp 172.25.254.87
lftp 172.25.254.87:~> cd pub/
cd ok, cwd=/pub
lftp 172.25.254.87:/pub> mkdir ll
mkdir ok, `ll' created
4)匿名用户可删除
vim /etc/vsftpd/vsftpd.conf
加入:anon_other_write_enable=YES
systemctl restart vsftpd
测试:[root@localhost ~]# lftp 172.25.254.87
lftp 172.25.254.87:~> cd pub/
cd ok, cwd=/pub
lftp 172.25.254.87:/pub> ls
drwx------ 2 14 50 6 Oct 28 06:18 ll
lftp 172.25.254.87:/pub> rm -r ll/
rm ok, `ll/' removed
5)匿名用户上传的最大速率
[root@localhost mnt]# dd if=/dev/zero of=/mnt/bigfile bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 8.62895 s, 122 MB/s
[root@localhost mnt]# lftp 172.25.254.87
lftp 172.25.254.87:~> cd pub/
cd ok, cwd=/pub
lftp 172.25.254.87:/pub> ls
lftp 172.25.254.87:/pub> put /mnt/bigfile
1048576000 bytes transferred in 11 seconds (90.34M/s)
vim /etc/vsftpd/vsftpd.conf
加入:anon_max_rate=102400
systemctl restart vsftpd
6)最多允许几个同时连接
vim /etc/vsftpd/vsftpd.conf
加入:max_clients=2
systemctl restart vsftpd
7)匿名用户登陆后默认文件位置
[root@localhost mnt]# mkdir -p /westos/westosdir
vim /etc/vsftpd/vsftpd.conf
加入:anon_root=/westos
systemctl restart vsftpd
[root@localhost mnt]# lftp 172.25.254.87
lftp 172.25.254.87:~> ls
drwxr-xr-x 2 0 0 6 Oct 28 07:03 westosdir
8)匿名用户使用的用户身份修改及权限
vim /etc/vsftpd/vsftpd.conf
加入:
chown_uploads=YES
chown_username=westos ###匿名用户使用的用户身份修改
chown_upload_mode=0644 ###此用户上传文件权限
systemctl restart vsftpd
lftp 172.25.254.87:/pub> put /etc/passwd
2083 bytes transferred
lftp 172.25.254.87:/pub> ls
-rw-r--r-- 1 14 50 6547538 Oct 28 07:02 bigfile
-rw------- 1 1002 50 491 Oct 28 06:48 inittab
-rw-r--r-- 1 1002 50 2083 Oct 28 07:11 passwd
9)匿名用户上传文件权限
vim /etc/vsftpd/vsftpd.conf
加入:anon_umask=022 ##777-系统预留022-文件系统预留111=644
注释:8)中修改
systemctl restart vsftpd
lftp 172.25.254.87:/pub> put /mnt/bigfile
Interrupt
lftp 172.25.254.87:/pub> ls
-rw-r--r-- 1 14 50 6547538 Oct 28 07:02 bigfile
10)更改本地用户默认位置
vim /etc/vsftpd/vsftpd.conf
加入:local_root=/westos
systemctl restart vsftpd
[root@localhost mnt]# lftp 172.25.254.87 -u student
Password:
lftp [email protected]:~> ls
drwxr-xr-x 2 0 0 6 Oct 28 07:03 westos
11)更改本地用户上传文件权限
vim /etc/vsftpd/vsftpd.conf
加入:local_umask=077
systemctl restart vsftpd
[root@localhost mnt]# lftp 172.25.254.87 -u student
Password:
lftp [email protected]:~> ls
-rw-r--r-- 1 1000 1000 2083 Oct 28 08:07 passwd
lftp [email protected]:~> put /etc/inittab
491 bytes transferred
lftp [email protected]:~> ls
-rw------- 1 1000 1000 491 Oct 28 08:11 inittab
-rw-r--r-- 1 1000 1000 2083 Oct 28 08:07 passwd
12)本地用户是否锁定在家目录,不可切到根目录
vim /etc/vsftpd/vsftpd.conf
加入:chroot_local_user=YES
systemctl restart vsftpd
[root@localhost mnt]# lftp 172.25.254.87 -u qq
Password:
lftp [email protected]:~> qq
Unknown command `qq'.
lftp [email protected]:~> ls
ls: Login failed: 500 OOPS: vsftpd: refusing to run with writable root inside chroot()
lftp [email protected]:~> quit
[root@localhost mnt]# chmod u-w /home/*
[root@localhost mnt]# lftp 172.25.254.87 -u qq
Password:
lftp [email protected]:~> ls
lftp [email protected]:/> cd /
lftp [email protected]:/> ls
13)切换根目录白名单建立
vim /etc/vsftpd/vsftpd.conf
加入:chroot_local_user=YES
chroot_list_enable=YES
systemctl restart vsftpd
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
[root@localhost ~]# systemctl restart vsftpd
[root@localhost mnt]# touch /etc/vsftpd/chroot_list
[root@localhost mnt]# vim /etc/vsftpd/chroot_list
------> student
[root@localhost ~]# lftp 172.25.254.87 -u qq
Password:
lftp [email protected]:~> ls
Interrupt
lftp [email protected]:~> quit
[root@localhost ~]# lftp 172.25.254.87 -u student
Password:
lftp [email protected]:~> ls
-rw------- 1 1000 1000 491 Oct 28 08:11 inittab
-rw-r--r-- 1 1000 1000 2083 Oct 28 08:07 passwd
lftp [email protected]:~> 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
14)切换根目录黑名单建立
vim /etc/vsftpd/vsftpd.conf
加入:chroot_local_user=NO
chroot_list_enable=YES
systemctl restart vsftpd
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
[root@localhost ~]# systemctl restart vsftpd
[root@localhost mnt]# touch /etc/vsftpd/chroot_list
[root@localhost mnt]# vim /etc/vsftpd/chroot_list
------> student
[root@localhost ~]# lftp 172.25.254.87 -u qq
Password:
lftp [email protected]:~> ls
lftp [email protected]:~> 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
[root@localhost ~]# lftp 172.25.254.87 -u student
Password:
lftp [email protected]:~> ls
-rw------- 1 1000 1000 491 Oct 28 08:11 inittab
-rw-r--r-- 1 1000 1000 2083 Oct 28 08:07 passwd
lftp [email protected]:/> cd /
lftp [email protected]:/> ls
15)本地用户登陆黑名单
vim /etc/vsftpd/vsftpd.conf
加入: userlist_enable=YES
systemctl restart vsftpd
[root@localhost ~]# vim /etc/vsftpd/user_list | vim /etc/vsftpd/ftpusers
---->westos
[root@localhost ~]# lftp 172.25.254.87 -u westos
Password:
lftp [email protected]:~> ls
Interrupt
[root@localhost ~]# lftp 172.25.254.87 -u qq
Password:
lftp [email protected]:~> ls
16)本地用户登陆白名单
vim /etc/vsftpd/vsftpd.conf
加入:userlist_deny=NO
#userlist_enable=YES
systemctl restart vsftpd
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
[root@localhost ~]# systemctl restart vsftpd.service
[root@localhost ~]# vim /etc/vsftpd/user_list
-----> qq westos
[root@localhost ~]# lftp 172.25.254.87 -u qq
Password:
lftp [email protected]:~> ls
[root@localhost ~]# lftp 172.25.254.87 -u westos
Password:
lftp [email protected]:~> ls ###黑白名单同时存在,黑名单生效
ls: Login failed: 530 Login incorrect.
三、ftp虚拟用户设定
1.创建虚拟帐号身份
vim /etc/vsftpd/ftplogin ###文件名自定义
-->qq1
111
qq2
222
qq3
333
2.虚拟名单加密
db_load -T -t hash -f /etc/vsftpd/ftplogin /etc/vsftpd/ftplogin.db ###-T 转换 -t 转换格式 -f 将谁转换为谁
3.对名单设置pam认证 ####名单与pam程序关联
vim /etc/pam.d/qq ###文件名自定义
account required pam_userdb.so db=/etc/vsftpd/ftplogin
auth required pam_userdb.so db=/etc/vsftpd/ftplogin
用户|密码 通过或拒绝 认证程序pam 用户及密码名单(会自动补个.db)
注:找服务是否存在,在哪:find / -name pam_userdb.so
4.让vsftpd对虚拟用户采用pam认证方式 ####vsftpd与pam程序关联
vim /etc/vsftpd/vsftpd.conf
pam_service_name=qq ##关联;pam认证文件名
guest_enable=YES ##激活
guest_username=ftp ##登陆后真实身份都为此指定用户
systemctl restart vsftpd
测试:
[root@localhost ~]# lftp 172.25.254.87 -u qq1
Password:
lftp [email protected]:~> ls
-rw-r--r-- 1 0 0 0 Oct 28 03:26 file
drwxrwxr-x 2 0 50 47 Oct 28 07:11 pub
[root@localhost ~]# lftp 172.25.254.87 -u qq2
Password:
lftp [email protected]:~> ls
-rw-r--r-- 1 0 0 0 Oct 28 03:26 file
drwxrwxr-x 2 0 50 47 Oct 28 07:11 pub
[root@localhost ~]# lftp 172.25.254.87 -u qq3
Password:
lftp [email protected]:~> ls
-rw-r--r-- 1 0 0 0 Oct 28 03:26 file
drwxrwxr-x 2 0 50 47 Oct 28 07:11 pub
5.设定虚拟用户登陆家目录
mkdir -p /ftphome/qq1/qq1dir/
mkdir -p /ftphome/qq2/qq2dir/
mkdir -p /ftphome/qq3/qq3dir/
vim /etc/vsftpd/vsftpd.conf
写入:
local_root=/ftphome/$USER ###指定虚拟用户登陆家目录
user_sub_token=$USER ###声明字符串变量$USER,与它在shell中用法一致
systemctl restart vsftpd
测试:
[root@localhost ~]# lftp 172.25.254.87 -u qq1
Password:
lftp [email protected]:~> ls
drwxr-xr-x 2 0 0 6 Oct 28 03:10 qq1dir
lftp [email protected]:/> quit
[root@localhost ~]# lftp 172.25.254.87 -u qq2
Password:
lftp [email protected]:~> ls
drwxr-xr-x 2 0 0 6 Oct 28 03:10 qq2dir
lftp [email protected]:/> quit
[root@localhost ~]# lftp 172.25.254.87 -u qq3
Password:
lftp [email protected]:~> ls
drwxr-xr-x 2 0 0 6 Oct 28 03:10 qq3dir
6.某个虚拟用户的单独管理
chmod 775 /fpthome/qq*/* ###给家目录775 权限(组中人可写,其他人不可)
chgrp ftp /ftphome/qq*/* ###设置家目录属于ftp组,因指定过虚拟用户以ftp身份(ftp组内)登陆,所以虚拟用户可读写
vim /etc/vsftpd/vsftpd.conf
取消之前写的权力 ###回收默认权限
写入:
user_config_dir=/etc/vsftpd/configdir ###指定单个虚拟用户权限子配置文件的目录
mkdir /etc/vsftpd/configdir -p
systemctl restart vsftpd.service
vim /etc/vsftpd/configdir/qq3 ##单独管理谁,文件名就是谁,且目录为文件指定目录
写入:anon_upload_enable=YES ###虚拟用户qq3可上传
测试:
[root@localhost ftphome]# lftp 172.25.254.87 -u qq3
Password:
lftp [email protected]:~> cd qq3dir/
cd ok, cwd=/qq3dir
lftp [email protected]:/qq3dir> ls
lftp [email protected]:/qq3dir> put /etc/passwd ###qq3可上传
2157 bytes transferred
lftp [email protected]:/qq3dir> rm -fr passwd
lftp [email protected]:/qq3dir> ls ###qq3不可删
-rw------- 1 14 50 2157 Oct 28 04:00 passwd
[root@localhost ftphome]# lftp 172.25.254.87 -u qq2
Password:
lftp [email protected]:~> cd qq2dir/
cd ok, cwd=/qq2dir
lftp [email protected]:/qq2dir> put /etc/passwd
put: Access failed: 550 Permission denied. (passwd) ###qq2不可上传