Можно ли заблокировать пользователей Tor? - PullRequest
36 голосов
/ 20 марта 2012

Можно ли заблокировать пользователей Tor? (https://www.torproject.org/)

В связи с характером сайта, который я запускаю, я должен сделать все возможное, чтобы остановить несколько учетных записей и заблокировать определенные местоположения. Tor хуже прокси - кошмар ...

Ответы [ 12 ]

39 голосов
/ 25 марта 2012

Tor гораздо проще заблокировать, чем другие открытые прокси, так как список IP-адресов выхода известен и опубликован.Прочтите ответ по адресу https://www.torproject.org/docs/faq-abuse.html.en#Bans, и если вы все еще хотите заблокировать пользователям доступ к вашему сайту, вы можете использовать https://www.torproject.org/projects/tordnsel.html.en или инструмент экспорта списка массовых выходов.

Если вы используете инструмент экспорта списка массовых выходов, убедитесь, что вы часто получаете новый список и истекаете срок действия старых блоков, так как список IP-адресов меняется.

18 голосов
/ 06 апреля 2013

Блокировка Tor неверна, поскольку (ab) пользователи и IP-адреса не совпадают. Блокируя Tor, вы также блокируете законных пользователей и безвредные ограниченные узлы выхода Tor, настроенные с помощью консервативных политик выхода.

Например, если вы обеспокоены атаками на SSH (порт 22), то блокировка только Tor мало что изменит для повышения безопасности. Что вам действительно может понадобиться, так это динамический синхронизированный черный список типа http://denyhosts.sourceforge.net/, который отслеживает нарушителей независимо от их принадлежности к Tor.

Denyhosts автоматически блокирует выходные узлы Tor, которые позволяют Tor получать доступ к порту 22 без лишнего запрета доступа анонимным пользователям и операторам выходных узлов Tor, которые никогда не позволяют нарушителям атаковать ваши службы SSH.

7 голосов
/ 03 октября 2015

Проект Tor фактически предоставляет здесь свой список:

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

6 голосов
/ 05 ноября 2014

В .NET это возможно и просто. Я реализовал это на своем сайте.

Допустим, для вашего аргумента у вашего сайта есть внешний IP-адрес 192.168.0.5. Реальный TOR IP-адрес на момент публикации: 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

Разбивка

Обратный IP-адрес : 97.44.215.95
Порт : 80
Обратный IP-адрес : (IP-адрес вашего внешнего сайта)

Если адрес является TorExitNode, он вернет 127.0.0.2.

В своем файле Global.asax вы можете использовать Application_Start, чтобы проверить, возвращает ли IP-адрес значение true, а затем перенаправить их с вашего сайта:

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

Теперь, как только они попадают на ваш сайт, они перенаправляются с него.

У TOR есть список IP-адресов , но, очевидно, они постоянно меняются, поэтому использование моей функции будет лучшим способом, поскольку это всегда в режиме реального времени.

3 голосов
/ 30 октября 2017

Вы можете использовать службу TorDNSEL , чтобы выполнить оперативный запрос о том, является ли определенный IP-адрес узлом выхода Tor. Вы запрашиваете сервис через специально сформированный DNS-запрос.

Вот пример кода PHP, который выполняет поиск:

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!!!");
}

Важные замечания:

  • В этом примере поддерживаются только адреса IPv4, но не IPv6.

  • Получение ответа может занять несколько секунд, поэтому будьте осторожны с задержками при отображении вашего сайта.

2 голосов
/ 07 июля 2017

Здесь (см. https://github.com/RD17/DeTor) - простой API REST для определения, был ли сделан запрос из сети TOR или нет.

Запрос: curl -X GET http://detor.ambar.cloud/.

Ответ: { "sourceIp": "104.200.20.46", "destIp": "89.207.89.82", "destPort": "8080", "found": true }

В качестве бонуса вы можете добавить значок на свой сайт, чтобы определить, пришел ли пользователь из TOR или нет:

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

2 голосов
/ 04 декабря 2013

Это факт, что лучшая защита приложения - это его код и безопасность, а не блок-лист брандмауэра. Если для вас очень важно иметь настоящих настоящих пользователей - вы должны использовать двухфакторную аутентификацию . Блочные списки в настоящее время совершенно бесполезны.

1 голос
/ 07 августа 2017

Обнаружение трафика Tor довольно просто. Основным способом сделать это является наблюдение за списком выходных узлов Tor и сравнение IP со списком.

Мне недавно пришлось сделать такую ​​вещь, и я создал небольшой драгоценный камень Ruby, чтобы обновлять список выходных узлов и предоставлять простой способ обнаружения выходных узлов. Я также написал небольшой исполняемый файл, который вы можете использовать для обнаружения выходных узлов.

Драгоценный камень с открытым исходным кодом, его можно найти здесь: tor-guard

Установить камень достаточно просто:

$ gem install tor-guard

Использование библиотеки в вашем собственном коде Ruby может быть сделано следующим образом:

require 'tor-guard'

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

Исполняемый файл также прост в использовании:

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

1 голос
/ 21 июня 2017

(Это было написано для конкретного вопроса PHP, который впоследствии был удален и связан здесь как дубликат).

Отказ от ответственности: рассмотрите влияние блокировки всех пользователей Tor, как описано в лучшем ответе здесь. Рассмотрим только блокирующие функции, такие как регистрация, оплата, комментарии и т. Д., А не общий блок для всего.

-

Вот два чистых решения PHP. Первый загружает и кэширует список узлов Tor и сравнивает IP-адрес посетителя со списком. Второй использует проект * * Список DNS Tor, чтобы определить, использует ли посетитель Tor через поиск DNS.

Метод # 1 (Проверка IP по списку ретрансляторов Tor):

Используя следующий набор функций, мы можем определить, принадлежит ли IP к сети Tor, проверив его по динамическому списку , который загружается и кэшируется в течение 10 минут. Не стесняйтесь использовать этот список, но, по возможности, сохраняйте его в кэше на 10 минут.

Там, где вы хотите применить проверку Tor, вы можете просто использовать:

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

if ($isTorUser) {
    // blocking action
}

Вот код, который вы можете поместить в отдельный файл функций и включить, когда вы хотите выполнить проверку. Обратите внимание, что вы можете настроить некоторые из них, чтобы изменить путь к файлу кэша.

<?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://openinternet.io/tor/tor-node-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;
    }
}

Метод № 2 (Проверка IP по проекту Tor Exit List Exit List):

Проверка выхода DNS немного более надежна в том смысле, что она учитывает политику выхода ретранслятора и смотрит, к какому IP-адресу и порту на вашем сервере подключен клиент, и если такой трафик выхода разрешен, он вернет совпадение. , Потенциальным недостатком является то, что, если проект DNS временно не работает, запросы DNS могут зависнуть, прежде чем истечет время ожидания, что замедлит работу.

В этом примере я буду использовать класс из библиотеки, которую я написал и поддерживаю, с именем TorUtils .

Во-первых, вам нужно установить его с помощью Composer, используя composer require dapphp/torutils и включить в приложение стандартный код vendor/autoloader.php.

код для проверки: $ isTor = false;

try {
    // check for Tor using the remote (client IP), server IP, and server Port (e.g. 80, 443).
    $isTor = TorDNSEL::IpPort(
        $_SERVER['SERVER_ADDR'],
        $_SERVER['SERVER_PORT'],
        $_SERVER['REMOTE_ADDR']
    );
} catch (\Exception $ex) {
    // This would likely be a timeout, or possibly a malformed DNS response
    //echo $ex->getMessage() . "\n";
}

if ($isTor) {
    // blocking action
}

Дополнительные соображения

Если ваше приложение использует сеансы PHP, я настоятельно рекомендую кэшировать ответ "isTorUser" в сеанс (вместе с исходным IP-адресом) и запускать проверку только изначально или при изменении IP-адреса (например, $_SERVER['REMOTE_ADDR'] != $_SESSION['last_remote_addr']) как нет. выполнить многократный поиск. Даже при том, что они пытаются быть очень эффективными, это снова и снова тратить на один и тот же IP.

1 голос
/ 02 сентября 2013

Я нашел список всех узлов Tor, обновляемых каждые полчаса: https://www.dan.me.uk/tornodes

Это СЛЕДУЕТ включать в себя выход, записи и узлы моста, используемые для подключения и просмотра через Tor.

Используйте этот Perl-скрипт для сбора IP-адресов с загруженной веб-страницы:

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

Он выдаст вам список IP-адресов, по одному на строку.Я пытался найти что-то, что будет делать это без сценария Perl, но после многих часов поиска я не смог его найти.

Надеюсь, это поможет.

Я также нашел здесь несколько полезной информациитоже на том же сайте: https://www.dan.me.uk/dnsbl

...