首页 > 技术文章 > ftp主动模式和被动模式区别以及把ftp映射到公网

oboth-zl 2022-01-10 18:32 原文

前言

FTP,File transfer Protocl即文件传输协议,是用于在网络中控制文件的双向传输的协议。通常FTP用默认21端口作为命令端口,根据FTP工作模式的不同,数据传输端口也存在差异。

FTP的工作模式

主动模式

如上图所示,在主动模式下,FTP客户端从任意端口5150(端口号>1023)发起一个FTP请求,并携带自己监听的端口号5151(发送的端口号+1=监听端口号);随后服务器返回确认,然后从服务器本地的20端口主动发起连接请求到客户端的监听端口5151,最后客户端返回确认。
这种模式缺点在于服务器带客户端的FTP连接很容易被传输过程中的路由器、防火墙所影响或拦截。

被动模式

为了主动模式所面临的服务器到客户端的连接会被拦截阻塞的问题,FTP发展出了被动模式。在被动模式中,命令连接和数据连接都由客户端来发起,这样就可以解决从服务器到客户端的数据端口的入方向连接被防火墙拦截的问题。

如上图所示,客户端用随机命令端口5150向服务器的21命令端口发送一个PASV请求,然后服务器返回数据端口3267,告诉客户端我在哪个端口监听数据连接。然后客户端向服务器的监听端口3268发起数据连接,最后服务器回复确认ok。

把FTP服务映射出去

从FTP的工作模式来说,如需把ftp服务映射出去需要FTP工作在被动模式(PASV)。

通过路由器映射

通过路由器映射比较简单,只需要把21端口映射到WAN口即可,当客户端需要连接服务端的数据端口时,路由器会自动把数据包路由到(应该是得益于路由器NAT设置内的ALG服务,具体暂未深究)服务端对应端口上。

通过frp映射

 如若通过frp这样的反向代理工具,除了需要把21端口映射出去还需要把相应的数据传输端口映射出去。

 首先在服务端限定被动模式下数据传输端口的范围,这里以vsftpd为例:

 然后在frp中映射出对用端口。

还需要在vsftp配置文件中增加pasv_promiscuous=YES,关闭PASV模式的安全检查。

pasv_promiscuous=YES

外网访问 提示返回了不可路由的服务器地址

至此就映射成功了,但你会发现只有在内网中通过映射出去的公网的地址能够成功访问,到外面还是访问失败。

这是因为,客户端去连接服务器的数据端口时还是以内网ip(比如192.168.x.x)去寻找的,从外网自然无法路由到。

配置文件中,可以通过增加 来指定被动模式回传的服务器IP地址。配置文件中,可以通过增加 来指定被动模式回传的服务器IP地址。

pasv_address=180.x.x.x

如果时动态ip的话,可以写成域名,并且配置文件增加 pasv_addr_resolve,且放在 pasv_address 前面:

pasv_addr_resolve=YES
pasv_address=www.xxx.cn

同时vsftp默认只监听的IPV6端口,所以若需pasv_address项目生效,还需在vsftpd.conf中开启IPV4端口的监听。

listen=YES
#listen_ipv6=YES

vsftp启动时提示cannot resolve host

这是因为域名无法解析到ip,通常是由于服务器未连接到互联网,无法通过DNS解析到IP。如果内网中有其他DNS服务器,手动填入dns服务器的地址即可。也可以用一台服务器来转发dns请求实现,这里我使用的是群晖(同时连接了内外网)的DNS转发服务。

 将内网的dns请求转发到dns服务商。

 同时手动指定DNS地址:

 现在重启vsftpd服务就不会报错,从外网访问也正常了,至此通过frp映射成功。

推荐阅读