1、定义:
File Transfer Protocol,即文件传输协议。用于 Linux 系统间文件的传输。
2、文件传输方式
(1)ASCII 码传输:网页文件
(2)BINARY(二进制)传输方式:可执行文件
3、FTP 服务器的两种工作模式
FTP 服务基于 C/S 架构
端口 TCP20 用于传输数据
端口 TCP21 用于建立连接。
主动模式(PORT)
客户端产生一个随机的大于1024的端口N,连接服务端的21端口,并告知自己用来传输数据的端口N+1,服务器知道客户机连接数据传输的端口后,用自己的20号端口来连接客户端的N+1端口来进行数据传输。
客户端 (C) 服务器端(S)
命令连接 随机端口 > 21端口
数据连接 随机端口 < 20端口
注:服务器端安全性较高 客户端连接可能会被服户端防火墙拦截数据传输失败
被动模式(PASV)
当客户端通知服务器它处于被动模式时才启用。
在被动方式FTP中,命令连接和数据连接都由客户端发起,这样就可以解决从服务器到客户端的数据端口的入方向连接被防火墙过滤掉的问题。
客户端产生一个随机的大于1024的端口N,与服务器的21端口进行连接,并告知自己用来传输数据的端口N+1,服务器通过已经建立的连接告知客户端自己的数据传输端口为大于 1024 的随机端口 M,客户端使自己的数据端口N+1连接服务器端的数据端口M,进行数据传输。
客户端(C) 服务器端(S)
命令连接 随机端口 > 21
数据连接 随机端口 > 随机端口
注:服务器端安全性较低,客户端连接不会出现问题,服务器端放行端口接口
PORT(主动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。当需要传送数据时,客户端在命令链路上用PORT命令告诉服务器:“我打开了XXXX端口,你过来连接我”。于是服务器从20端口向客户端的XXXX端口发送连接请求,建立一条数据链路来传送数据。
PASV(被动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。当需要传送数据时,服务器在命令链路上用PASV命令告诉客户端:“我打开了XXXX端口,你过来连接我”。于是客户端向服务器的XXXX端口发送连接请求,建立一条数据链路来传送数据。
4、FTP用户类型
匿名用户:ftp、anonymous,也可以理解为是公共账户
本地用户:账户名或密码信息都保存在/etc/password和/etc/shadow文件中
虚拟用户:是可以自己创建的,但必须挂靠一个Linux普通账户作为映射关系,利用这个用户的家目录作为落脚点,否则虚拟账户没法使用的
5、配置文件解析
安全文件配置
connect_timeout=60 #主动模式下超时时间
accept_timeout=60 #被动模式下超时时间
data_connection_timeout=300 #数据的连接超时时间
idle_session_timeout=300 #挂机超时时间
tcp_wrappers=YES #控制连接是否放行
ftpd_banner=xxx 和 banner_file=/path/file #欢迎信息
全局配置
listen_address=192.168.1.2 #设置监听的 IP 地址(本地IP)
listen_port=21 #设置监听 FTP 服务的端口号
write_enable=YES #是否启用写入权限
download_enable=YES #是否允许下载文件
max_clients=0 #限制并发客户端连接数
max_per_ip=0 #限制同一 IP 的并发连接数
匿名用户配置
anonymous_enable=YES #启用匿名访问
aon_umask=022 #匿名用户上传文件的权限掩码
anon_root=/var/ftp #匿名用户 FTP 的根目录
anon_upload_enable=YES #允许上传文件
anon_mkdir_write_enable=YES #允许创建目录
anon_other_write_enable=YES #允许其它写入权
anon_max_rate=0 #限制最大传输速率(字节/秒)
本地用户配置
local_enable=YES #启用匿名访问
local_umask=022 #本地用户上传文件的权限掩码
local_root=/var/ftp #设置本地用户的 FTP 根目录
chroot_local_user=YES #是否将用户禁锢在主(家)目录
local_max_rate=0 #限制最大传输速率(字节/秒)
6、简单的搭建FTP
① 配置 FTP 服务器
1、安装软件
yum install vsftpd -y
2、启动服务
service vfstpd start
② 配置 FTP 客户端
1、安装软件
yum install ftp -y
2、使用匿名账户访问 FTP 服务器
ftp 服务器 IP/主机名
匿名账户:账户名:ftp
密码:随便
③ 常用命令
help→帮助
!→外界命令输入
cd→切换工作路径
delete→删除文件
get→下载
put→上传
mkdir→创建目录
rmdir→删除目录
pwd→显示工作路径
ls→显示目录下的内容
quit、exit、bye →退出
7、匿名登录
1、使用匿名账户访问 FTP 服务器 (ftp、anonymous)
ftp 服务器 IP/主机名
匿名账户:账户名:ftp
密码:随便
匿名账户登录服务器的默认位置在服务器上的/var/ftp/
匿名账户的默认权限为仅能下载文件
客户端默认被动模式:ftp> passive 关掉被动模式
2、设置匿名账户上传文件、建立目录权限
(1)在服务器端
编辑 vsftpd 配置文件:vim /etc/vsftpd/vsftpd.conf
允许匿名账户上传文件,anon_upload_enable=YES
允许匿名账户创建目录,anon_mkdir_enable=YES
修改/var/ftp/pub 目录的属主与属组:chown ftp.ftp /var/ftp/pub
或(在pub目录下创建一个有rwxr-xrwx权限的目录,文件上传到该目录)
重启服务:service vsftpd start
(2)在客户端测试
切换工作目录:ftp> cd pub
3、设置匿名账户删除文件、目录权限
(1)在服务器端
编辑配置文件:vim /etc/vsftpd/vsftpd.conf
添加:anon_other_write_enable=YES
重启服务:systemctl restart vsftpd
8、本地用户登录
(1)在服务器端
创建实体账户:useradd user1
设置登录密码:passwd user1
对本地账户实现 chroot
在服务器端:
编辑配置文件:vim /etc/vsftpd/vsftpd.conf
对本地账户进行 chroot
chroot_loacal_user=YES
使用 chroot_list 文件控制被 chroot 的账户
chroot_list_enable=YES
设定 chroot_list 文件所在位置
chroot_list_file=/etc/vsftpd/chroot_list
将不被 chroot 的本地用户写入/etc/vsftpd/chroot_list 文件中
注:如果改文件不存在,则创建该文件
(2)在客户端测试
ftp 服务器 IP/主机名
账户名:user1
账户密码:user1对应的密码
注:本地账户登录到服务器的默认位置为本地账户对应的家目录
本地账户的默认权限为可以下载、上传、删除文件,创建和删除目录
(3)禁止账户登录
1、通过/etc/vsftpd/user_list 文件和配置文件来控制用户登录
禁止点在输入用户名的时候
写入文件中的用户将不能在客户端中进行登录。
2、将不允许登录的用户写入至/etc/vsftpd/ftpusers 文件内即可
禁止点在输入密码的时候
(4)被动模式限制端口范围
写入配置文件/etc/vsftpd/vsftpd.conf
pasv_enable=YES
pasv_min_port=10221
pasv_max_port=10231
9、虚拟用户登录(映射)
配置服务器端
(a)创建虚拟账户文件
vim /root/f.txt (随便一个文件)
一行写用户名,一行写改用户名对应的密码
例:vim /root/f.txt
test 账户名
123 密码
(b)通过虚拟账户文件生成虚拟账户验证使用的数据库文件
db_load -T -t hash -f 虚拟账户文件虚拟账户数据文件
例:db_load -T -t hash -f /root/f.txt /etc/vsftpd/test.db
参数:
-T→通过文本文件生成数据库文件
-t→指定加密算法(hash 算法)
-f→指定账户文本文件
#为了安全chmod 600 /etc/vsftpd/test.db
(c)添加虚拟映射用户
useradd -d /var/ftproot -s /sbin/nologin virtual
chmod 755 /var/ftproot/
(d)生成虚拟账户验证文件
cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd.bak
修改验证文件
vim /etc/pam.d/vsftpd
去掉验证模块的路径,修改验证虚拟账户使用的数据库
例:auth required pam_userdb.so db=/etc/vsftpd/test
account required pam_userdb.so db=/etc/vsftpd/test
(e)修改主配置文件
编辑配置文件:vim /etc/vsftpd/vsftpd.conf
在配置文件末尾添加:
guest_enable=YES (允许来宾)
guest_username=virtual(映射的用户)
user_config_dir=/etc/vsftpd/conf(虚拟用户的权限存放目录)
(f)创建权限存放文件
mkdir -p /etc/vsftpd/conf
创建虚拟用户
touch user1 user2 user3
(g)常见权限: (写入user中)
anon_upload_enable=YES 允许上传
anon_mkdir_write_enable=YES 允许用户创建目录
anon_other_write_enable=YES 允许其它写入权限
(h)重启服务
service vsftpd restart
10、加密传输
安装机密算法程序 openssl
yum -y install openssl
yum -y install openssl-devel
创建证书
openssl req -new -x509 -nodes -out vsftpd.pem -keyout vsftpd.pem
拷贝到 /etc/ssl/certs
为了保密性,不能让别人随意查看,修改权限
chmod 400 vsftpd.pem
修改配置文件/etc/vsftpd/vsftpd.conf
ssl_enable=YES 开启加密认证
allow_anon_ssl=YES
force_local_data_ssl=YES
force_local_logins_ssl=YES
force_anon_data_ssl=YES
force_anon_logins_ssl=YES
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
rsa_cert_file=/etc/ssl/certs/vsftpd.pem