Is it possible to block Tor users?
Asked Answered
H

15

42

Would it be possible to block Tor users? (https://www.torproject.org/)

Due to the nature of the site I run I should do all I can to stop multiple accounts and block certain locations. Tor is worse than proxies - a total nightmare...

Hudnut answered 20/3, 2012 at 0:51 Comment(0)
K
42

Tor is much easier to block than other open proxies since the list of exit IP addresses is known and published. Read the answer at https://www.torproject.org/docs/faq-abuse.html.en#Bans and if you still want to block users from accessing your site you could use https://www.torproject.org/projects/tordnsel.html.en or the Bulk Exit List exporting tool.

If you use the Bulk Exit List exporting tool be sure to get a fresh list often and expire the old blocks since the list of IP addresses change.

Kinshasa answered 25/3, 2012 at 14:55 Comment(8)
No matter how up-to-date your list is, Many exit nodes aren't even on that list isn't it?Blowing
@Blowing Why wouldn't they be?Tonettetoney
@SvenSlootweg, Is it possible to have an exit node that don't make it into that list?Blowing
@Blowing Not as far as I am aware, unless you run your own parallel Tor network (which kind of defeats the point). For a node to be taken into consideration when building circuits, it needs to be available in the node directory - and that is what those block lists are built from.Tonettetoney
@SvenSlootweg If you have a regular internet connection at home with a dynamic ip address (which can change each time you disconnect and reconnect) and run an exit node then you won't be on that list initially. Conversely, when my isp recycles the ip addresses and i end up with one which was previously used and which did end up on the list then i'd be pointlessly blocked, costing the site traffic. As time goes by, and more and more people run exit nodes you'll end up pointlessly blocking more and more people.Cytology
@Alex Of course. There's a reason I don't encourage people to block anything. There are often much better ways to deal with abuse, such as requiring moderator activation/confirmation from "high-risk" users.Tonettetoney
@DrEval, I've been running an analysis on the site I'm building and so far the number of TOR exit nodes legitimately visitng my site is ZERO. On the other hand, and at the very least, I'm paying for the wasted bandwidth to download my home page to every one of those visits (not to mention they're poking at every entry point I have on the site). TOR isn't a panacea, and it's as likely over time that as more and more legitimate sites block TOR users those users will have access to less and less opportunity.Ochs
TorDNSEL has been deprecated, this answer is no longer valid, source: lists.torproject.org/pipermail/tor-project/2020-March/…Greenleaf
S
21

Blocking Tor is wrong because (ab)users and IP addresses are not the same. By blocking Tor you will also block legitimate users and harmless restricted Tor exit nodes configured with conservative exit policies.

For example, if you concerned about attacks on SSH (port 22) then blocking only Tor will do little to increase security. What you really might need is dynamic synchronised blacklist like http://denyhosts.sourceforge.net/ that track offenders disregarding of their affiliation with Tor.

Denyhosts will automatically block Tor exit nodes that allow Tor to access port 22 without unnecessary denying access to anonymous users and operators of Tor exit nodes who never let offenders to attack your SSH services.

Stinkpot answered 6/4, 2013 at 7:37 Comment(3)
Apparently DenyHosts is dormant since 2008 so it is better to use actively maintained Fail2ban instead.Stinkpot
Your suggestions are for defending against breakers, not spoofers. The asker is asking how to stop cheaters from having multiple accounts.Blowing
That doesn't really answer the question being asked.Headlight
A
6

In .NET it's possible and simple. I have implemented it on my site.

Let's say your site has an external IP address of 192.168.0.5 for argument's sake. Real TOR IP address at the time of posting: 95.215.44.97

Imports System.Net
Imports System.Net.Sockets
Imports System.Web

Private Function IsTorExitNode(sIP As String) As Boolean

    ' Reverse your IP (97.44.215.95) then pass to the string, I have just created it as one for this example
    Try
        Dim strTor As String = "97.44.215.95.80.5.0.168.192.ip-port.exitlist.torproject.org"
        Dim host As IPHostEntry = Dns.GetHostEntry(strTor)

        If host.AddressList.Length = 0 Then
            Return False
        Else
            If host.AddressList(0).ToString() = "127.0.0.2" Then
                Return True
            Else
                Return False
            End If
        End If
    Catch ex As SocketException
        Return False
    End Try
End Function

Breakdown

Reversed IP address: 97.44.215.95
Port: 80
Reversed IP address: (your external site IP address)

If the address is a TorExitNode it will return 127.0.0.2.

In your Global.asax file, you can use the Application_Start to check if IP address returns true and then redirect them away from your site:

If IsTorExitNode("97.44.215.95") = True Then Response.Redirect("http://www.google.co.uk")

Now, as soon as they hit your site they are redirected away from it.

TOR has a list of IP addresses, but obviously they change all the time so using my function would be the best way as it's always real-time.

Assimilable answered 4/11, 2014 at 22:39 Comment(1)
TorDNSEL has been deprecated, this answer is no longer valid, source: lists.torproject.org/pipermail/tor-project/2020-March/…Greenleaf
D
6

The Tor Project actually provides its own list here:

https://check.torproject.org/exit-addresses

Distraught answered 3/10, 2015 at 1:34 Comment(0)
G
4

Since TorDNSEL was deprecated and replaced by a new system in april 2020 [1], most of the answers in this thread are outdated.

After a bit of wrangling I came up with this code that uses the new checker. What it does is it reverses the ip octets and creates a URL for the new checker, then performs a DNS request and checks wether or not the first answer has the "127.0.0.2" IP. If this is the case, the user is deemed to come from Tor, otherwise it returns false.

function IsTorExitPoint(){
    $dns_record = dns_get_record(ReverseIPOctets($_SERVER['REMOTE_ADDR']).".dnsel.torproject.org.");

    if ($dns_record && $dns_record[0] && $dns_record[0]["ip"] == "127.0.0.2") {
        return true;
    } else {
        return false;
    }
}
function ReverseIPOctets($inputip){
    $ipoc = explode(".",$inputip);
    return $ipoc[3].".".$ipoc[2].".".$ipoc[1].".".$ipoc[0];
}

[1] https://lists.torproject.org/pipermail/tor-project/2020-March/002759.html

PD: It's been a while since I've posted an answer to stackoverflow, so please bear with me and help me improve if possible.

Greenleaf answered 5/5, 2020 at 21:58 Comment(0)
B
3

You can use the TorDNSEL service to perform a live query about whether a specific IP address is a Tor exit node. You query the service via a specially-formed DNS request.

Here is some sample PHP code that performs the lookup:

function isTorExitNode() {
    $serverPort = $_SERVER['SERVER_PORT'];
    $remoteAddr = reverseIp(getClientIp());
    $serverAddr = reverseIp($_SERVER['SERVER_ADDR']);
    $placeholders = '%s.%s.%s.ip-port.exitlist.torproject.org';
    $name = sprintf($placeholders, $remoteAddr, $serverPort, $serverAddr);
    return ( gethostbyname($name) === '127.0.0.2' );
}

function getClientIp() {
    if (isset($_SERVER['HTTP_CF_CONNECTING_IP'])) {
        return $_SERVER['HTTP_CF_CONNECTING_IP'];
    }
    return $_SERVER['REMOTE_ADDR'];
}

function reverseIp($ip) {
    $ipParts = explode('.', $ip);
    return $ipParts[3] . '.' . $ipParts[2] . '.' .
           $ipParts[1] . '.' . $ipParts[0];
}

if (!isTorExitNode()) {
    // Do nothing
} else {
    Die("Sorry, You cannot use TOR network!!!");
}

Important Notes:

  • This example supports IPv4 addresses only, not IPv6.

  • It could take a couple of seconds to get a response, so be careful about introducing delays into your site rendering.

Barfuss answered 30/10, 2017 at 7:36 Comment(5)
Please, instead of only posting your code, always consider to describe what your code does and how to use it.Grahamgrahame
See torproject.org/projects/tordnsel.html.en for the contextMurine
@CemArslan - may want to check that the client is coming from IPv4 address, and not IPv6.Murine
I added some additional explanation to the code snippet to make it more useful. 🙂Vasos
TorDNSEL has been deprecated, this answer is no longer valid, source: lists.torproject.org/pipermail/tor-project/2020-March/…Greenleaf
G
2

It's a fact, that the best application defence is its code and security, not a firewall blocklist. If it's an essential matter for you to have real true users - you have to use two-factor authentication. Blocklists are totally useless nowadays.

Gazetteer answered 4/12, 2013 at 18:23 Comment(4)
Not sure why someone down-voted you, there is some merit to your answer, but it is too categorical. Of course, the code and its security is the first and best line of defense. But it does not hurt to implement defense in depth, especially if you have been exposed to the "quality" of some corporate code bases.Emend
I saw alot of code in my practice - and banning Tor users, making blacklists backfires on a website in a bad way. It blocks a normal users badly and in a hard way. Open your app, use IPS in-lined and look at user's behaviour. Firewalling is not effective any moreGazetteer
Look at your user's behavior is nice if you have 20. and 20 flows in your system. scale this, and this approach doesn't scale..Conger
Thus one must write code to analyze the traffic much as the users will write code to circumvent your analysis.Rectus
Y
2

(This was written for a PHP specific question that was subsequently deleted and linked here as a duplicate).

Disclaimer: Consider the impact of blocking all Tor users as raised in the best answer here. Consider only blocking functions such as registration, payment, comments etc and not a blanket block on everything.

--

Here are two pure PHP solutions. The first downloads and caches a Tor node list and compares the visitor IP against the list. The second uses the Tor DNS Exit List project to determine if the visitor is using Tor via DNS lookups.

Method #1 (Checking IP against a Tor relay list):

Using the following set of functions we can determine if an IP belongs to the Tor network by checking it against a dynamic exit list that gets downloaded and cached for 10 minutes. Feel free to use this list but please cache for 10 minutes when possible.

Where you want to enforce the Tor check, you can simply use:

$isTorUser = isTorUser($_SERVER['REMOTE_ADDR']);

if ($isTorUser) {
    // blocking action
}

Here is the code which you can put in a separate functions file and include when you want to run the check. Note, you may want to adjust some of it to change the path to the cache file.

<?php

function isTorUser($ip)
{
    $list = getTorExitList();

    if (arrayBinarySearch($ip, $list) !== false) {
        return true;
    } else {
        return false;
    }
}

function getTorExitList()
{
    $path = __DIR__ . '/tor-list.cache';

    if ( file_exists($path) && time() - filemtime($path) < 600 ) {
        $list = include $path;
        if ($list && is_array($list)) {
            return $list;
        }
    }
    
    $data = file('https://www2.openinternet.io/tor/tor-exit-list.txt');
    if (!$data) {
        return array();
    }

    $list = array();

    foreach($data as $line) {
        $line = trim($line);
        if ($line == '' || $line[0] == '#') continue;

        list($nick, $ip) = explode("\t", $line);
        $list[] = $ip;
    }

    sort($list);

    file_put_contents($path, sprintf("<?php return %s;", var_export($list, true)));

    return $list;
}

/**
 * Perform binary search of a sorted array.
 * Credit: http://php.net/manual/en/function.array-search.php#39115
 *
 * Tested by VigilanTor for accuracy and efficiency
 *
 * @param string $needle String to search for
 * @param array $haystack Array to search within
 * @return boolean|number false if not found, or index if found
 */
function arrayBinarySearch($needle, $haystack)
{
    $high = count($haystack);
    $low = 0;

    while ($high - $low > 1){
        $probe = ($high + $low) / 2;
        if ($haystack[$probe] < $needle){
            $low = $probe;
        } else{
            $high = $probe;
        }
    }

    if ($high == count($haystack) || $haystack[$high] != $needle) {
        return false;
    } else {
        return $high;
    }
}

Method #2 (Checking IP against the Tor DNS Exit List Project):

The DNS exit check is a bit more robust in that it takes into account the relay's exit policy and looks at what IP and port on your server the client is connecting to and if such exit traffic is permitted, it will return a match. The potential downfall is that if the DNS project is down temporarily, DNS requests can hang before timing out slowing things down.

For this example, I will use a class from a library I wrote and maintain called TorUtils.

First, you'll need to install it with Composer using composer require dapphp/torutils and include the standard vendor/autoloader.php code in your application.

The code for the check: $isTor = false;

try {
    // check for Tor using the remote (client IP)
    if (TorDNSEL::isTor($_SERVER['REMOTE_ADDR'])) {
        // do something special for Tor users
    } else {
        // not using Tor, educate them! :-D
    }
 } catch (\Exception $ex) {
     // This would likely be a timeout, or possibly a malformed DNS response
     error_log("Tor DNSEL query failed: " . $ex->getMessage());
 }

if ($isTor) {
    // blocking action
}

Additional Considerations

If your application uses PHP sessions, I'd highly suggest caching the "isTorUser" response into the session (along with the source IP) and only run the check initially or when the IP changes (e.g. $_SERVER['REMOTE_ADDR'] != $_SESSION['last_remote_addr']) as not to perform many duplicated lookups. Even though they try to be very efficient, it's a waste to do over and over for the same IP.

Yeld answered 21/6, 2017 at 15:52 Comment(2)
Using the Tor Relay list is not helpful for blocking Tor users. Only block from the Exit list. Relays are only used to connect to an exit node. By blocking IP addresses of users running Relay nodes you are blocking users who are only providing more bandwidth to the Tor network! Please consider allowing IP addresses of Tor Relays to function normally.Rowley
Hi @DaveParrish, Thanks for commenting. I have updated the answer to use an exit list that is combined from our data and Tor's exit list (they don't include IPv6 yet). I've also updated the TorDNSEL code since the API changed a couple months ago. Thanks again!Yeld
O
2

Here (see https://github.com/RD17/DeTor) is a simple REST API to determine whether a request was made from TOR network or not.

The request is: curl -X GET http://detor.ambar.cloud/.

The response is:

{ 
  "sourceIp": "104.200.20.46",
  "destIp": "89.207.89.82",
  "destPort": "8080",
  "found": true 
}

As a bonus you can add a badge to your site to detect whether a user comes from TOR or not:

<img src="http://detor.ambar.cloud/badge" />

Osorio answered 7/7, 2017 at 7:19 Comment(1)
this service doesn't seem to exist anymoreBun
T
1

I found a list of all the Tor nodes updated every half an hour: https://www.dan.me.uk/tornodes

This SHOULD include the exit, entries and bridge nodes used to connect and browse through Tor.

Use this Perl script to gather the IP addresses from a downloaded webpage:

perl -lne 'print $& if /(\d+\.){3}\d+/' downloadedwebpage.html > listofips.out

It will give you a list of IP addresses , one per line. I have tried to find something that will do this without the Perl script, but after many hours searching I could not find one.

I hope this helps.

I also found some good information here too on the same site: https://www.dan.me.uk/dnsbl

Tegan answered 2/9, 2013 at 19:23 Comment(1)
It's pointless to block non-exit tor nodes - all the visible traffic comes from the exits. (I can't check the format of that list because the operator blocks tor nodes from reading it - a very stupid move.)Hypnotist
E
1

Detecting Tor traffic is rather easy. The main way to do this is to monitor the Tor exit node list and compare the IP against the list.

I had the need to do such a thing recently and built a small Ruby gem to keep the list of exit nodes up to date and provide a simple way to detect exit nodes. I also wrote a small executable you can use to detect exit nodes.

The gem is open source and can be found here: tor-guard

Installing the gem is simple enough:

$ gem install tor-guard

Using the library in your own Ruby code can be done as follows:

require 'tor-guard'

if TorGuard.exit_node?('108.56.199.13')
    puts "Yep, it's an exit node!"
end

The executable is also easy to use:

$ tg 108.56.199.13 && echo "Yep, it's an exit node"

Eupepsia answered 7/8, 2017 at 6:56 Comment(0)
M
0

It is possible due to the tor project publishing a list of exit proxies.

The list of exit proxies can be downloaded directly from the project at https://check.torproject.org/exit-addresses in space delimited text form.

I have written a python script to add iptables rules for all exit nodes that reject all packets from them. You can find the script on github here: https://github.com/vab/torblock

If the Tor Project ever decides to stop publishing a list of exit nodes it will be possible to block them. Code would just need to be written to connect to the tor network and discover the exit nodes.

Microtome answered 26/12, 2016 at 23:11 Comment(0)
L
0

Yes, and in fact here is a script that will do it for all of your windows machines. Like others mentioned above, it's as simple as blocking all the exit nodes, but that takes a little work.

https://github.com/Austin-Src/BlockTor

Lecialecithin answered 15/5, 2019 at 22:33 Comment(0)
C
0

I have already curated the tor nodes and tor exit nodes list which keep updating hourly. Please refer to https://github.com/SecOps-Institute/Tor-IP-Addresses

You can do a git pull every hour and get the most updated list.

Commixture answered 12/12, 2019 at 8:47 Comment(0)
M
0

For whatever reason I wasn't able to find another answer on here, as of now (20 Shevat 5781 (from Creation)) that has this particular link, so here it is:

https://check.torproject.org/torbulkexitlist

I got it by downloading Tor, then opening up a find my IP address website, then navigating to that IP address (it happens to be http://195.176.3.20/, if you navigate to it you should find the list also), and navigating to it....

Meador answered 2/2, 2021 at 22:41 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.