Search code examples
pythontor

Multiple instances of tor.exe, each with own identity via python


I'm testing my own ddos protection feature implemented in my server (this is necessary). Currently I have a terrible loop for making multiple tor requests, each with it's own identity.

os.system("taskkill /f /im tor.exe")
os.startfile("C:/Tor/Browser/TorBrowser/Tor/tor.exe")

session = requests.session()
session.proxies = {}
session.proxies['http'] = 'socks5h://localhost:9050'
session.proxies['https'] = 'socks5h://localhost:9050'

Now I want to multithread this for faster speeds, since each tor connection takes ages to load.

If I google how to run multiple tor instances, I get info on how to do this from within the tor browser itself, never how to do it programmatically, Is there a way to do this on windows python3 specifically?

Any help appreciated


Solution

  • The key point to understand about running multiple separate Tor processes is that each one will need to listen on it's own ControlPort and SocksPort so that your clients can issue requests through each individual instance.

    If you use Stem, stem.process.launch_tor_with_config would be the recommended way to launch multiple Tor processes. By using this method, you can pass the necessary config options dynamically to each client without having to create individual files, and you'll have better process management over the Tor instances.

    If you want to use os, you will need to create one config file per instance and pass that to tor when you start it.

    At minimum, create one torrc config file for each instance you want to run with the following:

    torrc.1

    ControlPort 9800
    SocksPort 9801
    

    torrc.2

    ControlPort 9802
    SocksPort 9803
    

    Each individual client will connect on the different socks ports to issue requests.

    To start them, use:

    os.system("C:/Tor/Browser/TorBrowser/Tor/tor.exe -f C:/path/to/torrc.1")
    os.system("C:/Tor/Browser/TorBrowser/Tor/tor.exe -f C:/path/to/torrc.2")
    

    Then create one or more clients per instance:

    session1 = requests.session()
    session1.proxies = {}
    session1.proxies['http'] = 'socks5h://localhost:9801'
    session1.proxies['https'] = 'socks5h://localhost:9801'
    
    session2 = requests.session()
    session2.proxies = {}
    session2.proxies['http'] = 'socks5h://localhost:9803'
    session2.proxies['https'] = 'socks5h://localhost:9803'