昨天为了一个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)的更多相关文章

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

    xshell上传文件报错乱码,解决方法 rz -be 回车 下载sz  filename

  2. Azkban上传文件报错installation Failed.Error chunking

    azkaban 上传文件报错Caused by: java.sql.SQLException: The size of BLOB/TEXT data inserted in one transacti ...

  3. Tomcat上传文件报错:returned a response status of 403 Forbidden

    出现这样的错误是没有权限对服务器进行写操作.需要在这个项目所在的tomcat中配置可写操作即可: 在tomcat的web.xml添加下面代码: <init-param><param- ...

  4. 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 ...

  5. SecureCRT sftp上传文件报错:put: failed to upload xxx 拒绝访问

    1.问题 使用sftp上传文件时报错:put: failed to upload xxx 拒绝访问.类似下图所示: 2.原因 造成这个问题的原因可能有两个,一是要上到的那个目录剩余磁盘空间不足,二是打 ...

  6. IntelliJ cannot log in to GitHub上传github报错解决

    重装系统,新装的Intellij IDEA上新建的项目上传github失败,报错: invalid authentication token ... 此处多为本地git用户的用户名/邮箱,与之前设置的 ...

  7. hadoop上传文件报错

    19/06/06 16:09:26 INFO hdfs.DFSClient: Exception in createBlockOutputStream java.io.IOException: Bad ...

  8. 上传文件报错System.Net.ProtocolViolationException: 必须先将 ContentLength 字节写入请求流,然后再调用 [Begin]GetResponse。

    在上传文件的时候报错. 错误: System.Net.ProtocolViolationException: 必须先将 ContentLength 字节写入请求流,然后再调用 [Begin]GetRe ...

  9. 关于IE9中webdiriver使用autoit上传文件报错

    在ie9中, type="file"的元素是通过js打开的 webdirver结合autoit上传文件时,会报拒绝访问的错 sciTE编辑器中是这样写的: #include < ...

随机推荐

  1. Spring Boot 设置启动时banner

    Spring Boot项目再启动的时候默认会在控制台输出一个字符banner图案,如下图: 我们可以通过下面的方法关闭启动时显示字符banner图案: 关闭banner方法一: public stat ...

  2. how to create an asp.net web api project in visual studio 2017

    https://docs.microsoft.com/en-us/aspnet/web-api/overview/getting-started-with-aspnet-web-api/tutoria ...

  3. openlayers2地图控件扩展:图例控件LegendControl

    因项目需要在地图中增加图例,以便专题地图查看或输出. 实现思路,折线和多边形图例直接由样式属性创建,多边形直接设置div的样式:折线通过创建svg,设置polyline的样式:点要素的图例比较复杂,目 ...

  4. Android的四种储存方式(SQLite、FileSystem、SDCardSystem、SharedPreferences)

    主要记录一下安卓中几种常用的存储方式的用法. 一.SQLite 1.创建SQLiteOpenHelper对象(当然SQLiteOpenHelper是抽象类,不能直接创建): 2.通过上面创建的对象调用 ...

  5. 监控系统信息模块psutil

    About psutil (python system and process utilities) is a cross-platform library for retrieving inform ...

  6. java 使用反射

    java程序中的对象在运行时会出现两种类型:编译时类型和运行时类型.例如List list  = new ArrayList().其中变量list的编译时类型是List,运行时类型是ArrayList ...

  7. Samba的安装配置使用

    ////////////////////////////////Samba//////////////////////////////////////////// 小常识:在同一局域网中,两个系统的工 ...

  8. cassandra 之 集群部署

    其实关于部署没啥好说的,修改config/cassandra.yaml以下几个地方就可以了 cluster_name: 'cluster_cassandra' data_file_directorie ...

  9. 缓存技术内部交流_01_Ehcache3简介

    参考资料: http://www.ehcache.org/documentation/3.2/getting-started.html http://www.ehcache.org/documenta ...

  10. app与后台的token、sessionId、RSA加密登录认证与安全解决方案

    一.登录机制 粗略地分析, 登录机制主要分为登录验证.登录保持.登出三个部分.登录验证是指客户端提供用户名和密码,向服务器提出登录请求,服务器判断客户端是否可以登录并向客户端确认. 登录认保持是指客户 ...