使用 Meek Transport

Using Meek Transport

我正在尝试将 Meek 集成到 Android 应用程序中。这里有一个示例显示了如何实例化传输:

https://github.com/guardianproject/AndroidPluggableTransports/blob/master/sample/src/main/java/info/pluggeabletransports/sample/SampleClientActivity.java

问题是我该怎么做。假设我有一个使用 OkHttp3 的应用程序。有没有办法协调两者并使用 OkHttp3 作为底层传输机制,而应用程序只与 Okhttp3 交互?

我对如何实例化传输以及每个选项的含义也很矛盾。在上面提供的 link 中,传输实例化如下:

private void initMeekTransport() {
    new MeekTransport().register();

    Properties options = new Properties();
    String remoteAddress = "185.152.65.180:9001";// a public Tor guard to test

    options.put(MeekTransport.OPTION_URL,"https://meek.azureedge.net/"); //the public Tor Meek endpoint
    options.put(MeekTransport.OPTION_FRONT, "ajax.aspnetcdn.com"); //the domain fronting address to use
    options.put(MeekTransport.OPTION_KEY, "97700DFE9F483596DDA6264C4D7DF7641E1E39CE"); //the key that is needed for this endpoint

    init(DispatchConstants.PT_TRANSPORTS_MEEK, remoteAddress, options);
}

但是,在 README (https://github.com/guardianproject/AndroidPluggableTransports) 中,建议的方法是:

Properties options = new Properties();
String bridgeAddress = "https://meek.actualdomain.com";
options.put(MeekTransport.OPTION_FRONT,"www.somefrontabledomain.com");
options.put(MeekTransport.OPTION_KEY,"18800CFE9F483596DDA6264C4D7DF7331E1E39CE");
init("meek", bridgeAddress, options);
Transport transport = Dispatcher.get().getTransport(this, PT_TRANSPORTS_MEEK, options);
if (transport != null)
{
        Connection conn = transport.connect(bridgeAddress);
        //now use the connection, either as a proxy, or to read and write bytes directly
        if (conn.getLocalAddress() != null && conn.getLocalPort() != -1)
            setSocksProxy (conn.getLocalAddress(), conn.getLocalPort());


        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        baos.write("GET https://somewebsite.org/TheProject.html HTTP/1.0".getBytes());
        conn.write(baos.toByteArray());

        byte[] buffer = new byte[1024*64];
        int read = conn.read(buffer,0,buffer.length);
        String response = new String(buffer);
}

在后一种方法中,桥接地址被传递给 init() 方法。在第一种方法中,它是传递给 init() 方法的远程地址,而桥接地址作为选项传递。这些方法中哪一种是正确的?

此外,如果您对 OPTION_URL、OPTION_FRONT 和 OPTION_KEY 提出一些意见,我将不胜感激。这些信息来自哪里?如果我不想使用这些默认信息,我该如何设置 "Meek endpoint" 例如不使用默认的 Tor 信息? CDN 上有什么特别需要做的吗?我将如何使用 Amazon 或 Google 而不是 aspnetcdn?

如你所见,我很困惑。

感谢您对此图书馆的兴趣。不幸的是,我们还没有正式发布,它还处于开发的早期阶段。

但是,我们认为我们仍然可以提供帮助。

首先,应该明确的是,支持域前端的主要云提供商(Google、亚马逊、Azure)现在非常反对。因此,您可能会发现使用这些平台中的任何一个都有一些限制,尤其是在您无法控制的前端域中。

您可以在此处了解 Tor 和 Signal 自己在这方面的斗争:https://signal.org/blog/looking-back-on-the-front/ and https://blog.torproject.org/domain-fronting-critical-open-web

现在,就是说,如果您仍然想继续使用域前端,而您所使用的只是 HTTP/S,那么您可以这样做,根本不需要使用 Meek。您只需将请求中的 "Host" header 设置为您要访问的实际域,而请求本身使用前端域。其实很简单。

您可以在此处阅读更多内容:https://www.bamsoftware.com/papers/fronting/#sec:introduction