FTP Server Over 阿里云 最佳实践

摘要: 做为很是古老的协议(1971年首次提出,1980年首次应用),FTP在目前依然占有一席之地,可是因为目前IT业发展的很是迅猛,它和如今的基础架构产生了一些水土不服,本文旨在经过平常常见的案例,来介绍如何在阿里云上搭建FTP Server和FTP Client。安全

概述

做为很是古老的协议(1971年首次提出,1980年首次应用),FTP在目前依然占有一席之地,可是因为目前IT业发展的很是迅猛,它和如今的基础架构产生了一些水土不服,本文旨在经过平常常见的案例,来介绍如何在阿里云上搭建FTP Server和FTP Client。服务器

本文结构

本文先从FTP的协议分析,重点阐述了其中控制通道的两种链接模式,进而说明在阿里云上搭建FTP服务器可能遇到的问题,如被动模式下服务器公网IP没法获取、主动模式下没法链接等状况。网络

FTP协议摘选

控制通道与数据通道

在FTP协议中,一般有两个通道:控制通道和数据通道,前者用来传输控制命令,如协议握手、得到当前目录等操做,而数据通道顾名思义,就是用来传输文件数据之用,另外ls命令的结果一般也会经过数据通道来传输。架构

被动模式与主动模式

而被动模式和主动模式是针对如何创建数据通道而言的,这里的主动、被动是站在服务器的角度上描述的,他们的差异简单来讲就是数据通道的TCP链接创建是由谁发起的,主动模式下服务器主动向客户端创建数据通道,而被动模式下,服务器是等待客户端来链接的。网站

这两个模式你们听到比较多的应该是被动模式,一般网上的文章都会建议客户端使用被动模式来链接,下面简单来讲明一下二者的差异。this

主动模式

主动模式的详细操做能够参考我以前写的一篇文章,这里节选部分信息:阿里云

如下是一次完整的交互,客户端为47.x.x.224,服务端为112.x.x.7。spa

对他的分析能够参考以后的一张交互图,须要重点说明的是交互图中标红的一行,这一行能够理解为数据通道的实际体现(抓包中倒数第4个包,因为我只过滤了FTP协议的包,TCP的控制包没有显示出来,这个包其实是创建了一个新的TCP流来传输的),在这以前PORT命令是由客户端发出的,这一条报文为code

PORT 47,x.x,224,39,16

其中前四个数字为十进制的IP地址,在主动模式下为客户端的IP地址,最后两个数字为端口,因为端口须要两个字节表示,因此在这里的计算方式为39x256+16=10000,那么这一条报文的意思就是告诉服务器,“我计划使用10000端口做为监听的端口,个人IP地址是47.x.x.224,你能够来链接我了进行数据传输了”。orm

主动模式下的抓包

主动模式下的交互图

被动模式

而被动模式最显著地差异就是在于如何创建数据通道,主动模式下是服务端去链接客户端传输数据,而被动模式下,是客户端去发起链接,向服务器创建链接。

如下是一次被动模式下的交互,客户端为30.x.x.85,服务端为47.x.x.255。

能够看出最大的区别在于红框中的命令,这一次从PORT改成PASV,以后服务器回复一条被动模式的信息,其中一样是6个数字:IP地址+端口号(端口号的计算方法和主动模式中同样),只是这一次换作服务器告诉客户端,“你如今能够链接个人47.x.x.255的47185端口了”。

这里特别提示一下,从下面的抓包截图中能够看出服务器回复的PASV响应中IP地址并非上面提到的47.x.x.255,而是一个私网地址172.x.x.241,缘由咱们会在# 专有网络ECS内部署FTP Server #这一节中提到。

被动模式下的抓

被动模式出现的缘由

为什么会同时存在被动模式和主动模式呢?在互联网的初期,因为各个终端使用的都是标准的公网IP地址,彼此时间能够互相通讯,互相可见,因此在发起TCP链接时,无所谓是哪一方先发起。但随着互联网的高速发展,人们发现IP地址已经不够用了,进而诞生了NAT技术,这就在通讯的双方之间插入了一个中间人,在NAT设备以后的终端对于对方是不可见的,因此只能由它来发起链接。

因此为了迎合NAT技术,FTP协议里就出现了被动模式,并且因为目前大部分FTP客户端都是在NAT设备以后,因此绝大多数状况下只能使用被动模式(固然在一些特殊的架构里主动模式仍是有必定的用武之处,本文最后一节将会说起)

专有网络ECS内部署FTP Server

阿里云ECS的网络

目前阿里云ECS的网络类型有两种:经典网络与专有网络。对于经典网络的ECS来讲,系统内有两张网卡:eth0和eth1,eth0为内网网卡,eth1为外网网卡。在系统内内网和外网的IP地址是静态写在配置文件里的,系统内能够直接看到。而专有网络的ECS系统内只有一张网卡eth0,全部的流量都由这张网卡出入,系统内部没法看到ECS自身的公网IP/弹性公网IP。

这就直接致使了一个问题:因为目前的网络环境下大部分客户端都会使用被动模式来链接,可是被动模式下服务器须要告诉客户端链接的IP地址,而专有网络下的ECS没法直接看到外网IP,那么就致使FTP Server将本身的私网IP告诉了客户端,客户端收到了一个私网IP天然就没法进行链接。而list、文件传输都须要走FTP协议的数据通道,因此最终致使了专有网络下搭建的FTP Server没法让客户端正常的传输数据。

解决方案

解决办法也很简单:主动告知FTP Server程序系统的外网地址,因为市面上FTP Server众多,各家的设置方式不尽相同,如下说明几个常见的FTP服务器的设置方法:

  • vsftpd

在vsftpd的配置文件中,加入如下两行,其中替换为ECS的弹性公网地址:

listen_ipv6=NO
pasv_address=<EIP>
  • IIS

打开IIS,选择服务器(注意不要选择“网站”下的ftp站点),打开右侧的“防火墙支持”,在“防火墙的外部IP地址”其中填入ECS的弹性公网地址便可。

IIS配置被动模式下的公网IP1

IIS配置被动模式下的公网IP2

  • Serv-U(最新版本)

打开管理控制台,依次选择“域”-》[对应的域]-》“域详细信息”-》“监听器”-》21端口的监听器,点击“编辑”,将ECS的弹性公网地址填入弹出的对话框中

Serv-U配置被动模式的公网IP1

Serv-U配置被动模式的公网IP2

One more thing

在撰写本文时,我发现一些客户端彷佛已经提供了智能化的规避方案,如lftp提供如下参数,当出现相似的问题时会尝试使用控制通道的服务器IP地址进行数据通道的链接。

ftp:fix-pasv-address (boolean)
       if true, lftp will try to correct address returned by server for PASV command  in  case  when  server
       address  is  in  public network and PASV returns an address from a private network. In this case lftp
       would substitute server address instead of the one returned by PASV command, port number would not be
       changed.  Default is true.

另外,FileZilla也默认开启了修正被动模式下数据通道IP地址的功能:

FileZilla修复被动模式下的IP地址

FTP的端口与ECS的安全组

ECS的安全组

阿里云上的安全组至关于一个方向墙,相似iptables或Windows防火墙,能够根据协议、源/目的IP、源/目的端口来实现特定流量的放行、拦截。在# 被动模式和主动模式 #一节中咱们已经提到了FTP除了21端口之外,根据不一样的模式在数据通道下还会使用到特定的端口,因此须要在ECS的安全组中放行。

FTP端口的选择策略

关于FTP两种模式下的报文交互,前文已经作了阐述,但还未说明程序是如何选择端口的,下面简单说明一下:

  • 被动模式
- 控制通道 数据通道
客户端 主动链接服务器,随机选择本地源端口 主动链接服务器,随机选择本地源端口
服务端 被动接受客户端链接,本地默认监听21端口 被动接受客户端链接,本地随机监听端口

注:被动模式下服务端数据通道监听的端口理论上能够经过FTP程序的配置文件修改

  • 主动模式
- 控制通道 数据通道
客户端 主动链接服务器,随机选择本地源端口 等待服务器的连接,本地监听一个随机的端口(注)
服务端 被动接受客户端链接,本地默认监听21端口 主动连接客户端,随机选择本地源端口

注:主动模式下客户端数据通道监听的端口理论上能够经过FTP程序的配置文件修改

那么能够得出在ECS上部署FTP Server,若对于安全组有严格的进出限制,那么须要放行:

  1. 控制通道监听的端口,用来接收客户端的控制命令,默认为21端口
  2. 被动模式下建议指定一个端口范围,以便在安全组中能够放行;主动模式下因为安全组出方向是默认放行的,因此理论上不须要额外的配置

如何指定被动模式下服务器数据通道监听的端口

这里依然以常见的FTP程序为例:

  • vsftpd
    在配置文件里添加如下信息,其中端口的起止范围根据实际需求修改,而后重启vsftpd
pasv_enable=YES
pasv_min_port=10000
pasv_max_port=10020
  • IIS
    同上文提到的相似,在“FTP防火墙支持”中填入数据通道的端口范围便可

IIS下配置数据通道1

IIS下配置数据通道2

  • Serv-U
  1. 打开左侧“全局”菜单,选择“限制与设置”
  2. 选择右侧“设置”选项卡,页面拉到下方,能够看到“网络设置”中有一项“PASV端口范围”
  3. 根据实际状况填写便可

Serv-U设置被动模式下的数据通道监听端口1

Serv-U设置被动模式下的数据通道监听端口2

主动模式适用的场景

前文提到在一些特定的场景下,确实只能使用主动模式,好比说IDC和银行侧相连,银行出于安全考虑仅容许21端口入方向的流量,其他的端口都是封禁的,那么就没法使用被动模式,只能退而求其次使用主动模式。那么此时对于客户端的要求能够总结为下列几点:

  1. 客户端必须有本身的公网IP,如ECS 弹性公网IP,或者可使用阿里云NAT网关的DNAT功能,将公网IP的部分端口映射到ECS内部的端口上
  2. 客户端上强制使用主动模式(目前大部分客户端会优先使用被动模式)
  3. 因为主动模式下数据通道是由服务器发起链接,须要在ECS安全组中放行对应的端口
  4. 客户端系统内若没法直接看到公网IP(如专有网络下的ECS、DNAT模式下,依然须要对FTP客户端进行配置,告知客户端能够链接的公网IP地址)。

关于第2、3、四点,其实和被动模式下PASV命令的响应相似,都须要在程序中做相应的配置才行,但因为这个场景下这个需求确实比较小众,我只收集了少许的客户端配置方法,其余的客户端配置方法请和程序的提供商寻求技术支持。

配置主动模式的端口和公网IP地址

  • lftp
    lftp程序很是友好,在man手册中就已经说明了配置方法,依次是被动模式开关、主动模式下的IP地址、主动模式下数据通道监听的端口范围:
ftp:passive-mode (boolean)
       sets passive FTP mode. This can be useful if you are behind a firewall or a dumb masquerading router.
       In passive mode lftp uses PASV command, not the PORT command which is used in active mode. In passive
       mode  lftp itself makes the data connection to the server; in active mode the server connects to lftp
       for data transfer. Passive mode is the default.

ftp:port-ipv4 (ipv4 address)
       specifies an IPv4 address to send with PORT command. Default is empty which means to send the address
       of local end of control connection.

ftp:port-range (from-to)
       allowed  port  range  for  active  mode.  Format is min-max, or `full' or `any' to indicate any port.
       Default is `full'.
  • FileZilla
  1. 主动模式相关配置能够直接在菜单栏中的“编辑”-》“设置”中配置
  2. 客户端的链接行为能够在每一个FTP会话中单独配置

FileZilla主动模式配置1

FileZilla主动模式配置2

相关文章
相关标签/搜索