FTP概述
FTP是典型的C/S结构的应用层协议,需要服务器端软件和客户端软件两个部分共同实现文件传输功能。
FTP有两个端口20/tcp和21/ctp
20端口用于建立数据连接,并传输文件数据。
21端口用于建立控制连接,并传输FTP控制命令。
FTP数据连接又分为主动模式,和被动模式
主动模式:服务器主动发起连接。首先由客户端向服务端的21端口建立FTP控制连接,当需要传输数据时,客户端以PORT命令告诉服务器“我打开了某口,你过来连接我”,于是服务器从20端口像客户端该端口发送请求并建立数据连接 。
被动模式:服务器被动等待数据连接。首先由客户端向服务器端的21端口建立FTP控制连接 ,当需要传输数据时,服务器以PASV命令告诉客户端“我打开了某端口,你过来连接我”于是客户端向服务器的该端口(非20)发送请求并建立数据连接。
被动模式的端口随机性,主要是由对方防火墙引起,不知道对方开放了那些端口。
数据传输模式(自动协商):
二进制(ASCII):一般用只用于纯文本文件的传输
文本(Binary):这种模式更适合程序、图片等为纯文本格式的文件
vsftpd文件配置文件
/etc/vsftpd: 配置文件目录
/etc/init.d/vsftpd: 服务脚本
/usr/sbin/vsftpd: 主程序
/var/ftp:ftp服务根目录(不允许其他用户拥有写权限,如果希望用户上传可以建子目录)
ftpusers:黑名单,此列表列出的用户,拒绝登录FTP
user_list:此文件中用户可以被禁止,也可以被允许取决于主配置文件的设置
ftp: 系统用户
匿名用户 --> 系统用户: anonymous_enable
系统用户: local_enable
虚拟用户 --> 系统用户
/var/ftp: ftp用户的家目录
匿名用户访问目录
注意:测试前需要关闭防火墙和SELinux
iptables -F
setenforce 0
vsftpd.conf配置文件解释
匿名用户
anonymous_enable=YES //是否允许匿名访问
anon_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 //限制匿名用户的最大传输速率(0为无限制),单位为字节/秒
本地用户
local_enable=YES //是否启用系统用户
local_umask=022 //设置本地用户所上传权限的掩码值
local_root=/var/ftp //设置本地用户根目录(不填为家目录)
deny_email_enable=YES //禁锢用户在家目录,需列表
banned_email_file=/etc/vsftpd/chroot_list //禁锢那些用户在家目录的列表(文件不存在需要手动创建)
chroot_local_user=YES //将所有用户禁锢在家目录
local_max_rate=0 //限制本地用户的最大传输速率(0为无限制),单位为字节/秒
全局配置
listen=YES //配置为独立守护进程
守护进程:
独立守护进程:
用于访问量大,在线时间长的应用
瞬时守护进程:
永远访问量小,在线时间短的应用
listen_address=0.0.0.0 //设置监听FTP的IP地址
listen_port=21 //设置监听FTP端口号
write_enable=YES //启用任何形式的写入权限(如上传、删除文件等)都需要开启此项
download_enable=YES //是否允许下载文件
dirmessage_enable=YES //是否显示欢迎信息(需要在目录下面添加一个.message的文件,在里面输入欢迎信息)
xferlog_enable=YES //是否打开传输日志
xferlog_file=/var/log/vsftpd.log //传输日志文件路径
xferlog_std_format=YES //启用标准的xferlog日志格式,弱禁用此项,将使用xferlog自己的日志格式
connect_from_port_20=YES //允许服务器主动模式(从20端口建立数据连接)
pasv_max_port=24600 //设置被动模式的服务器最大端口号
pasv_min_port=24500 //设置被动模式服务器最小端口号
pam_service_name=vsftpd //设置用户认证的PAM文件位置(/etc/pam.d目录中对应的文件名)
userlist_enable=YES //启用userlist文件控制登陆
userlist_deny=NO //允许userlist列表中的用户登录,如果是Yes就是拒绝登陆
max_client=0 //最多允许多少客户端同时连接(0为无限制)
man_per_ip=0 //对于同一个Ip地址的客户端最多允许多少并发连接(0为无限制)
tcp_wrappers=YES //是否启用TCP_Wrappers主机访问控制
设置ftp加密传输
ssl_enable=YES //启用ssl
ssl_tlsv1=YES //启用tlsv1
ssl_sslv2=YES
ssl_sslv3=YES //启用sslv3
allow_anon_ssl=NO //匿名用户不启用加密
force_local_data_ssl=YES //强制本地用户使用ssl传输数据
force_local_logins_ssl=YES //强制本地用户使用ssl登录
rsa_cert_file=/etc/vsftpd/ssl/vsftpd_cert.pem //rsa格式的证书
rsa_private_key_file=/etc/vsftpd/ssl/vsftpd_key.pem //rsa格式的密钥文件
虚拟用户设置:
添加虚拟用户列表
[[email protected] vsftpd]# vim vusers.list zhangsan //奇数行为用户名,偶数行为密码 123456 lisi 123456
创建Berkeley DB 格式的数据库文件
[[email protected] vsftpd]# db_load -T -t hash -f vusers.list vusers.db [[email protected] vsftpd]# file vusers.db vusers.db: Berkeley DB (Hash, version 9, native byte-order)
设置文件权限,避免数据外泄
[[email protected] vsftpd]# chmod 600 /etc/vsftpd/vusers.* [[email protected] vsftpd]# ls -lh /etc/vsftpd/vusers.* -rw-------. 1 root root 12K 9月 15 20:16 /etc/vsftpd/vusers.db -rw-------. 1 root root 28 9月 15 20:15 /etc/vsftpd/vusers.list
添加虚拟帐号映射帐号、创建FTP根目录
[[email protected] vsftpd]# useradd -d /var/ftproot -s /sbin/nologin virtual [[email protected] vsftpd]# chmod 755 /var/ftproot/
为虚拟用户建立PAM认证
[[email protected] vsftpd]# vim /etc/pam.d/vsftpd.vu #%PAM-1.0 auth required pam_userdb.so db=/etc/vsftpd/vusers account required pam_userdb.so db=/etc/vsftpd/vusers
修改vsftpd配置,添加虚拟用户支持
local_enable=YES write_enable=YES anon_umask=022 pam_service_name=vsftpd.vu //指定PAM认证文件 guest_enable=YES //启用用户映射功能 guest_username=virtual //指定映射的系统用户名称
为不同的虚拟用户建立独立的配置文件,以便设置不同的权限
[[email protected] vsftpd]# vim /etc/vsftpd/vsftpd.conf user_config_dir=/etc/vsftpd/vusers_dir //表示将从/etc/vsftpd/vusers_dir目录查找用户的配置文件 [[email protected] vsftpd]# mkdir /etc/vsftpd/vusers_dir [[email protected] vsftpd]# cd /etc/vsftpd/vusers_dir/ [[email protected] vusers_dir]# vi zhangsan anon_upload_enable=YES anon_mkdir_write_enable=YES