FTP是一个C/S架构的服务。用户通过一个支持FTP协议的客户机程序,连接到在远程主机上的FTP服务器程序。用户通过客户机程序向服务器程序发出命令,服务器程序执行用户所发出的命令,并将执行的结果返回到客户机。比如说,用户发出一条命令,要求服务器向用户传送某一个文件的一份拷贝,服务器会响应这条命令,将指定文件送至用户的 机器上。客户机程序代表用户接收到这个文件,将其存放在用户目录中。
常见的ftp工具:
Server程序:
Linux:wu-ftpd,proftpd,pureftp,vsftpd
Windows:Serv-U,IIS
Client程序:
Linux:ftp,lftp,wget,curl
Windows:filezilla,cuteftp
数据连接&命令连接:
tcp/21:命令连接,文本管理类命令,服务器端监听,始终在线的连接
tcp/20:数据传输,传输数据时启用,数据传输完成拆除连接
数据传格式(自动协商):
二进制(ASCII):一般用只用于纯文本文件的传输
文本(Binary):这种模式更适合程序、图片等为纯文本格式的文件
主动被动模式
主动:由服务器创建连接
命令连接:Client使用随机端口连接Server端的21端口
数据连接:Server端的20端口连接Client端的随机端口+1的端口;如果是和命令连接相关联的数据连接,Client端防火墙不会阻止
被动:由客户端创建连接
命令连接:Client使用随机端口连接Server端的21端口
数据连接:Client使用随机端口+1连接服务器的20端口,然后服务器创建一个子进程和一个随机端口,让客户端连接进行传输数据
响应码:
1xx:信息
2xx:成功类的状态码
3xx:提示需进一步提供补充类信息的状态码
4xx:客户端错误
5xx:服务端错误
用户认证:
匿名用户:登录ftp时不需要输入用户名和密码,或者输入ftp或anonymous,密码为空即可登录ftp,这种用户就是匿名用户。一般只对此类用户提供下载
系统用户:直接使用本机系统用户进行验证,资源目录为用户家目录。
虚拟用户:用户帐号和密码信息存储在一份独立的用户数据文件中,而不是直接使用系统帐号。这些位于独立数据库文件中的用户,就是虚拟用户。
yum -y install vsftpd
vsftpd配置文件
pam认证配置文件:/etc/pam.d/vsftpd
服务脚本:/etc/rc.d/init.d/vsftpd
配置文件目录: /etc/vsftpd
主配置文件:vsftpd.conf
主程序:/usr/sbin/vsftpd
匿名用户共享资源位置:/var/ftp/pub
系统用户通过ftp访问资源的位置:用户自己的家目录
虚拟用户通过ftp访问资源的位置:给虚拟用户指定的映射称为系统用户的家目录
ftp安装完成启动服务器就可以工作了。
放置一个测试文件到ftp服务器的匿名共享位置
[root@vsftpd ~]# cp /etc/fstab /var/ftp/pub/
示例连接服务器下载文件
[root@client ~]# lftp 172.16.4.100 lftp 172.16.4.100:~> ls drwxr-xr-x 2 0 0 4096 Apr 23 04:20 pub lftp 172.16.4.100:/> cd pub/ lftp 172.16.4.100:/pub> ls -rw-r--r-- 1 0 0 921 Apr 23 04:20 fstab lftp 172.16.4.100:/pub> get fstab #进入pub目录使用get命令下载fstab文件 921 bytes transferred
使用系统用户登录
[root@client ~]# cp /etc/fstab /home/centos/ [root@client ~]# lftp centos@172.16.4.100 Password: lftp centos@172.16.4.100:~> ls -rw-r--r-- 1 0 0 921 Apr 23 04:40 fstab
匿名用户
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为无限制),单位为字节/秒
示例:设置匿名用户可以上传文件
[root@vsftpd vsftpd]# vim vsftpd.conf anon_upload_enable=YES #配置文件中取消注释 [root@vsftpd vsftpd]# service vsftpd restart [root@vsftpd vsftpd]# chown ftp /var/ftp/pub/ #设置pub目录属主为ftp用户,否则用户没有本地上传权限 [root@vsftpd vsftpd]#ll -d /var/ftp/pub/ drwxr-xr-x 2 ftp root 4096 Apr 23 12:20/var/ftp/pub/ [root@client ~]# lftp 172.16.4.100 #客户端匿名登录并且上传文件 lftp 172.16.4.100:~> cd pub/ lftp 172.16.4.100:/pub> put anaconda-ks.cfg 2856 bytes transferred lftp 172.16.4.100:/pub> ls -rw------- 1 14 50 2856 Apr 23 04:49 anaconda-ks.cfg -rw-r--r-- 1 0 0 921 Apr 23 04:20 fstab
设置匿名用户可以创建目录
[root@vsftpd vsftpd]# vim vsftpd.conf anon_mkdir_write_enable=YES [root@vsftpd vsftpd]# service vsftpd restart [root@client ~]# lftp 172.16.4.100 lftp 172.16.4.100:~> cd pub/ lftp 172.16.4.100:/pub> mkdir testdir #创建目录 mkdir ok, `testdir‘ created lftp 172.16.4.100:/pub> ls -rw------- 1 14 50 2856 Apr 23 04:49 anaconda-ks.cfg -rw-r--r-- 1 0 0 921 Apr 23 04:20 fstab drwx------ 2 14 50 4096 Apr 23 04:54 testdir
设置匿名用户可以删除文件
[root@vsftpd vsftpd]# vim vsftpd.conf anon_other_write_enable=YES [root@vsftpd vsftpd]# service vsftpd restart [root@client ~]# lftp 172.16.4.100 lftp 172.16.4.100:~> cd pub/ lftp 172.16.4.100:/pub> ls -rw------- 1 14 50 2856 Apr 23 04:49 anaconda-ks.cfg -rw------- 1 14 50 921 Apr 23 05:00 fstab drwx------ 2 14 50 4096 Apr 23 04:54 testdir lftp 172.16.4.100:/pub> mrm fstab #删除文件 rm ok, `fstab‘ removed lftp 172.16.4.100:/pub> ls -rw------- 1 14 50 2856 Apr 23 04:49 anaconda-ks.cfg drwx------ 2 14 50 4096 Apr 23 04:54 testdir
本地用户
local_enable=YES //是否启用系统用户
write_enable=YES //本地用户是否有写入权限,同时还包括删除权限
local_umask=022 //设置本地用户所上传权限的掩码值,和系统umask没有关系
local_root=/var/ftp //设置本地用户根目录(不填为家目录)
deny_email_enable=YES //禁锢用户在家目录,需列表
banned_email_file=/etc/vsftpd/chroot_list //禁锢那些用户在家目录的列表(文件不存在需要手动创建)
chroot_local_user=YES //将所有用户禁锢在家目录
local_max_rate=0 //限制本地用户的最大传输速率(0为无限制),单位为字节/秒
示例:将所有用户禁锢在家目录
[root@vsftpd vsftpd]# vim vsftpd.conf chroot_local_user=YES [root@vsftpd vsftpd]# service vsftpd restart [root@client ~]# lftp centos@172.16.4.100 Password: lftp centos@172.16.4.100:~> pwd ftp://centos@172.16.4.100 lftp centos@172.16.4.100:~> cd /etc cd: Access failed: 550 Failed to change directory.(/etc)
全局配置
listen_address=0.0.0.0 //设置监听FTP的IP地址
listen_port=21 //设置监听FTP端口号
write_enable=YES //启用任何形式的写入权限(如上传、删除文件等)都需要开启此项
download_enable=YES //是否允许下载文件
chown_uploads=YES //是否允许上传文件
chown_username=whoever //是否改变上传文件的属主
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就是拒绝登陆
tcp_wrappers=YES //是否启用TCP_Wrappers主机访问控制
max_client=0 //最多允许多少客户端同时连接(0为无限制)
man_per_ip=0 //对于同一个Ip地址的客户端最多允许多少并发连接(0为无限制)
idle_session_timeout=600 //定义空闲会话超时时长
data_connection_timeout=120 //数据连接超时时长
anon_max_rate //匿名用户的最大传输速率,单位是“字节/秒”
local_max_rate //本地用户最大传输速率
Mysql服务器配置
安装mysql数据库
[root@mysql ~]# yum -y install mysql-server
创建存储虚拟用户的数据库,并对用户进行授权
mysql> create database vsftpd; mysql> GRANT select ON vsftpd.* TO vsftpd@‘172.16.%.%‘ IDENTIFIED BY ‘centos‘;
创建表
mysql> use vsftpd; mysql> CREATE TABLE users ( -> idINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, ->name VARCHAR(50) BINARY NOT NULL, ->password CHAR(48) BINARY NOT NULL ); mysql> DESC users; +----------+------------------+------+-----+---------+----------------+ | Field |Type | Null | Key | Default |Extra | +----------+------------------+------+-----+---------+----------------+ | id |int(10) unsigned | NO | PRI | NULL | auto_increment | | name |varchar(50) | NO | | NULL | | | password | char(48) | NO | | NULL | | +----------+------------------+------+-----+---------+----------------+
向表中插入两个用户
mysql> INSERT INTO users (name,password) VALUES(‘zhangsan‘,password(‘centos‘)),(‘lisi‘,password(‘centos‘)); mysql> SELECT * FROM users; +----+----------+-------------------------------------------+ | id | name | password | +----+----------+-------------------------------------------+ | 1 |zhangsan | *128977E278358FF80A246B5046F51043A2B1FCED | | 2 |lisi |*128977E278358FF80A246B5046F51043A2B1FCED | +----+----------+-------------------------------------------+
Vsftpd服务器配置
安装pam_mysql
[root@vsftpd ~]# yum -y install pam_mysql
修改pam文件
[root@vsftpd ~]# vim /etc/pam.d/vsftpd.mysql auth required pam_mysql.so user=vsftpdpasswd=centos host=172.16.4.136 db=vsftpd table=users usercolumn=namepasswdcolumn=password crypt=2 account required pam_mysql.so user=vsftpdpasswd=centos host=172.16.4.136 db=vsftpd table=users usercolumn=namepasswdcolumn=password crypt=2
auth:认证 crypt:说明加密方式
account:检查用户帐号是否在有效期内
还原备份的配置文件,避免以前的更改影响实验效果
[root@vsftpdvsftpd]# mv vsftpd.conf vsftpd.first [root@vsftpdvsftpd]# cp vsftpd.conf.bak vsftpd.conf
建立虚拟用户映射的系统用户及对应的目录
useradd -s /sbin/nologin -d /var/ftproot vuser chmod go+rx /var/ftproot/
修改vsftpd配置文件,添加允许来宾帐号访问,来宾帐号映射为vuser用户
guest_enable=YES guest_username=vuser
设置认证文件为vsftpd.mysql
pam_service_name=vsftpd.mysql
注意:设置pam认证之后,系统用户将无法登录
可选配置
chroot_local_user=YES
配置完成之后重启vsftpd服务器,然后使用虚拟用户登录即可
[root@localhost ~]# lftp zhangsan@172.16.4.100 Password: lftp zhangsan@172.16.4.100:~> ls
设置不同用户不同权限
设置用户权限存放目录
[root@localhost vsftpd]# vim vsftpd.conf user_config_dir=/etc/vsftpd/vuser [root@localhost vsftpd]# mkdir /etc/vsftpd/vuser
创建用户权限文件,文件名需要和用户名保持一致
[root@localhost vsftpd]# cd /etc/vsftpd/vuser/ [root@localhost vuser]# vim zhangsan anon_upload_enable=YES anon_mkdir_write_enable=YES anon_other_write_enable=YES
设置完成重启服务
验证,使用zhangsan用户登录,可以上传文件
[root@localhost ~]# lftp zhangsan@172.16.4.100 Password: lftp zhangsan@172.16.4.100:~> putanaconda-ks.cfg 2856 bytes transferred lftp zhangsan@172.16.4.100:/> ls -rw------- 1 501 501 2856 Apr 23 08:36 anaconda-ks.cfg
使用lisi用户上传则没有权限
[root@localhost ~]# lftp lisi@172.16.4.100 Password: lftp lisi@172.16.4.100:~> ls -rw------- 1 501 501 2856 Apr 23 08:36 anaconda-ks.cfg lftp lisi@172.16.4.100:/> put install.log put: Access failed: 550 Permission denied.(install.log)
本文出自 “梅花香自苦寒来” 博客,请务必保留此出处http://ximenfeibing.blog.51cto.com/8809812/1652139
原文地址:http://ximenfeibing.blog.51cto.com/8809812/1652139