FTP上传失败报错227 Entering Passive Model (222,111,8,111,10,40)
昨天为了一个ftp问题折腾了一天。问题背景:原来有个接口涉及到上传文件,服务端更换了ftp服务器,我们这边需要刷新连接服务端的ip和端口配置,代码没动。联调环境和验收环境都测试通过,一到生产环境就歇菜了。我们手工连接ftp并上传文件正常,就是跑接口由程序上传不行。根据日志信息定位发现在登录ftp后程序做了两个事情,一个是把传输模式设置为二进制,一个是设置被动模式,用apache的Ftpclient实现:
ftpClient.enterLocalPassiveMode();
从代码层面看不出问题,因为我们根本就没动,因此开始怀疑服务端配置问题,找他们确认后,他们的ftp服务器设置的就是被动模式。这里需要区别下主被动模式:主动模式下客户端通过命令端口(通常是21)连服务端后,服务端通过数据端口(通常是20)“主动”连接客户端;被动模式下客户端通过命令端口连接服务端后,服务端还是通过命令端口告诉客户端“我的XX数据端口可以连接,你过来吧”,于是客户端按该指定数据端口连接过去,服务端“被动”连接。命令端口就是传输ftp命令用的,数据端口就是上传下载文件用的。XX端口一般不固定且大于1024。既然服务端是被动模式,那么它会告知我们一个随机端口给我们去上传文件。服务端的命令端口是10000,开通了10001-10100作为数据端口。但现在不通,两边都说没问题,没办法,只能抓包:
220 "welcome to FOOBAR FTP service."USER wlf331 Please specify the password.PASS 123230 Login successful.TYPE I200 Switching to Binary mode.PASV 227 Entering Passive Mode (222,111,8,111,10,40)500 OOPS: vsf_sysutil_recv_peek: no data
让服务端改为主动模式重试,抓包结果一样。这说明只要我们程序里设置了客户端为被动模式,服务端无论初始设置是主动还是被动,都会按被动模式来进行,而问题很可能就出现在服务端再次发送过来的连接通道上,如果该通道对客户端不可达,那么必将导致客户端再次连接服务端上传文件失败。经确认,我们跟服务端之间是用内网连接的,登录时也是根据内网ip来的,从抓包看登录成功。而从报错的信息看,客户端设置了被动模式后服务端新建到客户端的连接使用的是经过NAT映射后的外网ip,就是上面那个222.111.8.111。客户端内网跟服务端外网网络是不通的,导致客户端到服务端新建的数据传输管道无法连通。
综上所述,问题的解决方案有三个:要么服务端把外网ip改为内网ip,要么客户端使用主动模式上传文件,要么开通客户端内网到服务端外网的网络策略。第一个方案服务端不同意,理由是他们还有其他客户端,需要统一提供外网;第二个方案我不知道能否开通内网到内网映射的外网的网络策略,有待确认;所以最终只能我们改代码,客户端不再设置被动模式,把上面那一行设置被动模式的代码注释掉就可以了,默认就是按主动模式来的。
FTP上传失败报错227 Entering Passive Model (222,111,8,111,10,40)相关推荐
- Jenkins使用FTP上传文件报错问题处理
Jenkins带有Publish over FTP插件,安装后并使用它就能实现FTP上传,可以用于构建后的发包操作.我们在系统管理中配置好FTP Servers后,并测试连接通过,按理在Job配置中用 ...
- ftp上传文件报错 Unexpected null reply received
记一次ftp上传文件失败报错 ftp在上传文件时报错,报错信息如下: Caused by: java.io.IOException: Unexpected null reply receivedat ...
- FTP上传文件报错200 PORT command successful. Consider using PASV. 553 Could not create file.
一.背景 最近搭好的在云主机上搭好了nginx,打算通过ftp上传一个静态的网页上去test一波,然后进去了ftp,在上面put了一下,结果没有看到想象中上传成功的样子,看到的是200 PORT co ...
- ftp上传文件报错“200 Type set tol.200 PORT command scesful.4MUM np for he Uicde hater eit inte onetmult”
上传文件名是中文导致的 解决办法 文件名使用英文字符
- ajax上传文件报错The current request is not a multipart request的解决办法
ajax上传文件报错The current request is not a multipart request的解决办法 主要报错语句为: The current request is not a ...
- Spring MVC实现上传文件报错解决方案
Spring MVC实现上传文件报错解决方案 参考文章: (1)Spring MVC实现上传文件报错解决方案 (2)https://www.cnblogs.com/liuling/p/2014-3-5 ...
- openstack-Mitaka Glance上传镜像报错
上传镜像报错 查看日志 tail /var/log/glance/api.log tail /var/log/glance/registry.log 查看2个服务的日志,哪个错了就对相应的配置文件进行 ...
- laravel上传文件报错:413 Request Entity Too Large
上传图片的时候,是用laravel自带的上传图片的方法,一下气上传了20张,结果就无情报错: 413 Request Entity Too Large,后面查一下,这个报错信息是nginx报的错误,不 ...
- Linux - xshell上传文件报错乱码
xshell上传文件报错乱码,解决方法 rz -be 回车 下载sz filename 转载于:https://www.cnblogs.com/RzCong/p/8600899.html
- 上传文件报错500或者文件大于2M上传不上去解决方法
上传文件报错500或者文件大于2M上传不上去解决方法 参考文章: (1)上传文件报错500或者文件大于2M上传不上去解决方法 (2)https://www.cnblogs.com/sillong/p/ ...
最新文章
- LeetCode--167--两数之和 II - 输入有序数组
- 【数理知识】《数值分析》李庆扬老师-第8章-矩阵特征值计算
- 为什么当前互联网+法律发展艰难?
- 微软Office Live Workspace测试版开放全球注册
- GridView合并表头多重表头无错完美版(以合并3列3行举例)
- Scikit-Learn (浅谈PCA降维算法)
- 怎么使用水经注万能地图下载器制作百度个性化地图-人造区域篇
- Ricequant米矿【MACD策略代码解释】量化交易
- 基于java在线问卷调查系统
- 22款奔驰C260L升级原厂360全景影像 倒车更加直观
- Tushare简单的数据使用以及mysql存储教程
- 少儿知识付费做好内容是关键
- qt QLabel设置行间距
- 清理android桌面
- lesson2--html-css基础主要知识点
- 使用nacos配置dubbo3
- UE4第一人称游戏 ——(3)添加准星
- 数据库基本概念(名词解释)中英版
- JAVA编写FCFS(先来先服务算法) 和 SJF(最短进程优先调度算法)
- 通过单反wifi同步照片到Android手机——使用Airnef Python脚本