FTP学习笔记

1. 简介

1.1. 协议

文件传输协议(File Transfer Protocol),是一套用于在网络上进行文件传输的标准协议,该协议位于网络传输协议的应用层;

FTP 与 Telnet 类似,被设计用于在两台不同的主机之间进行通信;为了兼容不同的操作系统,Telnet 强制两端使用同样的标准,而 FTP 限定了支持的文件类型和文件结构;

1.2. 文档

FTP协议的最新版公布于1985年,官方文档位于 RFC959

RFC959 的中文翻译,计划在2016年6月完成,链接地址 FTP协议

小贴士:如果你觉得英文比较晦涩难懂,笔者推荐一本中文书籍《TCP/IP详解 卷1》,FTP协议位于第27章。

2. 原理

2.1. 工作模式

FTP有两种工作模式,主动和被动:
主动模式
主动模式要求客户端和服务器端同时打开并且监听同一个端口以创建连接,如果此时客户端设置了防火墙就会产生一些问题,因此这种模式不常用,原理图如下:
主动模式

被动模式
被动模式只要求服务器端监听一个端口,客户端需要时连接即可,原理图如下:
被动模式

2.2. 工作原理

FTP工作时使用两个TCP连接来传输文件,一个控制连接,一个数据连接;
控制连接使用21端口;
数据连接端口一般为随机端口;

3. 应用

3.1. 服务器端

界面应用
Bullet Proof FTP Server、CesarFTP、Cerberus FTP Server、Gene6 FTP Server、GuildFTPd、RaidenFTPD、Serv-U FTP Server、War FTP Daemon、FileZilla Server、等

命令行应用
AnomicFTPD、BSD ftpd、glFTPd、ProFTPd、Pure-FTPd、vsftpd、wu-ftpd、等

3.2. 客户端

FileZilla、FireFTP、FlashFXP、等
ftp、lftp、gftp、wget、curl、等

3.3. 常见应用功能对比

FTP客户端比较
FTP服务器比较

4. 安装

下面以 CentOS 6.x + vsftpd 作为服务器端,以 FileZilla 3.16 作为客户端,演示整套FTP系统的部署和使用;
注:FTP虚拟用户的配置此处不作讲解,请读者另行学习;

使用YUM的方式安装vsftpd:

yum install vsftpd

增加系统用户作为FTP用户:

#注:此处使用系统用户作为FTP用户,指定用户目录,并禁止本地登录;
useradd -d /opt/webroot -g ftp -s /sbin/nologin user1
passwd user1

vsftpd的相关命令:

rpm -q vsftpd  ##检查是否已安装vsftpd
service vsftpd help ##FTP服务相关命令
chkconfig vsftpd help ##FTP服务相关开机命令
chkconfig vsftpd on ##开机启动FTP服务

vsfptd的相关配置文件

/usr/sbin/vsftpd  ##FTP主程序
/etc/rc.d/init.d/vsftp ##FTP服务脚本
/etc/vsftpd/vsftpd.conf ##主配置文件
/etc/vsftpd/chroot_list
/etc/vsftpd/ftpusers ##禁止使用FTP的用户列表
/etc/vsftpd/user_list ##禁止或允许使用FTP的用户列表
/etc/pam.d/vsftpd ##PAM认证文件
/var/ftp ##匿名用户主目录
/var/ftp/pub ##匿名用户下载目录
/var/log/xferlog ##日志文件

修改默认配置文件,提高系统安全性(/etc/vsftpd/vsftpd.conf)

listen_port=20000  ##修改默认监听端口
listen=YES ##使FTP工作在独立模式下
#listen_ipv6=YES ##
max_clients=3 ##客户端最大连接数,需要配合listen=YES使用

ftpd_banner=Warnning! You have entered the monitoring area! ##FTP登录提示语
#deny_email_enable=YES ##禁止匿名用户使用邮箱?
#banned_email_file=/etc/vsftpd/banned_emails ##?
#dirmessage_enable=YES ##开启目录提示信息,被访问目录有.message文件
#ls_recurse_enable=YES ##启用遍历目录功能

anonymous_enable=NO ##禁止匿名用户登录
anon_upload_enable=NO ##禁止匿名用户上传文件
anon_mkdir_write_enable=NO ##禁止匿名用户创建目录
anon_other_write_enable=NO ##禁止其他的写权限(删除目录,文件)

local_enable=YES ##允许本地用户作为FTP用户(登录FTP系统)
write_enable=YES ##允许本地用户可写
local_umask=022 ##本地新建文件/(777-022=755)目录的默认权限(666-022=644)

chroot_local_user=YES ##限制所有本地用户登录后,切换目录
#chroot_list_enable=YES ##启用/etc/vsftpd/chroot_list文件
#chroot_list_file=/etc/vsftpd/chroot_list ##限定切换目录的用户列表

userlist_enable=YES ##启用/etc/vsftpd/user_list文件
userlist_deny=NO ##限定只有/etc/vsftpd/user_list文件中的用户可登录

#connect_from_port_20=YES ##使用20端口作为数据传输端口
idle_session_timeout=300 ##空闲会话的超时时间
data_connection_timeout=120 ##空闲数据连接的超时时间

xferlog_enable=YES ## 打开传输日志
xferlog_std_format=YES ##使用标准日志格式
xferlog_file=/var/log/xferlog ##日志文件路径

#chown_uploads=YES ##允许修改新上传文件的所属者
#chown_username=whoever ##修改新上传文件的所属者为上传用户
#async_abor_enable=YES ##接收ABOR请求,用于兼容老版本客户端
#ascii_upload_enable=YES ##
#ascii_download_enable=YES ##

pam_service_name=vsftpd ##PAM认证
tcp_wrappers=YES ##启用TCP-wrapper

##强制启用TLS登录
ssl_enable=YES ##启用TLS功能
allow_anon_ssl=NO ##禁用匿名TLS
force_local_data_ssl=YES ##强制本地数据传输使用SSL?
force_local_logins_ssl=YES ##强制本地登录使用SSL?
ssl_tlsv1=YES ##使用TLS v1协议
ssl_sslv2=NO
ssl_sslv3=NO
require_ssl_reuse=NO
ssl_ciphers=HIGH
rsa_cert_file=/etc/ssl/private/ftp.crt ##TLS证书
rsa_private_key_file=/etc/ssl/private/ftp.key ##TLS私钥

限制允许登录FTP的网段

#vim /etc/hosts.allow
vsftpd:125.119.*.*:allow

#vim /etc/hosts.deny
vsftpd:all:deny

使用下面的命令创建新的密钥链

#openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /etc/ssl/private/ftp.key -out /etc/ssl/private/ftp.crt

5. 配置文件详解

关于配置文件,有篇文章已经写的相当详细了,请看这里《史上最详细的vsftpd配置文件讲解》

6. 常见错误及解决方案

  • 第一次新增的FTP用户可以登录,重启FTP服务后登录报530错误
    客户端FileZilla强制使用TLS,而服务器端并未配置TLS导致的,在服务器端配置TLS即可;
    还有一种情况下,是vsftpd.conf配置文件的权限限制导致,仔细检查权限;

  • 未能找到vsftpd.conf配置文件的完整配置项列表
    默认的 /etc/vsftpd/vsftpd.conf 配置文件只有常用选项;

参考

文件传输协议
vsftpd专题
CentOS下文件共享服务ftp,nfs,samba安全设置
vsftpd安装以及配置FTP虚拟用户实践
如何配置vsftpd的上一个Ubuntu VPS使用SSL/TLS
《TCP/IP详解 卷1》 第27章
FTP over TLS