昨天为了一个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)相关推荐

  1. Jenkins使用FTP上传文件报错问题处理

    Jenkins带有Publish over FTP插件,安装后并使用它就能实现FTP上传,可以用于构建后的发包操作.我们在系统管理中配置好FTP Servers后,并测试连接通过,按理在Job配置中用 ...

  2. ftp上传文件报错 Unexpected null reply received

    记一次ftp上传文件失败报错 ftp在上传文件时报错,报错信息如下: Caused by: java.io.IOException: Unexpected null reply receivedat ...

  3. FTP上传文件报错200 PORT command successful. Consider using PASV. 553 Could not create file.

    一.背景 最近搭好的在云主机上搭好了nginx,打算通过ftp上传一个静态的网页上去test一波,然后进去了ftp,在上面put了一下,结果没有看到想象中上传成功的样子,看到的是200 PORT co ...

  4. ftp上传文件报错“200 Type set tol.200 PORT command scesful.4MUM np for he Uicde hater eit inte onetmult”

    上传文件名是中文导致的 解决办法 文件名使用英文字符

  5. ajax上传文件报错The current request is not a multipart request的解决办法

    ajax上传文件报错The current request is not a multipart request的解决办法 主要报错语句为: The current request is not a ...

  6. Spring MVC实现上传文件报错解决方案

    Spring MVC实现上传文件报错解决方案 参考文章: (1)Spring MVC实现上传文件报错解决方案 (2)https://www.cnblogs.com/liuling/p/2014-3-5 ...

  7. openstack-Mitaka Glance上传镜像报错

    上传镜像报错 查看日志 tail /var/log/glance/api.log tail /var/log/glance/registry.log 查看2个服务的日志,哪个错了就对相应的配置文件进行 ...

  8. laravel上传文件报错:413 Request Entity Too Large

    上传图片的时候,是用laravel自带的上传图片的方法,一下气上传了20张,结果就无情报错: 413 Request Entity Too Large,后面查一下,这个报错信息是nginx报的错误,不 ...

  9. Linux - xshell上传文件报错乱码

    xshell上传文件报错乱码,解决方法 rz -be 回车 下载sz  filename 转载于:https://www.cnblogs.com/RzCong/p/8600899.html

  10. 上传文件报错500或者文件大于2M上传不上去解决方法

    上传文件报错500或者文件大于2M上传不上去解决方法 参考文章: (1)上传文件报错500或者文件大于2M上传不上去解决方法 (2)https://www.cnblogs.com/sillong/p/ ...

最新文章

  1. LeetCode--167--两数之和 II - 输入有序数组
  2. 【数理知识】《数值分析》李庆扬老师-第8章-矩阵特征值计算
  3. 为什么当前互联网+法律发展艰难?
  4. 微软Office Live Workspace测试版开放全球注册
  5. GridView合并表头多重表头无错完美版(以合并3列3行举例)
  6. Scikit-Learn (浅谈PCA降维算法)
  7. 怎么使用水经注万能地图下载器制作百度个性化地图-人造区域篇
  8. Ricequant米矿【MACD策略代码解释】量化交易
  9. 基于java在线问卷调查系统
  10. 22款奔驰C260L升级原厂360全景影像 倒车更加直观
  11. Tushare简单的数据使用以及mysql存储教程
  12. 少儿知识付费做好内容是关键
  13. qt QLabel设置行间距
  14. 清理android桌面
  15. lesson2--html-css基础主要知识点
  16. 使用nacos配置dubbo3
  17. UE4第一人称游戏 ——(3)添加准星
  18. 数据库基本概念(名词解释)中英版
  19. JAVA编写FCFS(先来先服务算法) 和 SJF(最短进程优先调度算法)
  20. 通过单反wifi同步照片到Android手机——使用Airnef Python脚本

热门文章

  1. 读书笔记《松本行弘的程序世界》
  2. 正定矩阵和半正定矩阵
  3. Servlet的生命周期
  4. 线性代数 第二章 矩阵 知识点总结(Jeff自我感悟)
  5. win10安装lr11
  6. 碧海威 L7多款产品 后台命令执行漏洞
  7. QTTabBar 汉化 给资源管理器添加标签、文件批量重命名依据扩展名选中等功能
  8. html 获取当前url,js获取当前页面url信息的方法
  9. 毕业设计——如何画系统功能结构图?
  10. 水电缴费系统php源码_php水电费缴费管理系统