FtpServer穿透内网访问配置踩坑笔记
引言
FtpServer是服务器文件远程管理常用方式。
以前在局域网配置Ftp服务器以及使用公网上的Ftp服务均未碰到问题,固未对Ftp传输进行深入了解。
然而,最近在配置一台内网Ftp服务器提供外部访问服务时,却碰到了问题,折腾了几番,方才搞定。为了避免遗忘和提供他人借鉴,特此记录。
FTP配置应用踩坑
为了给一个台内网服务器上发布的Web应用提供远程维护,在同一台服务器上架设了Ftp服务器。
Ftp服务器采用的FileZille,使用的UTF-8编码版本。
采用的绿色版本,注册为Windows服务。
通过配置管理工具,配置了访问用户和访问目录及相关权限。相应配置采用默认设置。
按自己的经验,Ftp服务使用21端口和20端口,设置了服务器的防火墙策略,放行了TCP上的20、21端口。
在内网访问时,出现了能成功连接服务器,但列出文件目录失败,开启了本地防火墙,允许Ftp客户端通讯后,本地Ftp访问成功。
到此,以为Ftp配置成功。不料通过外网进行访问时,仍旧出现列出文件目录失败的情况。
经过上网查询研究,终于搞清Ftp服务通讯传输的机制,针对Ftp传输机制,配置服务器的被动模式支持使用固定的端口并在防火墙中放行,配置路由器Nat映射支持被动模式数据端口中(外网端口和内网端口需相同),Ftp客户端采用被动模式,问题解决。
FTP服务器模式
FTP协议采用TCP传输协议
主动模式:
客户端(自动分配端口N,N>1024)->连接服务器配置的命令端口(默认21)
连接成功后,客户端分配端口N+1做为本地数据传输端口
客户端开启TcpServer,侦听本地数据传输端口(通常N+1),
客户端通过命令连接通道,发送PORT协议,告诉服务器本地数据端口
服务器使用数据端口(默认20),连接客户端的数据通讯端口
此模式下,由于客户端数据连接端口不固定,难以处理网关和防火墙的拦截问题。
在客户端为NAT子网的情况下,服务器无法穿透客户端的网关设备连接到客户端。
在第1步中,客户端的命令端口与FTP服务器的命令端口建立连接,并发送命令“PORT 1027”。然后在第2步中,FTP服务器给客户端的命令端口返回一个"ACK"。在第3步中,FTP服务器发起一个从它自己的数据端口(20)到客户端先前指定的数据端口(1027)的连接,最后客户端在第4步中给服务器端返回一个"ACK"。
主动方式FTP的主要问题在于客户端。FTP的客户端并没有实际建立一个到服务器数据端口的连接,它只是简单的告诉服务器自己监听的端口号,服务器再回来连接客户端这个指定的端口。对于客户端的防火墙来说,这是从外部系统建立到内部客户端的连接,这是通常会被阻塞的。
被动模式:
为了解决服务器发起到客户的连接的问题,人们开发了一种不同的FTP连接方式。这就是所谓的被动方式,或者叫做PASV,当客户端通知服务器它处于被动模式时才启用。
在被动方式FTP中,命令连接和数据连接都由客户端发起,这样就可以解决从服务器到客户端的数据端口的入方向连接被防火墙过滤掉的问题。当开启一个FTP连接时,客户端打开两个任意的非特权本地端口(N >1024和N+1)。第一个端口连接服务器的21端口,但与主动方式的FTP不同,客户端不会提交PORT命令并允许服务器来回连它的数据端口,而是提交PASV命令。这样做的结果是服务器会开启一个任意的非特权端口(P > 1024),并发送PORT P命令给客户端。然后客户端发起从本地端口N+1到服务器的端口P的连接用来传送数据。
在第1步中,客户端的命令端口与服务器的命令端口建立连接,并发送命令“PASV”。然后在第2步中,服务器返回命令"PORT 2024",告诉客户端(服务器)用哪个端口侦听数据连接。在第3步中,客户端初始化一个从自己的数据端口到服务器端指定的数据端口的数据连接。最后服务器在第4 步中给客户端的数据端口返回一个"ACK"响应。
服务器被动模式端口配置
服务器端采用FileZilla Server(UTF-8编码版本)
在服务器被动模式设置中,将端口范围指定为一个端口,如上图3720-3720,也可以是一个范围。对路由器/防火墙中添加此端口的NAT映射和访问规则。
早期Ftp协议中,并未规定传输数据的编码格式,导致不同客户端工具和服务器通讯时,会出现目录/文件名乱码问题,后来为解决这个问题,扩展标准协议中,定义了客户端和服务端问询/确认编码格式的协议,用于解决此问题。
防火墙访问配置
外网端口映射配置
配置路由器上外网端口到FtpServer服务端口的映射。
两个端口,命令端口和数据传输端口。
本项目中,服务器命令端口使用的21,外网端口采用的3721(将外网3721映射到发布FTP服务器的21端口)
服务器数据端口使用的3720,外网端口采用的3720(此处两个端口必须相同,否则不能正常传输文件)
Ftp客户端配置
本项目中,使用的FtpClient工具为FileZilla,版本3.7.3(32bit)
在配置中选择传输模式为被动模式。
进行远程连接测试(需要外部网络电脑远程FTP访问),OK,打完收工。