Подтвердить что ты не робот

Можно ли заблокировать пользователей Tor?

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 4

В .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-адресов, но, очевидно, они все время меняются, поэтому использование моей функции было бы наилучшим способом, как и всегда в режиме реального времени.

Ответ 5

Вы можете использовать сервис 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.

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

Ответ 6

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

Ответ 7

Здесь (см. https://github.com/RD17/DeTor) - это простой REST API для определения того, был ли сделан запрос из сети 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" />

Ответ 8

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

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

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

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

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

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

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

Ответ 9

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

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

-

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

Способ № 1 (проверка IP-адреса в списке реле Tor):

Используя следующий набор функций, мы можем определить, принадлежит ли IP сети Tor, проверив его против динамического list, который загружается и кэшируется в течение 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 DNS):

Проверка выхода 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-адреса.

Ответ 10

Обнаружение трафика Tor довольно просто. Основной способ сделать это - контролировать Tor exit node list и сравнить IP с этим списком.

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

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

Установка драгоценного камня достаточно проста:

$ gem install tor-guard

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

require 'tor-guard'

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

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

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

Ответ 11

Возможно, из-за того, что проект tor опубликовал список выходных прокси.

Список выходных прокси можно загрузить непосредственно из проекта в https://check.torproject.org/exit-addresses в текстовой форме с разделителями в пространстве.

Я написал python script, чтобы добавить правила iptables для всех выходных узлов, которые отклоняют от них все пакеты. Вы можете найти script в github здесь: https://github.com/vab/torblock

Если Tor Project когда-либо решает прекратить публикацию списка выходных узлов, их можно будет заблокировать. Код просто нужно будет записать для подключения к сети tor и обнаружения выходных узлов.

Ответ 12

Да, и на самом деле вот скрипт, который сделает это для всех ваших машин с Windows. Как и другие, упомянутые выше, это так же просто, как блокировка всех выходных узлов, но это требует небольшой работы.

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