如何通过使用Java的tor代理进行DNS查找?

时间:2013-07-29 08:04:07

标签: java proxy dns tor

正如标题所示,我目前正尝试通过代理解析主机名。

Tor正在专用服务器(192.168.1.15)上运行。获取网站没有问题,但如果我尝试获取主机的IP,Java仍然会直接查找并忽略代理。

我已经尝试过这种方式:

//Trying lib from: www.xbill.org/dnsjava
import org.xbill.DNS.*;
[...]
public void lookup(){
    //Lookup without proxy
    try {
        InetAddress addr = Address.getByName("stackoverflow.com");
        System.out.println(addr);
    } catch (UnknownHostException e) {
        e.printStackTrace();
    }

    //set socks v5 proxy
    //http://docs.oracle.com/javase/7/docs/api/java/net/doc-files/net-properties.html#Proxies
    System.setProperty("socksProxyHost", "192.168.1.15");
    System.setProperty("socksProxyPort", "9050");

    //trying to resolve with dnsjava
    try {
        Record [] records = new Lookup("stackoverflow.com", Type.A).run();
        for (Record record : records) {
            System.out.println(record);
        }
    } catch (TextParseException e) {
        e.printStackTrace();
    }

    //trying to resolve without lib
    try {
        System.out.println(InetAddress.getByName("stackoverflow.com"));
    } catch (UnknownHostException e) {
        e.printStackTrace();
    }
}

public void request(){
    InetSocketAddress torProxyAddress = new InetSocketAddress("192.168.1.15", 9050);
    Proxy torProxy = new Proxy(Proxy.Type.SOCKS, torProxyAddress);
    Socket underlying = new Socket(torProxy);

    InetSocketAddress unresolvedAdr = InetSocketAddress.createUnresolved("stackoverflow.com", 80);

    try {
        underlying.connect(unresolvedAdr);

        BufferedWriter out = new BufferedWriter( new OutputStreamWriter(underlying.getOutputStream()));
        BufferedReader in = new BufferedReader( new InputStreamReader(underlying.getInputStream()));

        out.write("GET / HTTP/1.1\nHost: stackoverflow.com\n\n");
        out.flush();
        String line;
        while((line = in.readLine()) != null){
            System.out.println(line);
        }
    } catch (IOException e) {

    } finally {
        try {
            underlying.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

如何强制Java通过tor代理进行查找?

1 个答案:

答案 0 :(得分:1)

通过Tor代理执行此操作非常困难,因为在不修改或实现自己的NetAddressNameService的情况下,无法通过Tor路由InetAddressNameservice。 正常nslookups通过端口53(UDP)完成,Tor目前只支持TCP。

因此,使用解决主机名的Tor方式,您需要实现自己的“Tor-client”,因为您需要发送RELAY_RESOLVE单元格(检查tor-spec.txt chapter 6.4

一个简单的选择是使用SilverTunnel-NG。 该库还使用Tor网络进行ns查找。