Apache Nifi SOCKS 代理设置

Posted

技术标签:

【中文标题】Apache Nifi SOCKS 代理设置【英文标题】:Apache Nifi SOCKS Proxy Setup 【发布时间】:2017-10-13 12:48:50 【问题描述】:

我尝试使用 Apache Nifi 访问 SFTP 源。处理器不包含代理设置。因此,我想在启动时提供代理详细信息作为 JVM 参数。

java.arg.16=-DsocksProxyHost="123.123.123.123"
java.arg.17=-DsocksProxyVersion=5
java.arg.18=-Djava.net.socks.username="MYUSERNAME"
java.arg.19=-Djava.net.socks.password="MYPASSWORD"
java.arg.20=-DsocksProxyPort=1080

这不起作用。我在 github 上的 nifi 代码中找不到显式使用代理的任何 jsch 实现 https://github.com/apache/nifi/search?utf8=%E2%9C%93&q=jsch&type=

问题是: Jsch 是否在内部使用提供参数?

【问题讨论】:

问题与 Nifi 无关:通过 JSch SFTP link 的参考实现,我可以验证是否提供参数会有所不同。我仍然收到身份验证失败异常。我已经检查了几次凭据,甚至还尝试了 -Duser.name="MYUSERNAME" 参数。具有上述属性的 System.getProperties 的实现在哪里? 【参考方案1】:

NiFi 使用的底层 SFTP 库 Jsch 有自己的代理实现,例如 com.jcraft.jsch.ProxySOCKS5。这些类似乎不使用系统属性,例如 -Duser.name。

相反,代理实例应从客户端应用程序代码手动传递,这需要更改 NiFi SFTP 相关处理器。如果以下示例看起来也适用于您的环境,那么我建议创建一个 JIRA 票证,以请求从 Apache NiFi JIRA 添加对 SFTP 处理器的代理支持。

我写了一个示例代码来确认 Jsch SFTP 客户端可以使用 SOCKS5 代理。以下代码有效:

import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Proxy;
import com.jcraft.jsch.ProxySOCKS5;
import com.jcraft.jsch.Session;
import org.junit.Test;

import java.util.Properties;
import java.util.Vector;

public class TestSFTPProxy 

    @Test
    public void test() throws Exception 
        final JSch jsch = new JSch();
        Session session = jsch.getSession("ftp-user", "ftp-server-host");
        final Properties properties = new Properties();
        properties.setProperty("StrictHostKeyChecking", "no");
        properties.setProperty("PreferredAuthentications", "publickey,password,keyboard-interactive");
        session.setConfig(properties);

        Proxy proxy = new ProxySOCKS5("proxy-host", proxy-port);
        proxy.setUserPasswd("proxy-user", "proxy-password");
        session.setProxy(proxy);

        session.setPassword("ftp-user-password");
        session.connect();

        ChannelSftp sftp = (ChannelSftp) session.openChannel("sftp");

        sftp.connect();
        System.out.println(sftp);

        Vector ls = sftp.ls("path");
        System.out.println(ls.get(0));

        sftp.disconnect();
        session.disconnect();
    


【讨论】:

issues.apache.org/jira/browse/NIFI-4175 已经有一张关于代理支持的票。我对此发表了评论,并希望也可以为 SFTP 实施 SOCKS 代理配置。

以上是关于Apache Nifi SOCKS 代理设置的主要内容,如果未能解决你的问题,请参考以下文章

NIFI Apache NiFI 使用技巧

怎样设置socks代理

怎样设置socks代理

手机浏览器如何设置socks5代理?

Apache HTTP 客户端 socks 代理

如何为chrome浏览器设置socks5代理?