昨天搭建了一台FTPS服务器,过程中学习了很多不清楚的知识点,还有遇到的问题,记录一下。

(大部分内容汇集、整理自网络)

一. 关于FTP传输模式

众所周知,FTP传输有两种工作模式,Active Mode和Passive Mode(主动模式和被动模式),简单描述连接过程如下:

  主动模式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。当需要传送数据时, 客户端在命令链路上用PORT命令告诉服务器:“我打开了***端口,你过来连接我”。于是服务器从20端口向客户端的***端口发送连接请求,建立一条数据链路来传送数据。

  被动模式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。当需要传送数据时, 服务器在命令链路上用PASV命令告诉客户端:“我打开了***端口,你过来连接我”。于是客户端向服务器的***端口发送连接请求,建立一条数据链路来传送数据。

了解模式的目的,是为了了解端口。使用 FTP 传输时,至少会使用到两个 Port 来建立连接通道:

  • 一个为指令通道(Command Channel),默认使用 Port 21 建立,用来传输 FTP 指令,例如:列出清单(LIST)、变更目录(CWD)、取得目前的目录(PWD)、......等。

  • 另一个为数据通道(DATA Channel),默认使用 Port 20,但是会因 FTP Client 选择使用的模式不同而有所不同。

二. 再次比较两种传输模式

  • 主动模式 ( Active mode )

FTP Client 跟 FTP Server 联机后,会主动利用 PORT 指令提出 DATA Channel 联机的要求,如下:

1
2
指令:PORT 10,18,53,171,17,114
回应:200 Port command successful.

这里的 PORT 指令是由 FTP Client 送出的,当需要建立 DATA Channel 时,FTP Server 会主动利用 Server 主机的 Port 20 发出联机到 FTP Client 的主机,而 PORT 指令后的参数说明如下:

前四个数字是 FTP Client 的 IP 地址:10.18.53.171

后两个数字是 FTP Client 接受联机的端口号,端口号的计算方式是 (第五个数字 * 256 + 第六个数字),以此范例来说,FTP Client 接受的联机端口号是 17 * 256 + 114 = 4,466

由此可知,如果 FTP Client 处于 NAT 的环境下的话,FTP Server 几乎无法正常的联机到 FTP Client 的主机,所以现在大部分的联机模式几乎都建议用户使用被动模式(Passive mode)。

  • 被动模式 ( Passive mode )

FTP Client 跟 FTP Server 联机后,会主动利用 PASV 指令提出 DATA Channel 联机的要求,如下:

1
2
指令:PASV
回应:227 Entering Passive Mode(59,37,124,43,158,251)

你可以看到由 FTP Client 送出的 PASV 指令并没有送出其他的参数,而是在 FTP Server 响应的时候出现了(59,37,124,43,158,251) 字符串,当需要建立 DATA Channel 时,这时就会由 FTP Client 主动连至 FTP Server 动态开放的 Port 供 FTP Client 连接,其中 (59,37,124,43,158,251) 的说明如下:

前四个数字是 FTP Server 的 IP 地址:59.37.124.43

后两个数字是 FTP Server 接受联机的端口号,端口号的计算方式是 (第五个数字 * 256 + 第六个数字),以此范例来说,FTP Server 可接受的联机端口号是 158 * 256 + 251 = 40,699

由此可知,使用被动模式(Passive mode)对 FTP Server 的系统管理员来说,可掌控的部分是比较多的,因为 FTP Server 无法决定用户是否可使用主动模式联机,但若改使用被动模式联机的话,就几乎能让所有人正常的使用。

需要注意的是FTP Client每次下指令传输数据时,都会建立一次 Data Connection,指令包括取得远程的档案清单(LIST)时回传的档案列表、下载文件、或上传档案。

三. FTPS  (FTP over SSL)

      SSL/TLS协议在传输层(TCP/IP)之上、但是在应用层之下工作的。因此,它可以很容易在诸如HTTP,Telnet,POP3,IMAP4,SMTP和FTP等应用层协议上实现。SSL安全扩展至少有两种不同的初始化方法:显式安全和隐式安全。
       显示安全:为了建立SSL连接,显式安全要求FTP客户端在和FTP服务器建立连接后发送一个特定的命令给FTP服务器。客户端使用服务器的缺省端口。 
       隐式安全: 当FTP客户端连接到FTP服务器时,隐式安全将会自动和SSL连接一起开始运行。在隐式安全中服务器定义了一个特定的端口(TCP端口990)让客户端来和其建立安全连接。        

当通过SSL/TLS来使用FTP时(缩写为FTPS),FTP客户端和FTP服务器之间的控制连接就被加密了,因此除了它们之外谁也不能读懂它们之间的控制连接的信息。正式因为这样,NAT/PAT设备和防火墙再也不能监控数据连接,并且从中得到有用的信息,从而再有针对性地做一些事情了(做些什么事呢?),所以FTPS协议在防火墙和NAT环境下的实际应用受到严重的限制。(见四.FTPS倒在防火墙上)

四.FTPS倒在防火墙上

我用的是Windows Server 2008 中IIS 7.0 配置FTP over SSL,配置好后,内网测试正常,然而从外网访问时,能验证用户名和密码,但报错:

读取目录列表失败

然而不使用SSL时从外网访问正常。

总结为:

  • 使用非 SSL 加密的 ftp 协议,可以正常登录,能够显示目录和文件列表

  • 使用 FTPS (即SSL加密)协议,可以正常登录。但是显示目录列表时,因为超时而失败

是什么原因呢?

肯定和防火墙有关系!!为什么使用非 SSL 加密的 ftp 协议一切正常呢?

这时需要学习下NAT设备转发的一些细节。

NAT的基本原理并不复杂,只是在网关设备上维护私网地址(端口)到公网地址(端口)的映射关系,通过修改流经网关的IP报文头部实现地址转换,但是在落实到具体的软件实现中,还是有很多的细节值得玩味的。

多数协议在经过NAT网关时只需要使用普通的NAT转换处理,但是对于一些特殊协议如FTP、RTSP、SIP等,由于这些协议在应用层中携带了IP地址或端口等信息,因此需要ALG的帮助才能正常穿越NAT网关。

以FTP协议为例,PORT模式的FTP在经过NAT时需要ALG的处理,因此NAT网关需要关注用户的每一个FTP命令,并识别需要进行ALG处理的命令,进行相应的ALG处理。

可以认为现在的NAT、防火墙一般都有FTP应用层感知能力,它能够截获ftp会话中的PORT、PASSIVE,自动将private的ip翻译成对外的正确的ip,并实时的在NAT上开放临时端口转发。

可见,使用SSL FTP后,数据包被加密了嘛,NAT设备无法识别到FTP命令,也就不会进行ALG处理,故无法建立数据通道连接。

五.解决方案

只有在防火墙上乖乖地配置NAT策略了,开启所有使用到的端口。又因为数据通道端口是随机的,所以必须先限定端口范围。

1. IIS 7.0 配置被动模式FTP Data Channel 端口段方法:http://netside.blog.51cto.com/766556/1359368

2. 在防火墙上配置这些端口的NAT Policy。

六. 还有些问题

我的环境中,如果在FTP Server上配置“防火墙外部IP”功能时(配置方法见附录4),在内部网络连接FTP会报错:

1
GnuTLS error-53:Error in the function.

取消这个设置,就恢复正常了,不知怎么解决,可能和使用自签署的证书有关吗。

但这样外网用户FTP客户端软件会遇到这样一条消息:

1
2
3
命令: PASV
响应: 227 Entering Passive Mode (*,*,*,*,7,230).
状态: 服务器发回了不可路由的地址。使用服务器地址代替。

    *,*,*,*为服务器的私有地址

“使用服务器地址代替 ”聪明的客户端软件能够自动替换地址。

但总觉得是个缺憾。

结束语

FTP协议是一个显得稍微有点凌乱的协议,并且没有任何为应用于防火墙环境中的特别设计。

FTP,FTPS,FTPS与防火墙的更多相关文章

  1. 浅谈 FTP、FTPS 与 SFTP

    无论是网盘还是云存储,上传都是一项很简单的操作.那些便捷好用的上传整理工具所用的 FTP 协议到底是什么意义,繁杂的模式又有何区别? 二狗子最近搭建了一个图片分享网站,每天都有好多人在他的网站上传许多 ...

  2. 一文详解 FTP、FTPS 与 SFTP 的原理

    开源Linux 长按二维码加关注~ 上一篇:2020年MySQL数据库面试题总结 无论是网盘还是云存储,上传都是一项很简单的操作.那些便捷好用的上传整理工具所用的 FTP 协议到底是什么意义,繁杂的模 ...

  3. 站长管理服务器必读:Ftp、Ftps与Sftp三兄弟的不同与区别以及部署全指引

    文章标题: 站长管理服务器必读:Ftp.Ftps与Sftp三兄弟的不同与区别以及部署全指引 关键字 : ftp,sftp,freesshd,ftps 文章分类: 教程 创建时间: 2020年3月23日 ...

  4. FTP、FTPS和SFTP

    FTP 一.两种传输方式 ASCII传输方式 假定用户正在拷贝的文件包含的简单ASCII码文本,如果在远程机器上运行的不是UNIX,当文件传输时ftp通常会自动地调整文件的内容以便于把文件解释成另外那 ...

  5. Ftp、Ftps与Sftp之间的区别

    Ftp FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议”.用于Internet上的控制文件的双向传输.同时,它也是一个应用程序(Applica ...

  6. FTP、FTPS、SFTP概览

    1. 基本概念 FTP:File Transfer Protocol FTPS:FTP over SSL.构建在SSL/TLS(Secure Socket Layer/Transport Layer ...

  7. centos7安装 ftp 组件与开放防火墙端口命令

    Linux 安装 ftp 组件 安装完后,有/etc/vsftpd/vsftpd.conf 文件,是 vsftp 的配置文件. 1.执行 yum -y install vsftpd 2. 添加一个 f ...

  8. FTP如何通过Windows防火墙

    将C:\Windows\SysWOW64\ftp.exe(64位系统)C:\Windows\system32\ftp.exe(32位系统)文件添加到防火墙的允许列表中即可. 注:“控制面板” -> ...

  9. Automatic WordPress Updates Using FTP/FTPS or SSH

    Introduction When working with WordPress in a more secure environment where websites are not entirel ...

随机推荐

  1. JNI_Z_04_属性的操作(非String类型的属性)

    1.步骤 : (1).获取 jclass (2).获取 类属性字段的id(最后一个参数是 属性字段 的签名) (3).获取/设置 类属性字段的值 ZC: 貌似 JNI里面 操作 类属性字段,完全是 无 ...

  2. spring3:对JDBC的支持 之 JDBC模板类

    7.2  JDBC模板类 7.2.1  概述 Spring JDBC抽象框架core包提供了JDBC模板类,其中JdbcTemplate是core包的核心类,所以其他模板类都是基于它封装完成的,JDB ...

  3. VS2015自带v120的Platform Toolset

    在VS2015安装组件时,勾选 “Windows 8.1 和 Windows Phone 8.0/8.1”下面的“工具和 Windows SDK”,将会安装Visual Studio 2013 (v1 ...

  4. YCSB benchmark测试cassandra性能——和web服务器测试性能结果类似

    转自:http://www.itdadao.com/articles/c15a531189p0.html http://www.cnblogs.com/bettersky/p/6158172.html ...

  5. ifconfig 修改IP

    ifconfig 查看IP sudo ifconfig eth0 192.168.1.118 sudo ifconfig eth0 down sudo ifconfig eth0 up ping (w ...

  6. iOS开发之最近开发遇到的问题总结

    1.Cannot create __weak reference in file using manual reference counting 解决办法: 点击工程-------->Build ...

  7. 旧书重温:0day2【11】第6章 狙击windows的异常处理

    昨晚经过一番努力,又把第六章的内容温习了一遍! 随手,做了一个实验!狙击windows的异常处理, 顺便也把过程记录了下来!省事!(有图) 今早,论坛一直无法打开! 就推迟到了现在! 哈哈 正题: 第 ...

  8. LeetCode — (1)

    摘要: Nim Game.WordPattern.Move zeros.First Bad version.Ugly Number五个算法的python实现. 一个月多没更新,大概是因为状态一直不太好 ...

  9. struts2逻辑视图类型汇总与解释(转)

    在struts2框架中,当action处理完之后,就应该向用户返回结果信息,该任务被分为两部分:结果类型和结果本身. 结果类型提供了返回给用户信息类型的实现细节.结果类型通常在Struts2中就已预定 ...

  10. The last packet sent successfully to the server was 0 milliseconds ago

    出现异常”The last packet sent successfully to the server was 0 milliseconds ago.“的大部分原因是由于数据库回收了连接,而系统的缓 ...