[guardian-dev] PLUTO: Adding Pluggable Transports to any app

Nathan of Guardian nathan at guardianproject.info
Thu Feb 5 10:28:06 EST 2015


This is *very early* still, but thought I would share to get early
feedback. In short, we are looking at promoting the use of pluggable
transports like ObfsProxy and Meek for any app, and not just as part of
Tor. We think many apps could utilize this approach to defeat DPI
filtering, and that this would be useful to offer decoupled from the way
Tor integrates it. After all, Pluggable Transports are essentially just
a fancy kind of single-hop SOCKS proxy.

The code isn't operational yet, but there is simple build instructions
for cross-compiling ofbs4 and meek Go code into android compatible
executables.

https://github.com/guardianproject/pluto

What is PLUTO?

This repo is for library incarnation of PLUTO, providing a simplified
means for developers to include traffic obfuscation capabilities into
their applications. It supports the Obfs4 and Meek transports initially,
with others to come.

Design

The approach of this project is to provide a small bit of shim code that
any app can include that will provide the ability to discover, install
and manage pluggable transports for use with any app. The PTs themselves
will be packaged into user-installable Android Application Package (APK)
plugins, or bundled directly into an apps themselves.

Sample

//performs query of local app assets and installed APKs with proper
"PLUTO" category tag
List<PluggableTransport> pTrans = PlutoFactory.getAvailableTransports();

PluggableTransport pt = pTrans.get(0);

if (!pt.isInstalled())
{
    pt.requestInstall();
}
else
{
    if (pt.getName().equals("meek"))
    {
        String configString = "url=https://meek-reflect.appspot.com/
        front=www.google.com";
        pt.setConfig(configString);
    }
    else if (pt.getName().equals("obfs4"))
    {
        String configString = "obfs3 191.21.10.141:10223
        c6eda10edca8970b8a57617bf3b6e82bbecd287d"; 
        pt.setConfig(configString);
    }   

    boolean connected = pt.connect();

    if (connected)
    {
        //PTs generally expose themselve as local SOCKS proxies
        int socksPort = pt.getLocalSocksPort();
        myApp.setProxy(Type.SOCKS,socksPort);
    }
}

-- 
  Nathan of Guardian
  nathan at guardianproject.info


More information about the guardian-dev mailing list