FTP上传失败报错227 Entering Passive Model (222,111,8,111,10,40)

昨天为了一个ftp问题折腾了一天。问题背景:原来有个接口涉及到上传文件,服务端更换了ftp服务器,我们这边需要刷新连接服务端的ip和端口配置,代码没动。联调环境和验收环境都测试通过,一到生产环境就歇菜了。我们手工连接ftp并上传文件正常,就是跑接口由程序上传不行。根据日志信息定位发现在登录ftp后做了两个事情,一个是把传输模式设置为二进制,一个是设置被动模式,用apache的Ftpclient实现:

ftpClient.enterLocalPassiveMode();

从代码层面看不出问题,因为我们根本就没动,因此开始怀疑服务端配置问题,找他们确认后,他们的ftp服务器设置的就是被动模式。这里需要区别下主被动模式:主动模式下客户端连服务端后,服务端通过数据端口“主动”连接客户端;被动模式下客户端连接服务端后,服务端命令端口告诉客户端“我的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,要么客户端使用主动模式上传文件,要么开通客户端内网到服务端外网的网络策略。第一个方案服务端不同意,理由是他们还有其他客户端,需要提供外网;第二个方案我不知道能否开通内网到内网映射的外网的网络策略,有待确认;所以最终只能我们改代码,客户端不再设置被动模式,把上面那一行设置被动模式的代码注释掉就可以了。

时间: 2024-10-12 16:14:03

FTP上传失败报错227 Entering Passive Model (222,111,8,111,10,40)的相关文章

ftp上传文件报错:Failure writing to local file

原文参考: https://blog.csdn.net/stevendbaguo/article/details/52942594 https://www.cnblogs.com/linuxde/p/8719469.html https://blog.csdn.net/zqtsx/article/details/24383755 在使用ftp过程中遇到的一个问题,ftp界面报错:451  Failure writing to local file 和 227 Entering Passive M

Flex和Servlet结合上传文件报错(一)

1.具体错误如下 一个表单域 不是一个表单域 java.io.FileNotFoundException: D:\MyEclipse\workspace\FlexFileUpload\Web\null\鏂板缓 Microsoft Word 鏂囨..docx (系统找不到指定的路径.) at java.io.FileOutputStream.open(Native Method) at java.io.FileOutputStream.<init>(FileOutputStream.java:1

Flex和Servlet结合上传文件报错(二)

1.具体报错如下 一个表单域 不是一个表单域 java.io.FileNotFoundException: D:\MyEclipse\workspace\FlexFileUpload\Web\uploadFolder\鏌卞舰鍥?xls (文件名.目录名或卷标语法不正确.) at java.io.FileOutputStream.open(Native Method) at java.io.FileOutputStream.<init>(FileOutputStream.java:179) at

jS Ajax 上传文件报错&quot;Uncaught TypeError: Illegal invocation&quot;

jS Ajax 上传文件报错"Uncaught TypeError: Illegal invocation" query-3.1.1.min.js:4 Uncaught TypeError: Illegal invocation 错误原因: jQuery Ajax 上传文件处理方式, 使用ajax向后台发送数据时其中的图片数据的参数类型为file,属于对象,而不是一个字符串值.导致错误的出现 var formData = new FormData(); formData.append(

selinux导致ftp上传失败 工作中的真实案例

这是一台squid代理服务器(一台式机,安装的是redhat 5.4 64位操作系统),每天下午4点一台服务器通过ftp上传主机数据库巡检报告到这台代理PC机的一个用户家目录下的xunjian目录下,这台PC再通过发送邮件的方式将巡检报告发给组内成员,进行巡检 此为背景,之前的selinux设置的为Permissive,不料同事中午睡觉的时候,脚这么一碰,将这台代理PC重启了,重启后,连续2天的巡检报告都没有通过邮件收到,赶紧解决吧 1.手动的执行ftp上传动作,报如下错误:553 Could

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

在ie9中, type="file"的元素是通过js打开的 webdirver结合autoit上传文件时,会报拒绝访问的错 sciTE编辑器中是这样写的: #include <Constants.au3> Sleep(5000) ControlFocus("选择要加载的文件", "","Edit1") ControlSetText("选择要加载的文件", "", "

PHP1.0版本上传OSS报错,仿照2.0版本传入的居然是句柄

代码如下:          $oss_sdk_service = new ALIOSS();              $oss_sdk_service->set_debug_mode(FALSE);                           $bucket = 'xxxx';          $object = 'oss-file-name-'.time().'.jpg';                       $pathFile = "C:/1.jpg";

Ajax方式上传文件报错&quot;Uncaught TypeError: Illegal invocation&quot;

今天使用ajax上传文件时,出现了错误.数据传输的方式是通过定义formData完成的,提交的文件对象也设置为dom对象,但是还是不能发送请求.F12看到后台报了个错误:Uncaught TypeError: Illegal invocation,百度了一下,找到了解决方法. 解决方法:在ajax请求的参数中添加如下两个参数: $.ajax({ ..., processData: false, contentType: false, ... }); processData 类型:Boolean

PHP7 上传文件报错 Internal Server Error解决方法

上传文件的时候总是提示Internal Server Error错误.错误如下: Internal Server Error 检查Apache的错误日志.Apache/logs/error_log 错误信息为 mod_fcgid: HTTP request length 139072 (so far) exceeds MaxRequestLen (131072) 该错误是上传文件过大,需要修改Apache 和PHP的配置文件的upload上传文件大小 修改您的php.ini内 upload_ma