问题描述:最近的一个项目需要在公网搭建一个ftp服务器,同时开发的Java程序需要运行在另一台公网服务器上,开始时在本地开发机器上测试,连接公网的ftp服务器,上传文件都没有问题,等到把程序放到公网应用服务器(Linux系统)上跑时,发现能在ftp创建文件夹但上传文件失败。
查找问题:在应用服务器上执行"ftp -d xx.xx.xx.xx",-d是debug模式,输入用户名,密码登录成功后。
问题一:在ftp提示符后面输入ls命令提示:
ftp> ls
---> PORT zz,zz,zz,zz,216,68
500 I won't open a connection to zz.zz.zz.zz (only to yy.yy.yy.yy)
ftp: bind: Address already in use
其中ip地址yy是应用服务器的公网ip,zz是应用服务器是内网(eth0)的ip,--->是调试信息,表时连接zz的55364(216*256+68),经过度娘的指导,了解到ftp服务有两种模式:主动模式和被动模式。两种工作模式如下图(搬过来的):
主动模式通信步骤图:
简化后:
被动模式通信步骤图:
简化后:
出现上述问题的原因可能是应用服务器有防火墙,将服务器到客户端的连接阻塞,可以采用被动模式解决该问题。所以执行“passive”命令切换为被动模式:
ftp> passive
Passive mode on.
问题二:启动被动模式后,输入"ls"命令卡住不动,最终提示超时(timeout)
ftp> ls
---> PASV
227 Entering Passive Mode (nn,nn,nn,nn,127,135)
ftp: connect: Connection timed out
nn是ftp服务器的内网(eth0)ip,另外端口32647(127*256+135)也没有在虚拟云主机的入站策略中配置,也没有在防火墙配置ACCEPT,如何配置一个范围而不是全部端口区间?
首先再虚拟云主机后台编辑入站策略,加入开放端口的范围例如:39000-40000,然后执行iptables命令ACCEPT该端口范围。
方案一:发现pure-ftpd.conf文件中有PassivePortRange,ForcePassiveIP两个配置项被#注释掉了,似乎可以设置,放开注释并编辑对应的端口范围和ftp外网ip后,重启服务。
# Port range for passive connections - keep it as broad as possible.
PassivePortRange 39000 40000
# Force an IP address in PASV/EPSV/SPSV replies. - for NAT.
# Symbolic host names are also accepted for gateways with dynamic IP
# addresses.
ForcePassiveIP xx.xx.xx.xx
------发现没有效果,似乎没有生效。
方案二:在/etc/pure-ftpd/conf目录下创建PassivePortRange文件,写入端口范围;再创建ForcePassiveIP文件,写入ftp服务器的外网ip。
------可以正常访问了。
ftp> ls
---> PASV
227 Entering Passive Mode (xx,xx,xx,xx,154,61)
---> LIST
150 Accepted data connection
drwxr-xr-x 2 1001 xxx 4096 Mar 18 04:59 a
drwxr-xr-x 2 1001 xxx 4096 Mar 18 08:00 c
226-Options: -l
226 3 matches total
记录下来,以备遇到相同问题的小伙伴可以参考。
参考:
Active FTP vs. Passive FTP, a Definitive Explanationhttp://slacksite.com/other/ftp.htmlActive vs. Passive FTP Simplified: Understanding FTP Portshttps://www.jscape.com/blog/bid/80512/active-v-s-passive-ftp-simplifiedHow to set PassivePortRange and PassiveIP in pure-ftpd on Debian and Ubuntu Linuxhttps://www.faqforge.com/linux/controlpanels/ispconfig3/how-to-set-the-passiveportrange-in-pure-ftpd-on-debian-and-ubuntu-linux/