是否可以阻止Tor用户? (https://www.torproject.org/)
由于我运行的网站的性质,我应该尽我所能阻止多个帐户并阻止某些位置。 Tor比代理更糟糕 - 一场噩梦......
答案 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实际上在这里提供了自己的列表:
答案 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。
使用以下一组功能,我们可以通过检查下载和缓存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;
}
}
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计算机都执行此操作。就像上面提到的其他操作一样,它就像阻塞所有出口节点一样简单,但这需要一点工作。
答案 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/,如果您导航到它,您也应该找到列表),并导航到它....