FTP(File Transfer Protocol:文件传输协议)作用Internet 上用来传送文件的协议
FTP Server(File Transfer Protocol Server)是在互联网/局域网上提供文件存储和访问服务的计算机,它们依照FTP协议提供服务。采用C/S架构模式。
windows:Serv-U FTP Server,filezilla_server
Linux:VSFTP是一个基于GPL发布的类Unix系统上使用的FTP服务器软件,它的全称是Very Secure FTP 从此名称可以看出来,编制者的初衷是代码的安全。
21 :用于建立控制连接,并传输指令
20 :用于建立数据连接,并传输文件数据
ftp会话包含了两个通道,控制通道和数据通道。根据ftp服务器在建立数据连接过程中的主、被动关系,ftp数据连接分为主动模式和被动模式。
注意:这里的主动和被动,是相对于的FTP server 端来判断的,如果server 去连接client 开放的端口,说明是主动的,如果client去连接server开放的端口,则是被动的。
服务器主动连接客户端传输数据
服务器等待客户端的连接传输数据
# 服务端 安装 vsftpd
yum install -y vsftpd
/etc/vsftpd/vsftpd.conf |
vsftpd 的主配置文件 |
/etc/vsftpd/ftpusers |
黑名单文件,用于指定哪些用户不能访问FTP 服务器。此文件中列出的用户将禁止登陆vsftpd服务器。 |
/etc/vsftpd/user_list |
此文件中包含的用户可能被禁止登录,也可能被允许登录。具体取决于主配置文件vsftpd.conf中的设置。当存在userlist_enable=YES的配置项时,user_list列表文件方可生效;若指定userlist_deny=YES,则仅禁止此列表中的用户登录(黑名单),若指定userlist_deny=NO,则仅允许列表中的用户登录。 |
/etc/vsftpd/vsftpd_conf_migrate.sh |
是vsftpd 操作的一些变量和设置脚本 |
/var/ftp/ |
默认情况下匿名用户的根目录 |
# 启动 vsftpd
systemctl start vsftpd
# 设置开机自启动
systemctl enable vsftpd
# 查看 vsftpd 状态
systemctl status vsftpd
# 查看 vsftpd 端口
netstat -antup vsftpd | grep vsftpd
# 查看 vsftpd 进程
ps -ef | grep vsftpd
最简单的ftp客户端工具莫过于ftp命令程序了,通过ftp命令程序可以连接到ftp服务器进行交互式的上传、下载通信。
除此之外还有大量的图形化客户端工具,如cuteftp、flashftp、filezilla等
# 客户端 安装 ftp
yum install -y ftp
listen_address=ftp服务器的地址 # 只在一个接口监听服务
listen_port=2121 # 监听端口改为2121
pasv_min_port=24500 # 指定被动模式的下限端口
pasv_max_port=24600 # 指定被动模式的上限端口
max_clients=20 # 限制并发客户端最多20个
max_per_ip=2 # 限制每个ip地址的连接数最多2个
FTP服务器默认情况下允许匿名用户登陆,只允许匿名用户下载文件,不允许上传和删除文件
# 使用ftp命令连接服务器
ftp 192.168.137.253
命令 |
含义 |
open [ftpservername] |
和指定的远程Linux FTP服务器连接 |
user [username] |
|
pwd |
显示远程Linux FTP服务器上的当前路径。 |
ls |
列出远程Linux FTP服务器上当前路径下的目录和文件。 |
dir |
列出远程Linux FTP服务器上当前路径下的目录和文件(同上)。 |
mkdir [foldname] |
在远程Linux FTP服务器上当前路径下建立指定目录。 |
rmdir [foldname] |
删除远程Linux FTP服务器上当前路径下的指定目录。 |
cd [foldname] |
更改远程Linux FTP服务器上的工作目录。 |
delete [filename] |
删除远程Linux FTP服务器上指定的文件。 |
rename [filename] [newfilename] |
重命名远程Linux FTP服务器上指定的文件。 |
close |
从远程Linux FTP服务器断开但保留FTP命令参数提示。 |
disconnect |
从远程Linux FTP服务器断开但保留FTP命令参数提示(同上)。 |
bye |
结束和远程Linux FTP服务器的连接。 |
quit |
结束和远程Linux FTP服务器的连接(同上)。 |
! |
直接从远程Linux FTP服务器进入到本地shell中。 |
exit |
(接上步)从本地shell环境中返回到远程Linux FTP服务器环境下。 |
!ls |
列出本地机器上当前路径下的目录和文件。 |
lcd [foldname] |
更改本地机器的工作目录。 |
? |
显示ftp命令说明。 |
help |
显示ftp命令说明(同上)。 |
# 在ftp中查看当前目录
ftp>pwd # 输出-> 257 "/"
# 查看当前目录下的文件
ftp>ls
# 下载文件
get test.txt
# 退回Shell查看 下载文件
ls
需求:公司技术部准备搭建一台功能简单的FTP 服务器,允许所有员工上传和下载文件,并允许创建用户自己的目录。
分析:允许所有员工上传和下载文件,需要设置成允许匿名用户登录,并且需要允许匿名用户上传功能。
# 允许匿名用户访问
anonymous_enable=YES
# 允许匿名用户上传文件
anon_upload_enable=YES
# 允许匿名用户创建目录
anon_mkdir_write_enable=YES
# 允许匿名用户写文件和删除文件
anon_other_write_enable=YES
# 给ftp根目录设置权限
chown -R ftp:ftp /var/ftp/pub
# 重启 vsftpd 服务
systemctl restart vsftpd
# 登陆ftp服务器
ftp 192.168.137.253
# 测试目录创建
ftp>pwd
ftp>mkdir test
ftp>cd pub
ftp>mkdir test
# 退出ftp并创建测试文件
ftp>!
echo "Hello Linux" > test.txt
# 回到ftp
exit
ftp>cd pub
# 上传测试文件
ftp>put /root/test.txt test.txt
# 更改文件名字
ftp>rename test.txt test_ftp.txt
# 删除文件
ftp>delete test
可以在Windows管理器中进行 文件夹的创建、修改、删除以及文件上传
需求:公司内部现在有一台FTP 和WEB 服务器,FTP 的功能主要用于维护公司的网站内容,包括上传文件、创建目录、更新网页等等。公司现有两个部门负责维护任务,他们分别适用team1 和team2帐号进行管理。先要求仅允许team1 和team2 帐号登录FTP 服务器,并将这两个帐号的根目录限制为/var/www/html,不能进入该目录以外的任何目录。ftp 和web服务器相结合。
只允许:team1和team2两用户可以上传。 vsftp禁止匿名。
分析:将FTP 和WEB 服务器做在一起是企业经常采用的方法,这样方便实现对网站的维护,为了增强安全性:
Vsftpd可以直接使用linux主机的系统用户作为ftp账号,提供基于用户名/密码的登录验证。用户使用系统用户账号登录ftp服务器后,将默认位于自己的家目录中,且对家目录拥有读写权限。
# 恢复配置文件
cp /etc/vsftpd/vsftpd.conf.bak /etc/vsftpd/vsftpd.conf
# 修改配置文件
vim /etc/vsftpd/vsftpd.conf
# Allow anonymous FTP? (Beware - allowed by default if you comment this out).
# 禁止匿名用户登录
anonymous_enable=NO
#
# Uncomment this to allow local users to log in.
# When SELinux is enforcing check for SE bool ftp_home_dir
# 允许本地用户登录
local_enable=YES
# 启用 chroot 锁定本地用户功能
chroot_local_user=YES
# 启用 chroot 锁定本地用户列表功能
chroot_list_enable=YES
# 本地用户列表保存文件目录
chroot_list_file=/etc/vsftpd/chroot_list
# 锁定本地用户ftp根目录,如果不是设置,默认用户ftp根目录为用户家目录
local_root=/var/www/html
# 锁定用户拥有写权限
allow_writeable_chroot=YES
# ftp 用户限制
userlist_enable=YES
userlist_deny=NO
mkdir -p /var/www/html/team{1..2}/ftp
tree /var/www/html
useradd team1
useradd team2
echo "team1:123456" | chpasswd
echo "team2:123456" | chpasswd
权限设定除了在配置文件设定用户写权限,还必须要让用户对自己的目录拥有读写权限
# team1 用户对 team1/ftp 有rwx权限
setfacl -Rm u:team1:rwx /var/www/html/team1/ftp
# team2 用户对 team2/ftp 有rwx权限
setfacl -Rm u:team2:rwx /var/www/html/team2/ftp
# team1用户 不可以访问team2目录
setfacl -Rm u:team1:- /var/www/html/team2
# team2用户 不可以访问team1目录
setfacl -Rm u:team2:- /var/www/html/team1
# ftp 用户限制
echo -e "team1\nteam2" >> /etc/vsftpd/user_list
# 添加chroot_list文件
echo -e "team1\nteam2" > /etc/vsftpd/chroot_list
cat /etc/vsftpd/chroot_list
# 重启服务
systemctl restart vsftpd
在vsftpd服务器中,使用虚拟用户的主要好处在于,可以将ftp登录账户与系统登录账号分开,用户名、密码都不相同,从而进一步增强ftp服务器的安全性。
需求:公司为了宣传最新的产品信息,计划搭建FTP 服务器,为客户提供相关文档的下载:
分析:根据企业的需求,对于不同用户进行不同的权限限制,FTP 服务器需要实现用户的审核。需考虑到服务器的安全性,使用虚拟帐号验证机制,并对不同虚拟帐号设置不同的权限。为了保证服务器的性能,还需要根据用户的等级,限制客户端的连接数及下载速度。
建立用户文本文件,添加两个虚拟帐号:
# 一行用户一行密码
vim /etc/vsftpd/vsftpd_virtualuser.txt
生成虚拟用户数据库文件:保存虚拟帐号和密码的文本文件无法被系统帐号直接调用。我们需要使用db_load 命令生成db数据库文件。
db_load 命令
-T:允许应用程序能够将文本文件转译载入进数据库
-t:hash使用hash码加密
-f:指定包含用户名和密码文本文件。此文件格式:奇数行用户名、偶数行密码
# 查看 db_load 命令的位置,通过rpm查看在个安装包中
rpm -qf `which db_load`
# 安装 db_load 所在的软件包
yum install -y libdb-utils-5.3.21-25.el7.x86_64
# 将虚拟用户文本文件 转换为 数据库文件
db_load -T -t hash -f /etc/vsftpd/vsftpd_virtualuser.txt /etc/vsftpd/vsftpd_virtualuser.db
修改数据库文件访问权限:数据库文件中保存着虚拟帐号的密码信息,为了防止非法用户盗取,我们可以修改该文件的访问权限。生成的认证文件的权限应设置为只对root 用户可读可写。
chmod 600 vsftpd_virtualuser.db
添加虚拟用户的映射账号:Vsftpd服务器对虚拟用户的控制采用了映射的控制方式,将所有的虚拟用户对应到同一个系统用户,该系统用户家目录作为有虚拟用户登录后共用的ftp根目录。因此还需要添加一个对应的系统用户账号(此账号无须设置密码登录shell)
# 因为匿名用户默认家目录为/var/ftp,把virtual用户家目录设为/var/ftp/pub,
# 这样匿名用户和虚拟用户就可以访问相同的ftp根目录
useradd -d /var/ftp/pub -s /sbin/nologin virtual_user
# 设置虚拟用户对 /var/ftp/pub 的权限
setfacl -Rm u:virtual_user:rwx /var/ftp/pub
在vsftpd服务器中,用户认证是通过PAM(pluggable authentication module,可插拔认证模块)机制来实现的, Vsftpd服务默认的PAM认证文件位于/etc/pam.d/vsftpd,该文件适用于以Linux的系统用户账号进行认证。若要读取虚拟用户的账号数据文件,则需要创建新的PAM认证文件。
# 为虚拟用户建立PAM认证文件
vim /etc/pam.d/vsftpd.vu
auth required /lib64/security/pam_userdb.so
db=/etc/vsftpd/vsftpd_virtualuser
account required /lib64/security/pam_userdb.so
db=/etc/vsftpd/vsftpd_virtualuser
cp /etc/vsftpd/vsftpd.conf.bak /etc/vsftpd/vsftpd.conf
vim /etc/vsftpd/vsftpd.conf
# 开启匿名用户访问,默认匿名用户只有下载权限
anonymous_enable=YES
#开启本地用户映射
local_enable=YES
# 启用上传写入支持
write_enable=YES
# 指定上传权限掩码, 666-022=644
anon_umask=022
# 允许来宾访问
guest_enable=YES
# 允许对ftp根目录有写权限
allow_writeable_chroot=YES
# 指定映射的系统用户名称
guest_username=virtual_user
# 指定新的PAM认证文件
pam_service_name=vsftpd.vu
# 指定虚拟用户权限文件目录
user_config_dir=/etc/vsftpd/vusers_dir
# 指定被动模式的下限端口
pasv_min_port=24500
# 指定被动模式的上限端口
pasv_max_port=24600
# 限制并发客户端最多20个
max_clients=20
# 限制每个ip地址的连接数最多2个
max_per_ip=2
注意事项:
500 OOPS: vsftpd: refusing to run with writable root inside chroot()
。要修复这个错误,可以用命令chmod a-w /home/user去除用户主目录的写权限,或者你可以在vsftpd的配置文件中增加下列项:allow_writeable_chroot=YES在/etc/vsftpd/vusers_dir目录下为不同的用户创建不同的权限文件
mkdir /etc/vsftpd/vusers_dir
# 创建admin的配置文件
vim /etc/vsftpd/vusers_dir/admin
# 允许用户上传文件
anon_upload_enable=YES
# 允许用户创建目录
anon_mkdir_write_enable=YES
# 允许用户删除文件权限
anon_other_write_enable=YES
# 创建vip的配置文件
vim /etc/vsftpd/vusers_dir/vip
# 允许用户上传文件
anon_upload_enable=YES
# 允许用户创建目录
anon_mkdir_write_enable=YES
# 重启 vsftpd 服务
systemctl restart vsftpd