一、ftp工作原理简介
ftp是工作于应用层的协议,21/tcp端口,ftp是C/S的模型,数据分为两种连接,分别是命令连接数据连接,命令连接是文件管理类命令,始终在线的连接;数据连接是数据传输,是按需创建及关闭的连接。数据在传输格式根据文件类型进行选择传输格式,有文件传输、二进制传输。
ftp有两连接模式主动和被动模式,在主动模式中由服务器创建连接,客户端响应连接的方式,服务器选择21/tcp端口,客户端在响应连接选择一个随机端口的与服务器进行通信,在传输文件时服务器将使用20/tcp端口与客户端的随机端口加1进行数据传输;在被动模式中客户端选择一个随机端口请求服务器的21/tcp端口,服务器用21号端口响应客户端的请求,当文件传输时客户端使用在随机端口上加1的端口请求服务器的文件数据,服务器选择一个随机端口响应客户端的文件传输请求。
二、ftp软件种类
ftp的服务器和客户端的软件种类有很多软件可以实现的
服务器端软件:wu-ftpd、proftpd、pureftp、vsftpd、ServU
客户端软件:ftp、lftp、lftpget、wget、curl、filezilla、gftp
三、ftp响应码
ftp和Web服务软件一样有请求响应码,可以根据响应码来确认故障;
1xx:信息
2xx:成功类的状态码
3xx:提示需进一步提供补充信息的状态码
4xx:客户端错误
5xx:服务端错误
[[email protected] ~]# ftp172.16.9.28 Connected to172.16.9.28 (172.16.9.28). 220 (vsFTPd 2.2.2) #:状态码 Name (172.16.9.28:root): ftp #匿名用户被映射成为ftp 331 Please specifythe password. Password: 230 Loginsuccessful. Remote system typeis UNIX. Using binary mode totransfer files. ftp> ls 227 Entering Passive Mode (172,16,9,28,254,240). #被动模式,172.16.9.28:(254+150+1)*240) IP:端口 150 Here comes thedirectory listing. drwxr-xr-x 2 0 0 4096 Aug 04 2014 pub 226 Directory sendOK.
四、ftp实现软件vsftpd
ftp可以使用登录的用户认证类型有虚拟用户、系统用户、匿名用户。
在CentOS 6.6中安装vsftpd还是很方便的,直接yum install vsftpd就可以了。安装完后生成的文件如下:
用户认证配置文件:/etc/pam.d/vsftpd
服务脚本:/etc/rc.d/init.d/vsftpd
日志滚动程序:/etc/logrotate.d/vsftpd
配置文件:/etc/vsftpd
主配置文件:/etc/vsftpd/vsftpd.conf
匿名用户(映射为ftp用户)共享资源位置:/var/ftp
系统用户通过ftp访问的资源的位置:用户自己的家目录
虚拟用户通过ftp访问产资源的位置:给虚拟用户指定的映射在为成系统用户的家目录
五、vsftpd的配置说明
(1)匿名用户的配置
anonymous_enable=YES #启用匿名用户
anon_upload_enable=YES #启用匿名用户上传功能
anon_mkdir_write_enable=YES #启用匿名用户创建目录功能
anon_other_write_enable=YES #启用匿名用户删除文件功能
注意:上传的功能取决于系统的权限和是否有上传的权限
(2)系统用户的配置
local_enable=YES #开启系统用户
write_enable=YES #开启写的权限
local_umask=022 #系统用户上传文件完文件的权限
禁锢所有的ftp本地用户其家目录中
chroot_local_user=YES
禁锢指定的ftp本地用户其家目录中
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
(3)虚拟用户
所有的虚拟用户会被统一映射为一个指定的系统账号,访问的共享位置即为系统账号的家目录;各虚拟用户可被赋予不同的访问权限,通过匿名用户的权限控制参数进行指定;虚拟用户账号可存储在文件和关系型数据库表中。
(4)其它配置信息说明
开启目录消息,就是切换此目录时,会显示此目录中以.message文件的内容,此.messages是隐藏文件
dirmessage_enable=YES
日志
xferlog_enable=YES #开启上传,下载日志
xferlog_file=/var/log/xferlog
xferlog_std_format=YES
改变上传文件的属主
chown_uploads=YES
chown_username=whoever
会话:
idle_session_timeout=600 #空闲会话超时时长
data_connection_timeout=120 #数据连接超时时长
vsftp使用pma完成使用认证,其用到的pam配置文件
pam_service_name=vsftpd
是否启用控制用户登录的列表文件
userlist_enable=YES
userlist_deny=YES|NO
默认的文件为/etc/vsftpd/user_list
连接限制:
max_clients:最大并发连接数;
max_per_ip:每个IP可同时发起的并发请求数;
传输速率:
anon_max_rate:匿名用户的最大传输速率,单位是“字节/秒”
local_max_rate:本地用户的最大传输速率,单位是“字节/秒”
六、实现vsftp+pam+mysql
通过pam_mysql模块实现把用户名和密码存储在MySQL数据库,当客户端登录进行认证时就在MySQL数据库进行查找,以实现用户的管理。
1、安装所需要程序
1)安装mysql和pam_mysql
# yum -y install vsftpd mysql-servermysql-devel pam_mysql
注意:pam_mysql由epel源提供。
2、准备数据库及相关表
1)准备数据库和表
首先请确保mysql服务已经正常启动,而后,按需要建立存储虚拟用户的数据库即可,这里将其创建为vsftp数据库
MariaDB [(none)]> CREATE DATABASE vsftp MariaDB [vsftp]> grant select on vsftp.*to [email protected]‘172.16.%.%‘ identified by ‘vsftpd‘; Query OK, 0 rows affected (0.04 sec) MariaDB [vsftp]> flush privileges; Query OK, 0 rows affected (0.00 sec) MariaDB [vsftp]> CREATE TABLE users (id INT UNSIGNED NOT NULL AUTO_INCREMENTPRIMARY KEY, name VARCHAR(50) BINARY NOT NULL, password CHAR(48)BINARY NOTNULL);
2)添加测试的虚拟账号
根据需要添加所所需要的用户,需要说明的是,这里将其密码为了安全起见应该使用PASSWORD函数加密后存储;
MariaDB [vsftp]> INSERT INTO users(name,password) VALUES (‘tom‘,password(‘ftp‘)),(‘jerry‘,password(‘vsftp‘)); Query OK, 2 rows affected (0.00 sec) Records: 2 Duplicates: 0 Warnings: 0 MariaDB [vsftp]> select * from users; +----+-------+-------------------------------------------+ | id | name | password | +----+-------+-------------------------------------------+ | 1| tom |*89DED2CC215FEBF4D5077792E8CBF7B3A3CE6A53 | | 2| jerry | *EDE7E32F5C826747A362F47049DF433214ADBFE6 | +----+-------+-------------------------------------------+
3、配置vsftpd
1)建立pam认证所需文件
#vi /etc/pam.d/vsftpd.mysql
添加如下两行
auth required pam_mysql.so user=vsftppasswd=vsftpd host=172.16.9.20 db=vsftp table=users usercolumn=namepasswdcolumn=password crypt=2 account required pam_mysql.so user=vsftppasswd=vsftpd host=172.16.9.20 db=vsftp table=users usercolumn=namepasswdcolumn=password crypt=2
注意:由于mysql的安装方式不同,pam_mysql.so基本unix sock连接mysql服务器时可能会出问题,此时建议授权一个远程连接的mysql并访问vsftpd数据库的用户;
2)修改vsftpd的配置文件,使其适应mysql认证
建立虚拟用户映射的系统用户及对应的目录
[[email protected] ~]# mkdir /ftpserver [[email protected] ~]# useradd -s /sbin/nologin -d /ftpserver/pub vuser
请确保/etc/vsftpd.conf中已经启用了以下选项
anonymous_enable=YES local_enable=YES write_enable=YES anon_upload_enable=NO anon_mkdir_write_enable=NO chroot_local_user=YES
而后添加以下选项
guest_enable=YES guest_username=vuser
并确保pam_service_name选项的值如下所示
pam_service_name=vsftpd.mysql
3)重启vsftpd服务
4、配置虚拟用户具有不同的访问权限
vsftpd可以在配置文件目录中为每个用户提供单独的配置文件以定义其ftp服务访问权限,每个虚拟用户的配置文件名同虚拟用户的用户名。配置文件目录可以是任意未使用目录,只需要在vsftpd.conf指定其路径及名称即可。
1)配置vsftpd为虚拟用户使用配置文件目录
#vim vsftpd.conf
添加如下选项
user_config_dir=/etc/vsftpd/vuser_config
2)创建所需要目录,并为虚拟用户提供配置文件
mkdir /etc/vsftpd/vuser_config/ cd /etc/vsftpd/vuser_config/ touch tom jerry
3)配置虚拟用户的访问权限
虚拟用户对vsftpd服务的访问权限是通过匿名用户的的相关指令进行的,比如,如果需要让tom用户具有上传文件的权限,可以修改/etc/vsftpd/vuser_config/tom文件,在里面添加如下选项即可。
anon_upload_enable={YES|NO} anon_mkdir_write_enable={YES|NO} anon_other_write_enable=(YES|NO}