首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android --如何让Tor服务使用套接字执行DNS解析?

Android --如何让Tor服务使用套接字执行DNS解析?
EN

Stack Overflow用户
提问于 2016-09-03 15:49:03
回答 2查看 1.4K关注 0票数 2

我想使用Java和SOCKS代理在Tor上连接(我使用Orbot,Tor服务运行在端口9050上)。

我发现了一个错误:

I/System.out: java.net.UnknownHostException:主机未解决: 3g2upl4pq6kufc4m.onion

我的代码如下:

代码语言:javascript
复制
// setup proxy
address = new InetSocketAddress('localhost', 9050);
proxy = new java.net.Proxy(java.net.Proxy.Type.SOCKS,address);
// setup socket
client = new Socket(proxy);
inet = new InetSocketAddress("3g2upl4pq6kufc4m.onion", 80);
// connect
client.connect(inet);

这是合法的,因为Android可能会通过网络配置中指定的DNS服务器执行DNS解析,而洋葱地址的解析将无法工作。

如何指定让Tor服务执行DNS解析(Tor通常将处理TCP数据包中的主机名)?

EN

回答 2

Stack Overflow用户

发布于 2017-01-18 00:37:35

正确的方法是使用InetSocketAddress.createUnresolved(...)方法,但这会在Android上引发异常。

作为一项工作,我们需要自己实现Socks,如:http://www.mit.edu/~foley/TinFoil/src/tinfoil/TorLib.java

这里有一个解释:https://github.com/acomminos/OnionKit/blob/master/libnetcipher/src/info/guardianproject/onionkit/proxy/SocksProxyClientConnOperator.java

基本上:

代码语言:javascript
复制
        socket = new Socket();
        socket.setSoTimeout(READ_TIMEOUT_MILLISECONDS);
        socket.connect(new InetSocketAddress(mProxyHost, mProxyPort), CONNECT_TIMEOUT_MILLISECONDS);

        DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream());
        outputStream.write((byte)0x04);
        outputStream.write((byte)0x01);
        outputStream.writeShort((short)port);
        outputStream.writeInt(0x01);
        outputStream.write((byte)0x00);
        outputStream.write(host.getBytes());
        outputStream.write((byte)0x00);

        DataInputStream inputStream = new DataInputStream(socket.getInputStream());
        if (inputStream.readByte() != (byte)0x00 || inputStream.readByte() != (byte)0x5a) {
            throw new IOException("SOCKS4a connect failed");
        }
        inputStream.readShort();
        inputStream.readInt();
        //socket is ready to use
票数 1
EN

Stack Overflow用户

发布于 2016-10-18 12:12:06

您应该将未解析的套接字传递给Orbot库。它应该像这样创建:

代码语言:javascript
复制
InetSocketAddress unresolvedRemote = InetSocketAddress.
createUnresolved(host.getHostName(), remoteAddress.getPort());

顺便说一句,如果您使用apache的httpClient,您可以找到一个示例这里

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39308705

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档