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 wlf 331 Please specify the password. PASS 123 230 Login successful. TYPE I 200 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)的更多相关文章
- Linux - xshell上传文件报错乱码
xshell上传文件报错乱码,解决方法 rz -be 回车 下载sz filename
- Azkban上传文件报错installation Failed.Error chunking
azkaban 上传文件报错Caused by: java.sql.SQLException: The size of BLOB/TEXT data inserted in one transacti ...
- Tomcat上传文件报错:returned a response status of 403 Forbidden
出现这样的错误是没有权限对服务器进行写操作.需要在这个项目所在的tomcat中配置可写操作即可: 在tomcat的web.xml添加下面代码: <init-param><param- ...
- rz上传文件报错:rpm Read Signature failed: sigh blob(1268): BAD, read returned 0
上传文件报错: [root@www localdisk]# rpm -ivh cobbler* error: cobbler-2.8.4-4.el7.x86_64.rpm: rpm Read Si ...
- SecureCRT sftp上传文件报错:put: failed to upload xxx 拒绝访问
1.问题 使用sftp上传文件时报错:put: failed to upload xxx 拒绝访问.类似下图所示: 2.原因 造成这个问题的原因可能有两个,一是要上到的那个目录剩余磁盘空间不足,二是打 ...
- IntelliJ cannot log in to GitHub上传github报错解决
重装系统,新装的Intellij IDEA上新建的项目上传github失败,报错: invalid authentication token ... 此处多为本地git用户的用户名/邮箱,与之前设置的 ...
- hadoop上传文件报错
19/06/06 16:09:26 INFO hdfs.DFSClient: Exception in createBlockOutputStream java.io.IOException: Bad ...
- 上传文件报错System.Net.ProtocolViolationException: 必须先将 ContentLength 字节写入请求流,然后再调用 [Begin]GetResponse。
在上传文件的时候报错. 错误: System.Net.ProtocolViolationException: 必须先将 ContentLength 字节写入请求流,然后再调用 [Begin]GetRe ...
- 关于IE9中webdiriver使用autoit上传文件报错
在ie9中, type="file"的元素是通过js打开的 webdirver结合autoit上传文件时,会报拒绝访问的错 sciTE编辑器中是这样写的: #include < ...
随机推荐
- [POI2006]MET-Subway
Description 给出一棵N个结点的树,选择L条路径,覆盖这些路径上的结点,使得被覆盖到的结点数最多. Input 第一行两个正整数N.L(2 <= N <= 1,000,000, ...
- 判断iframe页面是否是顶层页面
if (self!=top) { window.parent.location.reload();}
- Ext.grid.GridPanel数据转json
var count = docAdGrid.getStore().getCount(); var jsonArray = []; for (var i = 0; i < count; i++) ...
- 通过案例说明struts2的工作流程
本文主要是通过一个例子来说明Struts2的一个工作流程. 首先定义一个登录页面login.jsp: [java] view plaincopy <%@ page language=" ...
- JNI_Z_10_Java的数组
在Java中数组分为两种: (1).基本类型数组 (2).对象类型(Object[])的数组 (数组中存放的是指向Java对象中的引用) 一个能通用于两种不同类型数组的函数: GetArrayLeng ...
- showdoc.js代码
//页面加载完就执行 $(function(){ //自动根据url把当前菜单激活 var page_id = GetQueryString('page_id'); //如果中没有指定page_id, ...
- GO学习笔记:函数defer
Go语言中有种不错的设计,即延迟(defer)语句,你可以在函数中添加多个defer语句.当函数执行到最后时,这些defer语句会按照逆序执行,最后该函数返回.特别是当你在进行一些打开资源的操作时,遇 ...
- WPF 自定义依赖属性
原博客地址:http://www.cnblogs.com/DebugLZQ/archive/2012/11/30/2796021.html DependencyObject和Dependen ...
- flask学习(一):环境的安装
一. 安装python2.7 从python官网下载python2.7的版本 双击python2.7,然后选择安装路径,一直下一步就可以了 设置环境变量,把python和pip的安装路径添加到PATH ...
- JDBC相关总结
JDBC statement的相关总结 1.Statement.PreparedStatement和CallableStatement都是接口(interface). 2.Statement继承自Wr ...