目录
1.Ftp 介绍
文件传输协议(File Transfer Protocol,FTP),基于该协议FTP客户端与服务端可以实现共享文件、上传文件、下载、删除文件。FTP服务器端可以同时提供给多人共享使用。
FTP服务是Client/Server(简称C/S)模式,基于FTP协议实现FTP文件对外共享及传输的软件称之为FTP服务器源端,客户端程序基于FTP协议,则称之为FTP客户端,FTP客户端可以向FTP服务器上传、下载文件。
FTP Server
作用:提供文件共享服务,实现上传下载
端口:
21号—建立tcp连接 默认端口
20号—传输数据
软件包:vsftpd
配置文件:/etc/vsftpd/vsftpd.conf
1.1.ftp主动模式
ftp主动模式:客户端开启一个端口N(>1023)向服务端的21端口,建立连接,同时开启一个N+1,告诉服务端,我监听的是N+1端口,服务端接到请求之后,用自己的20端口连接到客户端的N+1端口,进行传输
1.2.ftp被动模式
ftp被动模式:客户端同时开启两个端口(1024,1025),一个端口(1024)跟服务端的21端口建立连接,并请求,大哥,我连上了,你再开一个端口呗。服务端接到请求之后,随机会开启一个端口(1027)并告诉客户端我开启的是1027端口,客户端用另一个端口(1025)与服务端的(1027)端口进行连接,传输数据
2.Vsftp服务器简介
非常安全的FTP服务进程(Very Secure FTP daemon,Vsftpd),Vsftpd在Unix/Linux发行版中最主流的FTP服务器程序,优点小巧轻快,安全易用、稳定高效、满足企业跨部门、多用户的使用(1000用户)等。
2.1.vsftp匿名用户配置(主动模式)
2.1.1.环境准备
实验环境--准备两台机器
ftp-server---192.168.246.160
client---192.168.246.161
关闭防火墙和selinux
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
[root@localhost ~]# setenforce 0
安装FTP Server(服务端)
[root@ftp-server ~]# yum install -y vsftpd
[root@ftp-server ~]# systemctl start vsftpd
[root@ftp-server ~]# systemctl enable vsftpd
2.1.2.FTP默认共享目录:/var/ftp
[root@ftp-server ~]# mkdir /var/ftp/upload //创建自己的共享目录
[root@ftp-server ~]# touch /var/ftp/upload/test.txt //创建文件到共享目录
[root@ftp-server ~]# cd /var/ftp/
[root@ftp-server ftp]# ls
pub upload
[root@ftp-server ftp]# chown ftp.ftp * -R //修改根目录的属主与属组
[root@ftp-server ftp]# ll
total 0
drwxr-xr-x. 2 ftp ftp 22 Aug 3 03:15 pub
drwxr-xr-x. 2 ftp ftp 22 Aug 27 03:15 upload
重点:改变根目录的属主,如果不改变的话,只能访问,其他权限不能生效。因为我们是以ftp用户的身份访问的,而默认的属主属组是root。
注意:
修改完配置之后需要重启完服务才能生效
还需要重新从客户端登陆,否则修改后的配置看不到效果。
2.1.3.编辑配置文件
[root@ftp-server ~]# vi /etc/vsftpd/vsftpd.conf
anon_umask=022 #添加匿名用户上传下载目录权限掩码
anon_upload_enable=YES #取消注释
anon_mkdir_write_enable=YES #取消注释
anon_other_write_enable=YES #添加
2.1.4.重启服务
[root@ftp-server ~]# systemctl restart vsftpd
使用FileZilla等客户端连接
2.2.vsftp配置本地用户登录(主动模式)
2.2.1.创建测试用户 zhangsan、lisi,密码都设置为 “123456”
[root@ftp-server ~]# useradd zhangsan
[root@ftp-server ~]# useradd lisi
[root@ftp-server ~]# echo '123456' | passwd --stdin zhangsan //设置密码
Changing password for user zhangsan.
passwd: all authentication tokens updated successfully.
[root@ftp-server ~]# echo '123456' | passwd --stdin lisi
Changing password for user lisi.
passwd: all authentication tokens updated successfully.
2.2.2.配置本地用户ftp配置文件
[root@ftp-server ~]# mkdir -p /data/ftp/{zhangsan,lisi}
[root@ftp-server ~]# chmod 750 /data/ftp/zhangsan /data/ftp/lisi
[root@ftp-server ~]# chown zhangsan /data/ftp/zhangsan
[root@ftp-server ~]# chown lisi /data/ftp/lisi
[root@ftp-server ~]# touch /etc/vsftpd/chroot_list
[root@ftp-server ~]# vim /etc/vsftpd/vsftpd.conf ---添加注释并修改
anonymous_enable=NO //将允许匿名登录关闭
#anon_umask=022 //注释掉匿名用户所上传文件的权限掩码
#anon_upload_enable=YES //注释掉允许匿名用户上传文件
#anon_mkdir_write_enable=YES //注释掉允许匿名用户创建目录
#anon_other_write_enable=YES //注释掉是否允许匿名用户有其他写入权(改名,删除,覆盖)
chroot_local_user=YES
chroot_list_enable=YES //启用限制登陆用户在主目录里面
#(default follows)
chroot_list_file=/etc/vsftpd/chroot_list //文件不存在,touch /etc/vsftpd/chroot_list
#是否禁锢在主目录,在文件列表中的用户表示不禁锢,可以访问主目录之外的目录。
allow_writeable_chroot=YES //允许限制的用户对目录有写权限
local_root=/data/ftp //设置本地用户的FTP根目录
local_max_rate=0 //限制最大传输速率(字节/秒)0为无限制
2.2.3.重启vsftpd
[root@ftp-server ~]# vim /etc/vsftpd/chroot_list
zhangsan //是否禁锢在主目录,在文件列表中的用户表示不禁锢,可以访问主目录之外的目录。
[root@ftp-server ~]# systemctl restart vsftpd
客户端操作:使用FileZilla等客户端连接
zhangsan用户可以返回到上一级/data/目录,没有限制
2.2.4.服务器端查看
[root@ftp-server ~]# cd /data/ftp/zhangsan/
[root@ftp-server zhangsan]# ls
2.3.vsftp虚拟用户配置(被动模式)
2.3.1.环境准备
服务器IP:192.168.221.136
关闭防火墙,SeLinux
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
[root@localhost ~]# setenforce 0
安装vsftpd以及相关组件
[root@localhost ~]# yum -y install vsftpd
[root@localhost ~]# yum -y install libdb libdb-utils
2.3.2.建立虚拟用户口令库文件
格式:
用户名
密码
[root@localhost ~]# vim /etc/vsftpd/vusers.list
tom
tom123
jack
jack123
//虚拟用户的所有账号密码
2.3.3.生成vsftpd认证文件(并赋权)
生成vsftpd认证文件:/etc/vsftpd/vsftpd_login.db
方法一:(直接运行命令)
[root@localhost ~]# db_load -T -t hash -f /etc/vsftpd/vusers.list /etc/vsftpd/vsftpd_login.db
方法二:(生成脚本文件,授执行权)
[root@localhost ~]# vim /etc/vsftpd/adduser.sh
db_load -T -t hash -f /etc/vsftpd/vusers.list /etc/vsftpd/vsftpd_login.db
[root@localhost ~]# chmod +x /etc/vsftpd/adduser.sh
[root@localhost ~]# /etc/vsftpd/adduser.sh
为认证用户文件赋权(这个文件的权限必须是600)
[root@localhost ~]# chmod 600 /etc/vsftpd/vsftpd_login.db
注意:生成认证文件之后,新加或删除用户以后重新运行本命令
2.3.4.虚拟用户所需配置PAM配置文件
[root@localhost ~]# mv /etc/pam.d/vsftpd{,.bak} //备份
[root@localhost ~]# cat >/etc/pam.d/vsftpd<<EOF
#%PAM-1.0
auth required pam_userdb.so db=/etc/vsftpd/vsftpd_login
account required pam_userdb.so db=/etc/vsftpd/vsftpd_login
EOF
2.3.5.建立虚拟用户访问目录,设置权限
[root@localhost ~]# mkdir -p /data/ftp/
[root@localhost ~]# useradd -d /data/ftp -s /sbin/nologin vuser
//定义vsftpd虚拟用户vuser,宿主目录/data/ftp
[root@localhost ~]# chown -R vuser:vuser /data/ftp/
[root@localhost ~]# ls -l /data/
drwx------ 2 vuser vuser 62 12月 1 21:00 ftp
2.3.6.创建虚拟用户个人账号目录,设置权限
[root@localhost ~]# mkdir -p /data/ftp/{tom,jack}
[root@localhost ~]# chown -R vuser:vuser /data/ftp/tom /data/ftp/jack
2.3.7.编辑vsftpd配置文件
[root@localhost ~]# cp /etc/vsftpd/vsftpd.conf{,.bak}
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
local_enable=YES
listen=YES //standalone模式,独立服务
listen_ipv6=NO
xferlog_enable=YES //启用日志
xferlog_file=/var/log/xferlog
xferlog_std_format=YES
guest_enable=YES //启用虚拟用户
guest_username=vuser //定义虚拟用户名
allow_writeable_chroot=YES
chroot_local_user=YES //禁锢在宿主目录则使用
user_config_dir=/etc/vsftpd/vsftpd_user_conf //定义每个用户的配置文件夹
pasv_enable=YES //被动模式
pasv_min_port=30000
pasv_max_port=30999
2.3.8.不同虚拟用户,不同权限
创建虚拟用户配置文件夹:/etc/vsftpd/vsftpd_user_conf
[root@localhost ~]# mkdir /etc/vsftpd/vsftpd_user_conf
建立用户tom单独配置文件,文件名就是用户名,与vusers.list中的用户名相同
[root@localhost ~]# vim /etc/vsftpd/vsftpd_user_conf/tom
local_root=/data/ftp/tom
chroot_local_user=YES
write_enable=YES
virtual_use_local_privs=YES
建立用户jack单独配置文件
[root@localhost ~]# vim /etc/vsftpd/vsftpd_user_conf/jack
local_root=/data/ftp/jack
chroot_local_user=YES
write_enable=YES
virtual_use_local_privs=YES
参数说明:
参数 | 解释 |
---|---|
local_root=/data/ftp/tom | 这里的虚拟用户目录可以根据实际情况修改,/data/ftp/tom目录提前建立,赋权vuser用户可以写入 |
chroot_local_user=YES | 禁锢在宿主目录则使用 |
write_enable=YES | 可以对虚拟用户用写入 |
virtual_use_local_privs=YES | 虚拟用户具有写权限(上传、下载、删除、重命名) |
如果只具用下载权限,则只保留local_root=/data/ftp/tom
2.3.9.重启vsftpd服务
[root@localhost ~]# systemctl restart vsftpd
客户端操作:使用FileZilla等客户端连接
2.4.虚拟用户其他配置
可以为各用户分别配置,修改/etc/vsftpd/vsftpd_user_conf/jack
,添加如下内容即可
max_clients=0
设置vsftpd允许的最大连接数,默认值为0,表示不受限制。若设置为100时,则同时允许有100个连接,超出的将被拒绝。只有在standalone模式运行才有效。
max_per_ip=0
设置每个IP允许与FTP服务器同时建立连接的数目。默认值为0,表示不受限制。只有在standalone模式运行才有效。
local_max_rate设置项 用于设置本地用户的最大传输速率,单位为B/s,值为0时表示不限制。
例如local_max_rate=500000表示FTP服务器的本地用户最大传输速率设置为500KB/s.
最终完整配置vsftpd.conf
如下所示
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_file=/var/log/xferlog
xferlog_std_format=YES
listen=YES
listen_ipv6=NO
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
guest_enable=YES
guest_username=vuser
allow_writeable_chroot=YES
chroot_local_user=YES
user_config_dir=/etc/vsftpd/vsftpd_user_conf
pasv_enable=YES
pasv_min_port=30000
pasv_max_port=30999
3.自签名SSL证书配置
wireshark抓包工具可以看到vsftpd的用户、密码等信息,为了保证安全性,使用SSL加密
生成自签名证书
[root@localhost ~]# DOMAIN=qf //这里域名可以自定
[root@localhost ~]# openssl req -new -x509 -nodes -out /etc/vsftpd/vsftpd.pem -keyout /etc/vsftpd/vsftpd.pem -days 3650 -subj "/C=CN/ST=guangdong/L=shenzhen/O=${DOMAIN}/OU=${DOMAIN}.com/CN=${DOMAIN}.com/emailAddress=admin@${DOMAIN}.com" >& /dev/null
启用自签名证书加密
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
ssl_enable=YES
ssl_tlsv1=YES
ssl_sslv3=YES
force_local_logins_ssl=yes
force_local_data_ssl=yes
rsa_cert_file=/etc/vsftpd/vsftpd.pem