是否可以阻止Tor用户?

时间:2012-03-20 00:51:32

标签: tor

是否可以阻止Tor用户? (https://www.torproject.org/

由于我运行的网站的性质,我应该尽我所能阻止多个帐户并阻止某些位置。 Tor比代理更糟糕 - 一场噩梦......

15 个答案:

答案 0 :(得分:39)

Tor比其他开放代理更容易阻止,因为已知并发布了退出IP地址列表。阅读https://www.torproject.org/docs/faq-abuse.html.en#Bans上的答案,如果您仍想阻止用户访问您的网站,您可以使用https://www.torproject.org/projects/tordnsel.html.en或批量退出列表导出工具。

如果使用批量退出列表导出工具,请确保经常获取新的列表,并且因为IP地址列表发生变化,旧块将过期。

答案 1 :(得分:18)

阻止Tor是错误的,因为(ab)用户和IP地址不相同。通过阻止Tor,您还将阻止使用保守退出策略配置的合法用户和无害的受限Tor退出节点。

例如,如果您担心对SSH(端口22)的攻击,那么仅阻止Tor对提高安全性几乎没有作用。您真正需要的是动态同步黑名单,如http://denyhosts.sourceforge.net/,跟踪违规者无视他们与Tor的关系。

Denyhosts将自动阻止Tor退出节点,允许Tor访问端口22,而不会无端拒绝匿名用户和Tor出口节点的操作员访问,这些节点永远不会让违法者攻击您的SSH服务。

答案 2 :(得分:7)

The Tor Project实际上在这里提供了自己的列表:

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

答案 3 :(得分:6)

在.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 addresses的列表,但显然它们一直在变化,所以使用我的函数将是最好的方式,因为它总是实时的。

答案 4 :(得分:3)

事实上,最好的应用程序防御是它的代码和安全性,而不是防火墙阻止列表。如果拥有真正的真实用户是您必不可少的事情 - 您必须使用two-factor authentication。现在阻挡名单完全无用。

答案 5 :(得分:2)

Here(请参阅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" />

答案 6 :(得分:2)

您可以使用TorDNSEL service执行有关特定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。

  • 获得回复可能需要几秒钟,因此请注意在网站渲染中引入延迟。

答案 7 :(得分:1)

我找到了每半小时更新一次所有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

答案 8 :(得分:1)

(这是针对PHP特定问题编写的,后来被删除并在此处作为副本链接)。

免责声明:请考虑阻止所有Tor用户的影响,如最佳答案所示。只考虑阻止注册,付款,评论等功能,而不是对所有内容进行封锁。

-

这是两个纯PHP解决方案。首先下载并缓存Tor节点列表,并将访问者IP与列表进行比较。第二个使用Tor DNS Exit List项目来确定访问者是否通过DNS查找使用Tor。

方法#1(针对Tor中继列表检查IP):

使用以下一组功能,我们可以通过检查下载和缓存10分钟的动态list来确定IP是否属于Tor网络。请随意使用此列表,但请尽可能缓存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(针对Tor DNS退出列表项目检查IP):

DNS退出检查更加健壮,因为它考虑了中继的退出策略,并查看客户端连接到的服务器上的IP和端口,如果允许此类退出流量,则将返回一个匹配。潜在的垮台是,如果DNS项目暂时停止,DNS请求可能会在超时之前停止。

对于这个例子,我将使用我编写和维护的库中的一个类TorUtils

首先,您需要使用composer require dapphp/torutils在Composer中安装它,并在您的应用程序中包含标准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会话,我强烈建议缓存&#34; isTorUser&#34;响应进入会话(连同源IP)并且仅在最初或IP更改时(例如$_SERVER['REMOTE_ADDR'] != $_SESSION['last_remote_addr'])运行检查,以便不执行许多重复查找。尽管他们试图提高效率,但对于相同的IP来说,反复做是浪费。

答案 9 :(得分:1)

检测Tor流量非常简单。执行此操作的主要方法是监视Tor exit node list并将IP与列表进行比较。

我最近需要做这样的事情并构建一个小的Ruby gem来保持退出节点列表的最新状态,并提供一种检测出口节点的简单方法。我还写了一个可用于检测出口节点的小型可执行文件。

宝石是开源的,可以在这里找到:tor-guard

安装gem非常简单:

$ 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"

答案 10 :(得分:0)

由于tor项目发布了退出代理列表,因此可能会这样做。

退出代理列表可以直接从https://check.torproject.org/exit-addresses的项目中以空格分隔的文本格式下载。

我编写了一个python脚本,为所有退出节点添加iptables规则,拒绝来自它们的所有数据包。你可以在这里找到github上的脚本:https://github.com/vab/torblock

如果Tor项目决定停止发布退出节点列表,则可以阻止它们。只需编写代码即可连接到tor网络并发现出口节点。

答案 11 :(得分:0)

是的,实际上这是一个脚本,它将对您所有的Windows计算机都执行此操作。就像上面提到的其他操作一样,它就像阻塞所有出口节点一样简单,但这需要一点工作。

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

答案 12 :(得分:0)

我已经策划了tor节点和tor出口节点列表,这些列表会每小时更新一次。请参阅https://github.com/SecOps-Institute/Tor-IP-Addresses

您可以每小时进行一次git pull,以获取最新列表。

答案 13 :(得分:0)

由于TorDNSEL已被弃用并在Abril 2020 [1]中被新系统取代,因此该线程中的大多数答案都已过时。

经过一番争论之后,我想到了使用新检查器的代码。 id的作用是反转ip八位字节并为新检查程序创建URL,然后执行DNS请求并检查第一个答案是否具有“ 127.0.0.2” IP。如果是这种情况,则认为用户来自Tor,否则返回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:自从我发布了stackoverflow的答案以来已经有一段时间了,所以请耐心等待,并在可能的情况下帮助我改进。

答案 14 :(得分:0)

无论出于何种原因,我无法在此处找到另一个答案,截至目前(20 Shevat 5781(来自 Creation))具有此特定链接,所以这里是:

https://check.torproject.org/torbulkexitlist

我通过下载 Tor,然后打开一个查找我的 IP 地址的网站,然后导航到该 IP 地址(它恰好是 http://195.176.3.20/,如果您导航到它,您也应该找到列表),并导航到它....