【问题标题】:Forefront TMG vs java and php (ftp)Forefront TMG 与 java 和 php (ftp)
【发布时间】:2014-01-03 16:01:57
【问题描述】:

我有一台支持 ForeFront TMG 7.0 的计算机和一个公共远程 FTP 服务器。已安装 TMG 客户端。 Windows 防火墙已关闭。 防病毒:McAfee 病毒扫描 Enterprise (8.8) + AntySpyware Enterprise (8.8) + 无附加组件。 杀毒软件已开启和关闭测试。

无法通过 Java 和 Php 连接到服务器。 Filezilla、explorer.exe 和 Go 编写的程序连接没有问题。

对于 Java,我收到 ConnectionRefused 错误:

java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.connect0(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
    at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
    at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
    at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
    at java.net.PlainSocketImpl.connect(Unknown Source)
    at java.net.SocksSocketImpl.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at org.apache.commons.net.SocketClient.connect(SocketClient.java:182)
    at org.apache.commons.net.SocketClient.connect(SocketClient.java:203)

无论我如何尝试通过 Java 进行连接:

  • Apache FTP 客户端(主动/被动 - 本地/远程/两者)
  • Apache FTPS 客户端(所有变体主动|被动)
  • Sauron FTP 客户端(相同)
  • Socket socket = new Socket(host, 21);

有时它会在等待 5 分钟后导致连接超时。错误是超时异常。 所有变种都经过直接连接、全局代理、ftp 代理、http 代理以及所有这些组合的测试。 所有变体都通过 IP 和主机名进行测试。

也无法连接的php代码示例:

<?php

  $host = "ftphost";
  $connect = ftp_connect($host,21);
  if(!$connect)
  {
    echo("Error: $host");
    exit;
  }
  else
  {
    echo("Cheers: $host");  
  }

?>

但 FileZilla 连接没有问题。 Explorer 连接没有问题。 Go 编写的程序可以毫无问题地连接。

有什么可以阻止 java 和 PHP 的想法吗?如何找出阻止 JRE 和 Apache 的策略或程序设置?

【问题讨论】:

  • 有什么可以阻止 java 和 php 的想法吗?防火墙和许多其他东西(您的操作系统、网络、服务器、.. 不授予对不受信任软件的访问权限)。还有错误的配置,比如不使用系统代理。比较使用例如wireshark
  • 过去在tmg上遇到了一些问题,发现它可以通过ip阻止某些url,但不能在pc-name上,反之亦然。尝试使用它
  • 这不是站点阻止,因为 FileZilla 和其他人连接正常。
  • 据我所知,FTP 协议与客户端软件没有区别。
  • 了解被动/主动连接 (stackoverflow.com/questions/1699145/…) 也许这会有所帮助?

标签: java php sockets ftp firewall


【解决方案1】:

您可以尝试使用 PHP 脚本调试问题,如下所示:

<?php
$host = "xx.xx.xx.xx";
$ftpUser = "annonymous";
$ftpPass = null;
$checkPort = @fsockopen($host, 21, $errno, $errstr, 10);
if($checkPort!==false){
    echo "can able to connect ftp server";
    $conn_id = ftp_connect($host);
    if($conn_id!==false){
    echo "\n Ftp server available and connected trying to logged in";
        $loginStatus = ftp_login($conn_id, $ftpUser, $ftpPass);
        if($loginStatus!==false){
            echo "\n Connected to ftp";
        } else {
            echo "\n Please check credentials";
        }
    }
} else {
    echo "server can't reach to ftp server";
}
?>

【讨论】:

    【解决方案2】:

    只有我的两分钱。这是我的工作 Ftp 代码,我已经使用了两年了,主要问题是服务器端,如果您启用被动模式,那么您需要在防火墙中打开一系列被动端口,例如作为 2000:4000 保持连接不被破坏。此外,请确保您的 Ftp 服务器已针对这些被动端口进行了配置。 你可以在https://slacksite.com/other/ftp.html阅读更多内容

    import config.AppConfigPropertyReader;
            
            import model.FtpClients;
            import org.apache.commons.io.FileUtils;
            import org.apache.commons.net.ftp.FTP;
            import org.apache.commons.net.ftp.FTPReply;
            import org.apache.commons.net.ftp.FTPSClient;
            import org.apache.log4j.Logger;
            
            import java.io.File;
            import java.io.FileInputStream;
            import java.io.IOException;
            import java.io.InputStream;
            import java.util.ArrayList;
            import java.util.List;
            
            public class ConnectRemote {
            
                private static Logger logger = Logger.getLogger(ConnectRemote.class);
                private static String RemoteFtpLogServerHost = AppConfigPropertyReader.getProperty("RemoteFtpLogServerHost");
                private static String RemoteFtpLogServerTomcatLog = AppConfigPropertyReader.getProperty("RemoteFtpLogServerTomcatLog");
                private static String RemoteFtpLogServerTomcatLogPassword = AppConfigPropertyReader.getProperty("RemoteFtpLogServerTomcatLogPassword");
                private static String LocalTomcatSistemLogPath = AppConfigPropertyReader.getProperty("LocalTomcatSistemLogPath");
            
            
                public static void starttransfers() {
            
                    List<FtpClients> ftpuserlist = new ArrayList<FtpClients>();
            
                    ftpuserlist.add(new FtpClients(RemoteFtpLogServerTomcatLogPassword, RemoteFtpLogServerTomcatLog, LocalTomcatSistemLogPath));
            
                    for (FtpClients ftpuser : ftpuserlist) {
            
                        try {
            
                            ftps = new FTPSClient();
                            //ftps.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.out)));
                          
                            ftps.connect(RemoteFtpLogServerHost, 21);
                            int reply = ftps.getReplyCode();
                            if (!FTPReply.isPositiveCompletion(reply)) {
                                ftps.disconnect();
                                throw new IOException("Exception in connecting to FTPS Server");
                            }
                            if (ftps.login(ftpuser.getUser(), ftpuser.getPassword())) {
            
                                ftps.execPBSZ(0);
                                //ftps.execPROT("P"); You have to use reuse ssl enabled ftp server
                                ftps.setBufferSize(1024000);
                                ftps.changeWorkingDirectory("/");
                                ftps.setFileType(FTP.BINARY_FILE_TYPE);
                                ftps.setFileTransferMode(FTP.COMPRESSED_TRANSFER_MODE);
                                ftps.enterLocalPassiveMode();
                                ftps.setControlKeepAliveTimeout(300);
                                
                                //do your logic 
            
                                if (ftps.isConnected()) {
                                    try {
                                        ftps.logout();
                                        ftps.disconnect();
                                        ftps = null;
                                        ftpuserlist.clear();
            
                                    } catch (IOException e) {
                                        logger.error("Ftps Client Closing " + e.getMessage());
                                    }
                                }
            
                            } else {
            
                                logger.error("Cannot Login to Remote Ftps Server");
            
                            }
            
            
                        } catch (Exception e) {
            
                            e.printStackTrace();
                            logger.error("Exception" + e.getMessage());
            
            
                        }
            
            
                    }
            
            
                }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多