使用 Meek Transport
Using Meek Transport
我正在尝试将 Meek 集成到 Android 应用程序中。这里有一个示例显示了如何实例化传输:
问题是我该怎么做。假设我有一个使用 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
我正在尝试将 Meek 集成到 Android 应用程序中。这里有一个示例显示了如何实例化传输:
问题是我该怎么做。假设我有一个使用 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