FTP NAT环境

       博主最近开发接口,需要和银行银行进行对接,博主公司服务器在非DMZ区,也就是NAT网络下,在运维兄弟的帮助下,进行了内外网的ip映射,成功打通了网络,其他的tcp协议,http协议接口测试都通过了,其中一个环节是向银行端FTP服务器上传文件,唯独这个不通,总是报socket connect time out错误,百思不得其解,经过大量的尝试后,几乎要放弃了。

       博主就这样百度谷歌了大量的资料,也没有找到问题所在,最后干脆看源码,一行行进行debug,最后发现,ftp在hostname在登录前和登录后是不同的,然后就自己研究了下ftp协议,原来ftp上传下载文件,的确不是一步完成的,首先登录,建立了初步连接,后续的操作都是新创建socket进行通讯的,后续的hostname是第一次访问后返回的实际ip地址,但是博主的服务器是在nat网络中,这样就会导致第二次之后的访问不通,出现超时现象。当然了,此时大家会说,将服务器部署在DMZ区域,使用公网访问不就完了,但是问题就是不可以这样做。博主开始在apchace官网上看commos-net的修改历史,最后还真的找到了解决方案,在最新的3.6版本中,有一条关于net-588的错误修改,就是为了解决博主的问题,具体的解决过程,大家可以到apache官网进行查询,地址如下:https://issues.apache.org/jira/browse/NET-588

       下面贴一下,具体的贴一下解决代码。

String ip = "10.37.195.3";
ftpClient.setPassiveNatWorkaroundStrategy(new FTPClient.HostnameResolver() {
    @Override
    public String resolve(String hostname) throws UnknownHostException {
          return ip;
    }
    
    private String ip;
    
    public HostnameResolver setIp(String ip) {
        this.ip = ip;
        return this;

    }
}.setIp(ip));

 代码具体的位置是在ftp登录完成之后,下载或者上传文件的之前。

猜你喜欢

转载自songfeng-123.iteye.com/blog/2387828
FTP
今日推荐