1. 什么是FTP
FTP---File Transfer Protocol 文件传输协议
2. FTP是用来干什么的
远程传输(上传或下载)文件,FTP使用了两个并行的连接,一个是控制连接,主要负责FTP用户的认证登录和目录切换等命令的执行,另一个是数据连接,主要负责文件的传输。在整个会话期间,FTP需要时刻维护控制连接与登录用户的状态,而这也极大地限制了FTP能够同时维护的用户连接数
3. FTP的工作模式(两种模式:主动模式和被动模式)---主动和被动主要针对的对象是FTP服务器,两种工作模式是指文件传输过程中发出数据连接的方向
(1)主动模式(FTP服务器主动连接客户端)
在FTP主动模式下,FTP客户端开启一个随机选择的TCP端口连接FTP服务器端口21,并完成控制连接。当两端需要传送数据时,客户端通过控制连接用一个port
command告诉服务器一个客户端的随机端口,然后服务器用20端口连接该随机端口,并完成建立数据连接,连接建立后就可以传送数据了。
概括:服务器端口20连接客户端一个随机端口(该端口在客户端产生并天通过控制连接告诉服务器),并建立数据连接。
(2)被动模式(客户端主动连接FTP服务器)
在FTP被动模式下,FTP客户端开启一个随机选择的TCP端口连接FTP服务器的21端口请求建立连接,完成控制连接的建立。当两端需要传送数据的时候,客户端通过命令通道发送一个PASV command 给服务器要求进入被动传输模式,然后服务器随机选择一个TCP端口,并用控制连接告诉客户端,客户端用另一个TCP端口连接刚才服务器指定的TCP端口来建立数据通道,开始数据传送。
概括:服务器产生一个随机端口,客户端也用一个随机端口连接该服务器端口,并建立数据连接
4. Linux安装FTP软件(vsFTP)
(1)安装ftp服务器软件
# aptitude install vsftpd libpam-mysql
(2)安装ftp客户端软件
# aptitude install ftp
5. vsftp认证登录的几种方式(ftp服务器配置)
第一种:通过系统用户登录ftp
在Debian 7中vsftp默认只允许匿名用户(anonymous)登录,而不允许系统用户登录ftp,原因是系统用户登录ftp存在安全性问题。
那如何让系统用户可以登录ftp而尽量提高由此带来的安全性问题呢?
1: 建立系统用户时,让该用户不能登录系统,只能登录ftp
命令如下:
-- 创建用户,家目录:/home/virtual 登录脚本:/usr/sbin/nologin
# useradd -d /home/virtual -s /usr/sbin/nologin virtual
-- 为用户virtual设置密码
# passwd virtual
设置完成,试试能否登录ftp,无法登录?呵呵,原因在这呢。
在配置文件/etc/vsftpd.conf中有个参数check_shell=YES|NO,表示vsftpd会检测用户的shell是否登记于/etc/shells文件中,查看/etc/shells,
确实没有/usr/sbin/nologin,好了,手动将/usr/sbin/nologin加到/etc/shells文件的最后一行,然后保存退出,再试?问题解决。
2:通过配置chroot,让登录用户不能离开宿主目录,即当前用户的根目录
chroot_local_user=YES --- 所有用户均不能离开自己的家目录
local_root=/var/ftp/pub ----指定所有用户的家目录
第二种:通过本地数据文件实现虚拟用户的访问,此种情况主要适用于用户比较少及变化不频繁的情况下适用1:安装用于生成数据库的软件包db4.8-util:# aptitude install db4.8-util
2: 创建本地映射用户
# useradd -d /home/ftpsite virtual
# mkdir /home/ftpsite
# chown virtual.virtual /home/ftpsite
# ls -ld /home/ftpsite
drwxr-xr-x 2 virtual virtual 48 2013-10-31 15:48 /home/ftpsite
3:修改配置文件/etc/vsftpd.conf
anonymous_enable=NO
local_enable=yes
write_enable=yes
guest_enable=yes
guest_username=virtual
pam_service_name=vsftpd //指定pam认证文件名称(默认会去/etc/pam.d目录下查找该文件)
4: 生成虚拟用户文件/etc/vftpuser.txt,用户密码各一行tiddy----->用户
tiddypass ----->密码
etony
etonypass
5:生成虚拟用户数据文件# db4.8_load -T -t hash -f /etc/vftpuser.txt /etc/vsftpd_login.db
# chmod 600 /etc/vsftpd_login.db
6:修改PAM认证文件/etc/pam.d/vsftpd(清空该文件内容,然后将下面两行添加进去)
auth required /lib/security/pam_userdb.so db=/etc/vsftpd_login
account required /lib/security/pam_userdb.so db=/etc/vsftpd_login
注意:红色标注部分的db文件/etc/vsftpd_login是不带后缀.db的
7:启动服务,既可以用tiddy和etony登录FTP
# /etc/init.d/vsftpd start|restart
第三种:通过Mysql实现虚拟用户访问
1:修改/etc/vsftpd/vsftpd.conf
anonymous_enable=NO
local_enable=YES PAM方式此处必须为YES,如果不是将出现错误
guest_enable=YES
guest_username=virtual 这两行的意思是采用虚拟用户形式
pam_service_name=vsftpd //指定pam认证文件名称(默认会去/etc/pam.d目录下查找该文件)
mysql>create table user(name char(20),passwd char(20));
mysql>insert user values('test1',password'(12345)');
mysql>insert user values ('test2',password'(54321)');
mysql>grant select on ftpd.user to ftpd@localhost identified by '123456';
3:修改PAM认证文件/etc/pam.d/vsftpd
auth required /lib/security/pam_mysql.so user=ftpd passwd=123456 host=localhost db=ftpd table=user usercolumn=name passwdcolumn=passwd crypt=2
account required /lib/security/pam_mysql.so user=ftpd passwd=123456 host=localhost db=ftpd table=user usercolumn=name passwdcolumn=passwd crypt=2
备注:
1、vsftpd配置参数详细整理
#接受匿名用户
anonymous_enable=YES
#匿名用户login时不询问口令
no_anon_password=YES
#匿名用户主目录
anon_root=(none)
#接受本地用户
local_enable=YES
#本地用户主目录
local_root=(none)
#仅在没有pam验证版本时有用,是否检查用户有一个有效的shell来登录
check_shell=YES
#若启用此选项,userlist_deny选项才被启动
userlist_enable=YES
#若为YES,则userlist_file中的用户将不能登录,为NO则只有userlist_file的用户可以登录
userlist_deny=NO
#可以上传(全局控制).
write_enable=YES
#本地用户上传文件的umask
local_umask=022
#上传文件的权限配合umask使用
#file_open_mode=0666
#匿名用户可以上传
anon_upload_enable=NO
#匿名用户可以建目录
anon_mkdir_write_enable=NO
匿名用户其它的写权利(更改权限?)
anon_other_write_enable=NO
如果设为YES,匿名登入者会被允许下载可阅读的档案。默认值为YES。
anon_world_readable_only=YES
#如果开启,那么所有非匿名登陆的用户名都会被切换成guest_username指定的用户名
#guest_enable=NO
所有匿名上传的文件的所属用户将会被更改成chown_username
chown_uploads=YES
匿名上传文件所属用户名
chown_username=lightwiter
#如果启动这项功能,则所有列在chroot_list_file之中的使用者不能更改根目录
chroot_list_enable=YES
#管控是否可用ASCII 模式下载。默认值为NO。
ascii_download_enable=YES
#空闲连接超时
idle_session_timeout=600
#数据传输超时
data_connection_timeout=120
#PAVS请求超时
ACCEPT_TIMEOUT=60
#PROT模式连接超时
connect_timeout=60
#开启日记功能
xferlog_enable=YES
#使用标准格式
xferlog_std_format=YES
#当xferlog_std_format关闭且本选项开启时,记录所有ftp请求和回复,当调试比较有用.
#log_ftp_protocol=NO
#允许使用pasv模式
pasv_enable=YES
#关闭安全检查,小心呀.
#pasv_promiscuous+NO
#允许使用port模式
#port_enable=YES
#关闭安全检查
#prot_promiscuous
#开启tcp_wrappers支持
tcp_wrappers=YES
#定义PAM 所使用的名称,预设为vsftpd。
pam_service_name=vsftpd
#当服务器运行于最底层时使用的用户名
nopriv_user=nobody
#使vsftpd在pasv命令回复时跳转到指定的IP地址.(服务器联接跳转?)
pasv_address=(none)
#是否能使用ls -R命令以防止浪费大量的服务器资源
#ls_recurse_enable=YES
#是否使用单进程模式
#one_process_model
#绑定到listen_port指定的端口,既然都绑定了也就是每时都开着的,就是那个什么standalone模式
listen=YES
#当使用者登入后使用ls -al 之类的指令查询该档案的管理权时,预设会出现拥有者的UID,而不是该档案拥有者的名称。若是希望出现拥有者的名称,则将此功能开启。
text_userdb_names=NO
#显示目录清单时是用本地时间还是GMT时间,可以通过mdtm命令来达到一样的效果
use_localtime=NO
#测试平台优化
#use_sendfile=YES
#login时显示欢迎信息.如果设置了banner_file则此设置无效
ftpd_banner=欢迎来到FTP 网站.
#允许为目录配置显示信息,显示每个目录下面的message_file文件的内容
dirmessage_enable=YES
#显示会话状态信息,关!
#setproctitle_enable=YES
#定义不能更改用户主目录的文件
chroot_list_file=/etc/vsftpd/vsftpd.chroot_list
#定义限制/允许用户登录的文件
userlist_file=/etc/vsftpd/vsftpd.user_list
#定义登录信息文件的位置
banner_file=/etc/vsftpd/banner
#禁止使用的匿名用户登陆时作为密码的电子邮件地址
banned_email_file=/etc/vsftpd.banned_emails
#日志文件位置
xferlog_file=/var/log/vsftpd.log
#目录信息文件
message_file=.message
#定义用户配置文件的目录
user_config_dir=/etc/vsftpd/userconf
#定义本地用户登陆的根目录,注意定义根目录可以是相对路径也可以是绝对路径.相对路径是针对用户家目录来说的.
local_root=webdisk 此项设置每个用户登陆后其根目录为/home/username/webdisk
#匿名用户登陆后的根目录
anon_root=/var/ftp
#可接受的最大client数目
max_clients=100
#每个ip的最大client数目
max_per_ip=5
#使用标准的20端口来连接ftp
connect_from_port_20=YES
#绑定到某个IP,其它IP不能访问
listen_address=192.168.0.2
#绑定到某个端口
#listen_port=2121
#数据传输端口
#ftp_data_port=2020
#pasv连接模式时可以使用port 范围的上界,0 表示任意。默认值为0。
pasv_max_port=0
#pasv连接模式时可以使用port 范围的下界,0 表示任意。默认值为0。
pasv_min_port=0
#匿名用户的传输比率(b/s)
anon_max_rate=51200
#本地用户的传输比率(b/s)
local_max_rate=5120000
附: FTP 数字代码的意义
110 重新启动标记应答。
120 服务在多久时间内ready。
125 数据链路埠开启,准备传送。
150 文件状态正常,开启数据连接端口。
200 命令执行成功。
202 命令执行失败。
211 系统状态或是系统求助响应。
212 目录的状态。
213 文件的状态。
214 求助的讯息。
215 名称系统类型。
220 新的联机服务ready。
221 服务的控制连接埠关闭,可以注销。
225 数据连结开启,但无传输动作。
226 关闭数据连接端口,请求的文件操作成功。
227 进入passive mode。
230 使用者登入。
250 请求的文件操作完成。
257 显示目前的路径名称。
331 用户名称正确,需要密码。
332 登入时需要账号信息。
350 请求的操作需要进一部的命令。
421 无法提供服务,关闭控制连结。
425 无法开启数据链路。
426 关闭联机,终止传输。
450 请求的操作未执行。
451 命令终止:有本地的错误。
452 未执行命令:磁盘空间不足。
500 格式错误,无法识别命令。
501 参数语法错误。
502 命令执行失败。
503 命令顺序错误。
504 命令所接的参数不正确。
530 未登入。
532 储存文件需要账户登入。
550 未执行请求的操作。
551 请求的命令终止,类型未知。
552 请求的文件终止,储存位溢出。