关于ftp(在Linux中为vsftpd)

文件传输协议(File Transfer Protocol,FTP)是用于在网络上进行文件传输的一套标准协议,它工作在 OSI 模型的第七层, TCP 模型的第四层, 即应用层, 使用 TCP 传输而不是 UDP, 客户在和服务器建立连接前要经过一个“三次握手”的过程, 保证客户与服务器之间的连接是可靠的, 而且是面向连接, 为数据传输提供可靠保证。

客户端安装ftp

演示环境:Centos 6.8

  1. yum install vsftp -y #从yum源下载vsftp
  2. vi /etc/vsftpd/vsftpd.conf #修改vsftp配置文件
  3. 在配置文件中将anonymous_enable=NO改为YES
  4. service vsftpd start #开启vsftp
  5. service iptables stop #关闭防火墙
  6. 完成,你可以访问别的主机的 vsftp 了

服务器安装 ftp

演示环境:Centos7.4

按照上述客户端安装 ftp 的步骤来一遍

要注意,按上述步骤在局域网内是没有问题的,但是在云服务器上就有坑要填。因为云服务器有一个安全组的机制,然后从这个突破口去寻找解决方案。首先将局域网的配置步骤照搬到服务器上,启动发现无论是浏览器还是filezilla客户端都访问不了。在解决这个问题之前要了解ftp的两个工作模式:Port和Pasv。FTP连接一般会有两个连接,也就是会需要用到两个端口。一个服务器与客户端跟进行命令交互的,一个是进行数据传送的。那两种工作模式跟两个连接是怎么搭配起来工作的呢?

假设客户端为C,服务器端为S(以下简称C和S):

  • Port模式:当客户端C和服务端S连接起来后,C会发送一条命令告诉S:“我在本地打开了一个端口N等你进行数据连接”,当S收到这个Port命令后就会向C打开的那个端口N进行数据连接。S主动向C的某个端口进行数据连接,此乃主动模式
  • Pasv模式:当客户端C和服务端S连接起来后,S会发送一条命令告诉C:“我再本地打开了一个端口M你来连接我吧”,当C收到这个消息后就会向S的M端口发起数据连接。S打开端口被C主动连接,此乃被动模式

那我们应该使用哪种工作模式呢?答案是被动(默认工作模式就是被动)。为什么?很简单,你是在局域网内,你可以连接到云服务器的某个端口(前提是这个端口放开了),但是云服务器连接不到你的,因为云服务器有公网IP。

无论是哪一种工作模式,首先在建立控制连接时候操作是一样的,都是由客户端(首先随机选取一个大于1024以上的端口)和FTP服务器的控制端口21建立连接,并通过该连接传输操作指令。

那么,两种工作模式的区别是什么呢?

在于使用数据传输端口(ftp-data)方式。port mode由FTP服务器指定数据传输所使用的端口,默认值为20。pasv mode由FTP客户端决定数据传输端口,客户端向服务端发出连接请求包含了数据传输端口

服务器安装ftp其实与客户端安装ftp没太大差异,主要区别在服务器要多加两个配置,在 vftpd.conf 中增加以下内容:

pasv_enable=YES
pasv_min_port=30000
pasv_max_port=50000

最后在服务器的防火墙中放行30000-50000范围端口就欧克了

附:vsftp配置文件说明

# 允许匿名访问
anonymous_enable=YES
# 不允许本地用户,如root用户登陆。默认允许
local_enable=NO
#设置本地用户登录所在的目录。默认配置文件中没有该配置项,本地用户登录FTP服务器后所在的目录为所登录用户的主目录,如:对于root用户,则为/root目录
# local_root=/home/ftpuser
# 本地用户上传文件权限
local_umask=022
# 匿名用户上传文件权限
anon_umask=022
# 允许写入操作,否则不能上传文件
write_enable=YES
# 允许匿名用户上传文件,需要配合write_enable=yes
anon_upload_enable=YES
# 控制匿名用户对文件和文件夹的删除和重命名(自己添加,没有该配置)
anon_other_write_enable=YES
# 允许匿名用户创建目录
anon_mkdir_write_enable=YES
# ftp工具连接成功提示
ftpd_banner=Welcome to blah FTP service.
# 所有用户均不能切换到上级目录
chroot_local_user=YES
# 是否启动限制用户的名单。YES为启用,NO禁用。默认禁用
chroot_list_enable=NO
# /etc/vsftpd/user_list文件不生效
userlist_enable=NO
#坑,添加以下配置。不添加此项,文件无法上传。报错:550 Permission denied。新版本vsftpd加入了安全需求,切根不允许写,要添加这个配置并设置为YES才可以
allow_writeable_chroot=YES
#匿名用户的根目录。这个非常重要
anon_root=/usr/local/ftpdir
#匿名用户不要密码就靠这个
no_anon_password=YES
# 匿名登录后的使用者
ftp_username=ftpuser