标签:ftp、vsftp
一、FTP协议简介
1、什么是FTP协议
FTP(File Transfer Protocol,文件传输协议) 是 TCP/IP 协议组中的协议之一。FTP协议包括两个组成部分,其一为FTP服务器,其二为FTP客户端。其中FTP服务器用来存储文件,用户可以使用FTP客户端通过FTP协议访问位于FTP服务器上的资源。默认情况下FTP协议使用TCP端口中的20和21这两个端口,其中20用于传输数据(客户端和FTP服务器进行文件传输或者列表的通道),21用于传输控制信息(客户端和FTP服务器进行沟通的通道,连接FTP,发送FTP指令都是通过控制通道来完成的)。
2、什么是主动模式(PORT)、被动模式(PASV)
在日常的使用中控制连接均由客户端发起来连接服务端的21端口,但是服务端在使用20端口作为传输数据的端口时与FTP使用的传输模式有关,如果采用主动模式,那么数据传输端口就是20;如果采用被动模式,则具体最终使用哪个端口要服务器端和客户端协商决定。
2.1、主动模式的FTP工作原理:
客户端从一个任意的非特权端口N连接到FTP服务器的命令端口,也就是21端口。然后客户端开始监听端口N+1,并发送FTP命令“port N+1”到FTP服务器。接着服务器会从它自己的数据端口(20)连接到客户端指定的数据端口(N+1)。
针对FTP服务器前面的防火墙来说,必须允许以下通讯才能支持主动方式FTP:
任何大于1024的端口到FTP服务器的21端口。(客户端初始化的连接)
FTP服务器的21端口到大于1024的端口。 (服务器响应客户端的控制端口)
FTP服务器的20端口到大于1024的端口。(服务器端初始化数据连接到客户端的数据端口)
大于1024端口到FTP服务器的20端口(客户端发送ACK响应到服务器的数据端口)
2.2、被动模式的FTP工作原理:
在被动方式FTP中,命令连接和数据连接都由客户端发起,这样就可以解决从服务器到客户端的数据端口的入方向连接被防火墙过滤掉的问题。当开启一个 FTP连接时,客户端打开两个任意的非特权本地端口(N > 1024和N+1)。第一个端口连接服务器的21端口,但与主动方式的FTP不同,客户端不会提交PORT命令并允许服务器来回连它的数据端口,而是提交 PASV命令。这样做的结果是服务器会开启一个任意的非特权端口(P > 1024),并发送PORT P命令给客户端。然后客户端发起从本地端口N+1到服务器的端口P的连接用来传送数据。
对于服务器端的防火墙来说,必须允许下面的通讯才能支持被动方式的FTP:
从任何大于1024的端口到服务器的21端口(客户端初始化的连接)
服务器的21端口到任何大于1024的端口(服务器响应到客户端的控制端口的连接)
从任何大于1024端口到服务器的大于1024端口(客户端初始化数据连接到服务器指定的任意端口)
服务器的大于1024端口到远程的大于1024的端口(服务器发送ACK响应和数据到客户端的数据端口)
关于两种工作模式的简单概括:
主动FTP:
命令连接:客户端 >大于1024端口 -> 服务器 21端口
数据连接:客户端 >大于1024端口 <- 服务器 20端口
被动FTP:
命令连接:客户端 >大于1024端口 -> 服务器 21端口
数据连接:客户端 >大于1024端口 -> 服务器 >大于1024端口
3、两种模式的优缺点
主动FTP对FTP服务器的管理和安全很有利,但对客户端的管理不利。因为FTP服务器企图与客户端的高位随机端口建立连接,而这个端口很有可能被客户端的防火墙阻塞掉。被动FTP对FTP客户端的管理有利,但对服务器端的管理不利。因为客户端要与服务器端建立两个连接,其中一个连到一个高位随机端口,而这个端口很有可能被服务器端的防火墙阻塞掉。
4、常用的FTP工具
服务端:Linux系统中 wu-ftpd、pureftp、vsftpd ;Windows系统中ServU;
基于GUI的客户端:Windows系统中flashfxp、cuteftp、filezilla(开源);Linux系统中gftp;
基于CLI的客户端:Linux系统中ftp、lftp、wget、lftpget;
5、FTP远程的登录方式
匿名登录方式
不需要用户名,密码。就能登录到服务器电脑里面
本地用户方式
需要帐户名和密码才能登录。而且,这个帐户名和密码,都是在linux系统里面,已经有的用户。
虚拟用户方式
同样需要用户名和密码才能登录。
与上面二种方式的区别:这个用户名和密码,在linux系统中是没有的(没有该用户帐号)
6、FTP响应码
1xx:提示信息
2xx:成功类状态码
3xx:提示需进一步提供补充类信息的状态码
4xx:客户端错误
5xx:服务端错误
二、搭建FTP环境
1、实验环境
IP | hostname | 系统版本 | ftp服务与测试端 | |
服务端 | 192.168.1.8 | hpf-linux | CentOS 6.6 | vsftpd-2.2.2 |
测试端 | 192.168.1.20 | webserver | CentOS 6.6 | lftp-4.0.9 |
2、安装ftp及其相关文件说明
[root@hpf-linux ~] # yum install -y vsftpd
/etc/pam.d/vsftpd: pam 模块进行用户身份认证文件 /etc/vsftpd/vsftpd.conf:主配置文件 /etc/rc.d/init.d/vsftpd:启动脚本 /usr/sbin/vsftpd:Vsftpd的主程序 /etc/vsftpd/ftpusers:记录不允许访问FTP服务器的用户名单,管理员可以把一些对系统安全有威胁的用户账号记录在此文件中,以免用户从FTP登录后获得大于上传下载操作的权利,而对系统造成损坏。 /etc/vsftpd/user_list:禁止或允许使用vsftpd的用户列表文件。这个文件中指定的用户缺省情况(即在/etc/vsftpd/vsftpd.conf中设置userlist_deny=YES)下也不能访问FTP服务器,在设置了userlist_deny=NO时,仅允许user_list中指定的用户访问FTP服务器。 /var/ftp/:匿名用户主目录;本地用户主目录为:/home/用户主目录,即登录后进入自己家目录。 /var/ftp/pub:匿名用户的下载目录及共享目录。 /etc/logrotate.d/vsftpd.log:Vsftpd的日志文件;
3、vsftp配置文件说明
注意:配置文件中所有启动的选项必须顶格写,同时选项中的等号两边也不能有空格,不然语法会报错。在以#为开头的行中若#后紧跟的有空格则表示这行是注释,其余均为是可以启动选项配置。
说明连接:http://cuchadanfan.blog.51cto.com/9940284/1684173
4、禁锢本地用户在其家目录
在系统的默认配置文件中我们可以使用匿名用户登录ftp服务器,也可以使用本地用户登录服务器,两者的区别是匿名用户登录和只能在/var/ftp/pub下查看信息,不能切换至别的目录也不能下载文件,然而本地用户可以在任意目录下切换也可以下载其在该系统上有权限的文件,这里我们可以用两种方法修改配置文件将本地用户禁锢在其家目录下:第一、在etc/vsftpd/vsftpd.conf配置文件中将这行的chroot_local_user=YES选项的注释去掉,重启服务在执行操作就会发现本地用户不能在随意切换目录了,然而这样操作会带来将所有本地用户禁锢在家目录。第二、若我们只想将指定的用户禁锢在家目录可以进行以下操作:
[root@hpf-linux ~]# vim /etc/vsftpd/vsftpd.conf #chroot_local_user=YES //此项需要注释,不然会和下面的两项发生冲突 chroot_list_enable=YES chroot_list_file=/etc/vsftpd/chroot_list [root@hpf-linux ~]# /etc/init.d/vsftpd restart [root@hpf-linux ~]# cat /etc/vsftpd/chroot_list //若想禁锢多个本地用户则在每行写一个本地用户名 cangls [root@hpf-linux ~]# lftp 192.168.1.8 -ucangls 口令: lftp cangls@192.168.1.8:~> pwd ftp://canglscanglscangls@192.168.1.8 lftp cangls@192.168.1.8:~> cd /etc cd: Access failed: 550 Failed to change directory. (/etc) lftp cangls@192.168.1.8:/> bye [root@hpf-linux ~]# lftp 192.168.1.8 -ubols 口令: lftp bols@192.168.1.8:~> pwd ftp://bolsbolsbols@192.168.1.8 lftp bols@192.168.1.8:~> cd /var/ftp cd 成功, 当前目录=/var/ftp lftp bols@192.168.1.8:/var/ftp> ls drwxr-xr-x 2 0 0 4096 Aug 12 13:11 pub
5、设置匿名用户在ftp服务器上有写入功能
注意:启用写入功能时,ftp用户对相应的本地文件系统也有相应的写入权限,生效的权限取决于文件系统权限和服务权限的交集!
[root@hpf-linux ~]# vim /etc/vsftpd/vsftpd.conf anonymous_enable=YES 启动虚拟用户登录 anon_upload_enable=YES 允许虚拟用户有写权限 anon_other_write_enable=YES 允许虚拟用户有删除权限 anon_mkdir_write_enable=YES 允许虚拟用户创建文件夹权限 [root@hpf-linux ~]# mkdir /var/ftp/pub/test [root@hpf-linux ~]# setfacl -m u:ftp:wrx /var/ftp/pub/test/ [root@hpf-linux ~]# lftp 192.168.1.8 lftp 192.168.1.8:~> cd pub/test cd 成功, 当前目录=/pub/test lftp 192.168.1.8:/pub/test> ls lftp 192.168.1.8:/pub/test> !ls //查看登录前所在目录的文件 anaconda-ks.cfg cpcmd.sh install.log install.log.syslog issue shell test lftp 192.168.1.8:/pub/test> put issue 47 bytes transferred lftp 192.168.1.8:/pub/test> ls -rw------- 1 14 50 47 Aug 12 14:27 issue lftp 192.168.1.8:/pub/test> mkdir 11111 mkdir 成功, 建立 `11111‘ lftp 192.168.1.8:/pub/test> ls drwx------ 2 14 50 4096 Aug 12 14:28 11111 -rw------- 1 14 50 47 Aug 12 14:27 issue lftp 192.168.1.8:/pub/test> rm -fr 11111 rm 成功, 删除 `11111‘ lftp 192.168.1.8:/pub/test> ls -rw------- 1 14 50 47 Aug 12 14:27 issue
6、控制登陆系统用户的机制
实验中安装的是redhat提供的rpm包,安装后会在/etc/vsftpd/目录中生成关于用户登录的两个文件:user_list和ftpusers,其中ftpusers中定义的是不能登录ftp服务器用户,定义此权限的是/etc/pam.d/vsftpd模块,此文件也是rpm安装后自动生成的,关于user_list文件其既可以定义为白名单,也可以定义为黑名单,系统默认的是定义为黑名单,关于黑名单这里就不做演示了下面是白名单的演示。
[root@hpf-linux ~]# vim /etc/vsftpd/vsftpd.conf userlist_enable=YES userlist_deny=NO //添加此行 [root@hpf-linux ~]# echo "bols" > /etc/vsftpd/vsftpd.conf [root@webserver ~]# lftp 192.168.1.8 -ubols 口令: lftp bols@192.168.1.8:~> ls -rw-r--r-- 1 0 0 47 Aug 13 12:51 issue lftp bols@192.168.1.8:~> cd /var/ftp/pub/test cd 成功, 当前目录=/var/ftp/pub/test lftp bols@192.168.1.8:/var/ftp/pub/test> ls -rw------- 1 14 50 47 Aug 12 14:27 issue [root@webserver ~]# lftp 192.168.1.8 -ucangls 口令: lftp cangls@192.168.1.8:~> ls 中断 lftp cangls@192.168.1.8:~> cd /var^Ctp^C
7、使用mysql定义虚拟用户登录ftp服务器
安装相关软件包:
[root@hpf-linux ~]# yum install -y mysql-server mysql-devel mysql pam_mysql
将 FTP 虚拟用户存放在数据库中,这里使用 MySQL 的 password() 函数将用户密码加密,以保证密码安全:
mysql> create database vsftpd; Query OK, 1 row affected (0.00 sec) mysql> grant select on vsftpd.* to vsftpd@localhost identified by ‘123456‘; Query OK, 0 rows affected (0.00 sec) mysql> grant select on vsftpd.* to vsftpd@‘192.168.1.%‘ identified by ‘123456‘; Query OK, 0 rows affected (0.00 sec mysql> flush privileges; Query OK, 0 rows affected (0.00 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | test | | vsftpd | +--------------------+ 4 rows in set (0.00 sec) mysql> use vsftpd; Database changed mysql> create table vsftpusers( -> id int AUTO_INCREMENT NOT NULL, -> name char(20) binary NOT NULL, -> password char(48) binary NOT NULL, -> primary key(id) -> ); Query OK, 0 rows affected (0.01 sec) mysql> DESC vsftpusers; +----------+----------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------+----------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | char(20) | NO | | NULL | | | password | char(48) | NO | | NULL | | +----------+----------+------+-----+---------+----------------+ 3 rows in set (0.00 sec) mysql> insert into vsftpusers(name,password) values(‘foo‘,PASSWORD(‘123456‘)); Query OK, 1 row affected (0.00 sec) mysql> insert into vsftpusers(name,password) values(‘longls‘,PASSWORD(‘123456‘)); Query OK, 1 row affected (0.00 sec) mysql> select * from vsftpusers; +----+--------+-------------------------------------------+ | id | name | password | +----+--------+-------------------------------------------+ | 1 | foo | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | | 2 | longls | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | +----+--------+-------------------------------------------+ 2 rows in set (0.00 sec) mysql> \q Bye
建立 pam 认证所需文件:
[root@hpf-linux ~]# cat /etc/pam.d/vsftpd.mysql auth required /lib64/security/pam_mysql.so user=vsftpd passwd=123456 host=localhost db=vsftpd table=vsftpusers usercolumn=name passwdcolumn=password crypt=2 account required /lib64/security/pam_mysql.so user=vsftpd passwd=123456 host=localhost db=vsftpd table=vsftpusers usercolumn=name passwdcolumn=password crypt=2
创建虚拟用户映射系统用户及对应的目录:
[root@hpf-linux ~]# useradd -s /sbin/nologin -d /var/test vsftpuser [root@hpf-linux ~]# chmod go+rx /var/test
修改vsftpd.conf文件添加需要认证虚拟用户的选项:
[root@hpf-linux ~]# vim /etc/vsftpd/vsftpd.conf guest_enable=YES guest_username=vsftpuser pam_service_name=vsftpd.mysql
测试机测试发现所添加的虚拟用户均能执行权限相同操作,若自定虚拟用户权限还需要配置:
[root@webserver ~]# lftp 192.168.1.8 -ulongls 口令: lftp longls@192.168.1.8:~> ls -rwxr-xr-x 1 0 0 483 Jul 27 18:45 cpcom.sh -rw-r--r-- 1 0 0 47 Jul 27 18:30 issue lftp longls@192.168.1.8:/> get cpcom.sh 483 bytes transferred lftp longls@192.168.1.8:/> bye [root@webserver ~]# lftp 192.168.1.8 -ufoo 口令: lftp foo@192.168.1.8:~> get issue 47 bytes transferred lftp foo@192.168.1.8:/> rm issue rm: Access failed: 550 Permission denied. (issue) lftp foo@192.168.1.8:/> bye [root@webserver ~]# ls cpcom.sh issue cpcom.sh issue
8、根据自身需要自定义虚拟用户的权限
在主配置文件按以下修改:
[root@hpf-linux ~]# vim /etc/vsftpd/vsftpd.conf user_config_dir=/etc/vsftpd/ftpusers_config #anon_upload_enable=YES #anon_mkdir_write_enable=YES #anon_other_write_enable=YES
自定义用户的权限:
[root@hpf-linux ~]# mkdir /etc/vsftpd/ftpusers_config [root@hpf-linux ~]# cat /etc/vsftpd/ftpusers_config/foo anon_upload_enable=NO [root@hpf-linux ~]# cat /etc/vsftpd/ftpusers_config/longls anon_upload_enable=YES anon_other_write_enable=YES
测试验证:
[root@webserver ~]# lftp 192.168.1.8 -ulongls 口令: lftp longls@192.168.1.8:~> ls -rwxr-xr-x 1 0 0 483 Jul 27 18:45 cpcom.sh -rw-r--r-- 1 0 0 47 Jul 27 18:30 issue lftp longls@192.168.1.8:/> put rsyncd.conf 374 bytes transferred lftp longls@192.168.1.8:/> ls -rwxr-xr-x 1 0 0 483 Jul 27 18:45 cpcom.sh -rw-r--r-- 1 0 0 47 Jul 27 18:30 issue -rw------- 1 500 500 374 Jul 27 19:07 rsyncd.conf lftp longls@192.168.1.8:/> bye [root@webserver ~]# lftp 192.168.1.8 -ufoo 口令: lftp foo@192.168.1.8:~> !ls anaconda-ks.cfg cpcom.sh install.log install.log.syslog issue rsyncd.conf lftp foo@192.168.1.8:~> put cpcom.sh put: Access failed: 550 Permission denied. (cpcom.sh) lftp foo@192.168.1.8:/> ls -rwxr-xr-x 1 0 0 483 Jul 27 18:45 cpcom.sh -rw-r--r-- 1 0 0 47 Jul 27 18:30 issue -rw------- 1 500 500 374 Jul 27 19:07 rsyncd.conf lftp foo@192.168.1.8:/> bye
三、vsftpd服务器的其它主要设置
1.最大传输速率设置
设置匿名用户的最大传输率为20Kbps,修改/etc/vsftpd/vsftpd.conf添加语句:anon_max_rate=20000
设置本地帐号最大传输率为1Mbps,修改/etc/vsftpd/vsftpd.conf添加语句:local_max_rate=1000000
2.服务器最大并发数和用户最大线程数设置
例如设置服务器允许的最大并发数为99,而每个用户同一时段的最大并发线程数为5,修改/etc/vsftpd/vsftpd.conf添加两行语句:max_clients=99 和 max_per_ip=5
3.修改默认端口
默认FTP服务器端口号是21,出于安全目的,有时需修改默认端口号,修改/etc/vsftpd/vsftpd.conf
添加语句(例):listen_port=4449 该语句指定了修改后FTP服务器的端口号,应尽量大于4000,修改后访问
#ftp 192.168.57.2 4449(需加上正确的端口号了,否则不能正常连接)
4.常见的vsftpd日志解决方案如下
xferlog_enable=YES (表明FTP服务器记录上传下载的情况)
xferlog_std_format=YES (表明将记录的上传下载情况写在xferlog_file所指定的文件中,即xferlog_file选项指定的/var/log/xferlog文件中)
xferlog_file=/var/log/xferlog
dual_log_enable=YES (表明启用了双份日志,在用xferlog文件记录服务器上传下载情况的同时,vsftpd_log_file所指定的文件,即/var/log/vsftpd.log也将用来记录服务器的传输情况)
vsftpd_log_file=/var/log/vsftpd.log
本文出自 “粗茶淡饭” 博客,请务必保留此出处http://cuchadanfan.blog.51cto.com/9940284/1684793
标签:ftp、vsftp
原文地址:http://cuchadanfan.blog.51cto.com/9940284/1684793