【问题标题】:Is it possible to block Tor users?是否可以阻止 Tor 用户?
【发布时间】:2012-03-20 00:51:32
【问题描述】:

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

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

【问题讨论】:

    标签: tor


    【解决方案1】:

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

    经过一番争论后,我想出了这段使用新检查器的代码。它的作用是反转 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 的答案了,所以请多多包涵,并尽可能帮助我改进。

    【讨论】:

      【解决方案2】:

      (这是为一个 PHP 特定问题而编写的,该问题随后被删除并在此处作为副本链接)。

      免责声明:考虑在此处的最佳答案中提出的阻止所有 Tor 用户的影响。只考虑阻止功能,如注册、支付、cmets 等,而不是一揽子阻止一切。

      --

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

      方法#1(根据 Tor 中继列表检查 IP):

      使用以下一组函数,我们可以通过检查一个 IP 是否属于 Tor 网络,方法是检查它与下载并缓存 10 分钟的动态exit list。请随意使用此列表,但请尽可能缓存 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://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;
          }
      }
      

      方法#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)
          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
      }
      

      其他注意事项

      如果您的应用程序使用 PHP 会话,我强烈建议将“isTorUser”响应缓存到会话中(连同源 IP),并且仅在最初或 IP 更改时(例如 $_SERVER['REMOTE_ADDR'] != $_SESSION['last_remote_addr'])运行检查执行许多重复的查找。尽管他们试图非常高效,但为同一个 IP 一遍又一遍地做是一种浪费。

      【讨论】:

      • 使用 Tor 中继列表对阻止 Tor 用户没有帮助。仅从退出列表中阻止。中继仅用于连接到出口节点。通过阻止运行​​中继节点的用户的 IP 地址,您就是在阻止只为 Tor 网络提供更多带宽的用户!请考虑允许 Tor 中继的 IP 地址正常运行。
      • 嗨@DaveParrish,感谢您的评论。我已经更新了答案以使用从我们的数据和 Tor 的退出列表组合的退出列表(它们还不包括 IPv6)。自从几个月前 API 更改后,我还更新了 TorDNSEL 代码。再次感谢!
      【解决方案3】:

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

      如果您使用批量退出列表导出工具,请务必经常获取新列表并过期旧块,因为 IP 地址列表发生更改。

      【讨论】:

      • 不管你的列表有多最新,很多出口节点不在甚至在那个列表上不是吗?
      • @Pacerier 为什么不呢?
      • @Pacerier 据我所知,除非您运行自己的并行 Tor 网络(哪种方式不符合重点)。对于在构建电路时要考虑的节点,它需要在节点目录中可用 - 这就是构建这些块列表的依据。
      • @SvenSlootweg 如果您在家中使用动态 IP 地址(每次断开连接和重新连接时都会更改)并运行退出节点,那么您最初不会在该列表中.相反,当我的 isp 回收 ip 地址时,我最终得到了一个以前使用过的并且最终出现在列表中的地址,那么我将被毫无意义地阻止,从而导致网站流量损失。随着时间的推移,越来越多的人运行出口节点,你最终会毫无意义地阻止越来越多的人。
      • @Alex 当然。我不鼓励人们屏蔽任何东西是有原因的。通常有更好的方法来处理滥用行为,例如要求“高风险”用户激活/确认版主。
      【解决方案4】:

      您可以使用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。

      • 可能需要几秒钟才能获得响应,因此请小心在您的网站呈现中引入延迟。

      【讨论】:

      【解决方案5】:

      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:

      &lt;img src="http://detor.ambar.cloud/badge" /&gt;

      【讨论】:

      • 这个服务好像不存在了
      【解决方案6】:

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

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

      【讨论】:

        【解决方案7】:

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

        【讨论】:

        【解决方案8】:

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

        【讨论】:

        • 阻塞非出口节点是没有意义的——所有可见的流量都来自出口。 (我无法检查该列表的格式,因为操作员阻止了 tor 节点读取它 - 一个非常愚蠢的举动。)
        【解决方案9】:

        检测 Tor 流量相当容易。执行此操作的主要方法是监视Tor exit node list 并将IP 与列表进行比较。

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

        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 &amp;&amp; echo "Yep, it's an exit node"

        【讨论】:

          【解决方案10】:

          事实上,最好的应用程序防御是其代码和安全性,而不是防火墙阻止列表。如果拥有真正的用户对您来说至关重要 - 您必须使用two-factor authentication。如今,黑名单完全没用了。

          【讨论】:

          • 不知道为什么有人对你投了反对票,你的回答有一些优点,但它太明确了。当然,代码及其安全性是第一道防线,也是最好的防线。但实施深度防御并没有什么坏处,尤其是当您接触过一些公司代码库的“质量”时。
          • 我在实践中看到了很多代码——禁止 Tor 用户,使黑名单在网站上适得其反。它严重且困难地阻止了普通用户。打开您的应用程序,使用 IPS 内联并查看用户的行为。防火墙不再有效
          • 如果您的系统中有 20 个和 20 个流,请查看用户的行为。扩展这个,这种方法不能扩展..
          • 因此必须编写代码来分析流量,就像用户编写代码来规避您的分析一样。
          【解决方案11】:

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

          例如,如果您担心对 SSH(端口 22)的攻击,那么仅阻止 Tor 对提高安全性无济于事。你真正需要的是像http://denyhosts.sourceforge.net/ 这样的动态同步黑名单,它可以跟踪违规者,而不管他们与 Tor 的关系。

          Denyhosts 将自动阻止允许 Tor 访问端口 22 的 Tor 出口节点,而无需拒绝匿名用户和 Tor 出口节点的运营商的访问,这些用户和运营商从不让违规者攻击您的 SSH 服务。

          【讨论】:

          • 显然 DenyHosts 自 2008 年以来一直处于休眠状态,因此最好使用积极维护的 Fail2ban
          • 您的建议是为了防御破坏者,而不是欺骗者。提问者询问如何阻止作弊者拥有多个帐户。
          • 这并不能真正回答所提出的问题。
          【解决方案12】:

          这可能是由于 tor 项目发布了退出代理列表。

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

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

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

          【讨论】:

            【解决方案13】:

            是的,事实上这里有一个脚本可以为您的所有 Windows 机器执行此操作。就像上面提到的其他人一样,它就像阻塞所有出口节点一样简单,但这需要一些工作。

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

            【讨论】:

              【解决方案14】:

              我已经整理了每小时更新的 tor 节点和 tor 出口节点列表。请参考https://github.com/SecOps-Institute/Tor-IP-Addresses

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

              【讨论】:

                【解决方案15】:

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

                https://check.torproject.org/torbulkexitlist

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

                【讨论】:

                  猜你喜欢
                  • 2023-04-06
                  • 2021-05-07
                  • 2012-05-04
                  • 2013-12-05
                  • 1970-01-01
                  • 2011-12-27
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多