Java und Tor

  • Wie verwendet man Tor, um HttpRequests durch das Tor-Netzwerk zu tunneln und das ganze in Java?
    Guten Abend,

    wenn man Bots entwickelt, steht man manchmal vor der Aufgabe, mehrfach die IP-Adresse zu wechseln.
    Das wird zum Problem, keine guten Proxys vorhanden sind. Eine einfache alternative zu Proxys ist es, den Datenverkehr durch das sogenannte Tor-Netzwerk zu tunneln.
    Wechselt man den Ausgangsknoten, so ändert sich in der Regel auch die IP-Adresse. Ein netter Nebeneffekt ist, dass das Tor-Netzwerk einen gewissen Grad der Anonymität liefert.

    In diesem Tutorial erkläre ich euch, wie ihr mit der Klasse TorController in Java einen Tor Process startet und wie ihr eure Requests durch das Tornetzwerk tunnelt.

    Da ich wenig in Java arbeite, entschuldigt bitte meinen schlechten Stiel.

    Ladet euch das Repo von hier runter:github.com/al-eax/torcontroller
    Importiert das Projekt "torcontroller" als Maven-Projekt in eure Entwicklungsumgebung, kompiliert es und bindet es ein.
    Oder importiert die Klassen einfach in euer Projekt.

    Anschließend müsst ihr Tor downloaden: torproject.org/projects/torbrowser.html.en
    Nach dem Entpacken/Installieren müsst ihr den Pfad zur Tor-Executable finden. Die befindet sich in der Regel unter:
    • Windows: Tor Browser\Browser\TorBrowser\Tor\tor.exe
    • Linux: tor-browser_en-US/Browser/TorBrowser/Tor/tor

    Tor starten

    Der ganze Pfad muss beim Erstellen eines TorControllers angegeben werden, um ihn anschließend zu starten:

    Java-Quellcode

    1. String executable = "/home/alex/tor-browser_en-US/Browser/TorBrowser/Tor/tor";
    2. TorController tor = new TorController(executable);
    3. tor.startUp()


    Im Hintergrund wird eine temporäre Config-Datei erstellt, der Tor-Prozess wird gestartet und eine TCP-Verbindung mit dem lokalen Kontrollserver wird herstestellt.
    Der lokale Socks-Server lauscht standartmäßig auf dem Port 9150.

    Wenn der Start erfolgreich vollzogen wurde, können Verbindungen durch das Netzwerk getunnelt werden. Je nach verwendetem Framework/Bib kann das mehr oder weniger leicht ausfallen. Das liegt daran, dass das Socks-Protokoll auf TCP-Ebene arbeitet und einige Frameworks eher Http-Proxys zulassen.
    Im Folgenden findet ihr vier gängige Methoden, um Requests durch Tor zu tunneln.

    URLConnection
    Diese Klasse kann einfach durch ein Objekt der Klasse java.net.Proxy getätigt werden:

    Java-Quellcode

    1. SocketAddress proxyAddr = new InetSocketAddress("127.0.0.1", 9150);
    2. Proxy proxy = new Proxy(Proxy.Type.SOCKS, proxyAddr);
    3. URLConnection connection = new URL("http://codebot.de").openConnection(proxy);
    4. ...

    Genaueres hier.

    JSoup
    JSoup bietet seit Version 1.9 eine Methode, um ein java.net.Proxy Objekt für die Requests zu spezifizieren. Genau wie im obigen Beispiel:

    Java-Quellcode

    1. SocketAddress proxyAddr = new InetSocketAddress("127.0.0.1", 9150);
    2. Proxy proxy = new Proxy(Proxy.Type.SOCKS, proxyAddr);
    3. Connection conn = Jsoup.connect("http://codebot.de").proxy(proxy );
    4. ...

    Genaueres hier.

    Selenium FireFoxDriver
    Beim Start des FireFoxDrivers lässt sich ein Profil spezifizieren. In diesem Profil kann unser lokaler Socks-Server eingetragen werden:

    Java-Quellcode

    1. FirefoxProfile profile = new FirefoxProfile();
    2. profile.setPreference("network.proxy.type", 1);
    3. profile.setPreference("network.proxy.socks", "127.0.0.1");
    4. profile.setPreference("network.proxy.socks_port", 9150);
    5. FirefoxDriver driver = new FirefoxDriver(profile);
    6. ...

    Genaueres hier.

    Apache HttpClient
    Leider scheint es recht aufwändig, einen Socks-Support für den HttpClient zu erstellen.
    Dieser Post auf Stackoverflow hat mir sehr dabei geholfen.
    ... wird bald vervollständigt
    Genaueres hier.

    Ip-Adresse wechseln
    Geht sehr einfach:

    Java-Quellcode

    1. tor.changeIdentity();


    Tor beenden
    Ebenfalls sehr einfach:

    Java-Quellcode

    1. tor.shutDown();


    Password und Ports setzen
    Tor bietet die Möglichkeit, ein Password für den Kontrollserver zu setzen. Das solltet ihr machen, wenn ihr keine Firewall habt, oder nicht wollt, dass andere Programme den von euch erstellen Tor-Prozess über die Kontrollschnittstelle steuern können. Das Password wird automatisch gehasht und anschließend in der Konfigdatei hinterlegt:

    Java-Quellcode

    1. tor.setPassword("Mb2.r5oHf-0t".toCharArray());

    Der TorController verwendet standartmäßig die Ports 9150 und 9151 für Socks- und Kontrollverbindungen.
    Beide Ports können jedoch im Konstruktor spezifiziert werden:

    Java-Quellcode

    1. int socksPort = 1337;
    2. int controlPort = 1338
    3. String executable = "/home/alex/tor-browser_en-US/Browser/TorBrowser/Tor/tor";
    4. TorController tor = new TorController(executable,socksPort,controlPort);


    Viel Spaß,
    Alex

    2.799 mal gelesen