web-dev-qa-db-ja.com

Torユーザーをブロックすることは可能ですか?

Torユーザーをブロックすることは可能でしょうか? ( https://www.torproject.org/

私が運営するサイトの性質上、複数のアカウントを停止し、特定の場所をブロックするためにできる限りのことをする必要があります。 Torはプロキシよりも悪い-悪夢...

37
domino

Torは、出口IPアドレスのリストが既知で公開されているため、他のオープンプロキシよりもブロックがはるかに簡単です。 https://www.torproject.org/docs/faq-abuse.html.en#Bans で回答を読んで、ユーザーがサイトへのアクセスをブロックしたい場合は、使用できます https://www.torproject.org/projects/tordnsel.html.en または一括終了リストエクスポートツール。

一括終了リストエクスポートツールを使用する場合は、IPアドレスのリストが変更されるため、頻繁に新しいリストを取得し、古いブロックを期限切れにしてください。

39
Johan Nilsson

(ab)usersとIPアドレスが同じではないため、Torのブロックは間違っています。 Torをブロックすることにより、正当なユーザーと、保守的な出口ポリシーで構成された無害な制限付きTor出口ノードもブロックします。

たとえば、SSH(ポート22)への攻撃を懸念する場合、Torのみをブロックしてもセキュリティはほとんど向上しません。あなたが本当に必要とするかもしれないのは、 http://denyhosts.sourceforge.net/ のような動的に同期されたブラックリストです。

DenyhostsはTor出口ノードを自動的にブロックします。これにより、Tor出口ノードの匿名ユーザーやオペレーターへの不必要なアクセスを拒否することなく、Torがポート22にアクセスできます。

18
Onlyjob

The Tor Project は実際にここに独自のリストを提供します:

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

7
Chad Scira

.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アドレス のリストがありますが、それらは常に変更されるため、常にリアルタイムであるため、私の関数を使用することが最善の方法です。

6
user3767204

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

重要な注意事項:

  • この例は、IPv6ではなくIPv4アドレスのみをサポートします。

  • 応答を得るには数秒かかる可能性があるため、サイトのレンダリングに遅延を導入することに注意してください。

3
Cem Arslan

ここ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" />

2
SochiX

ファイアウォールのブロックリストではなく、コードとセキュリティが最高のアプリケーション防御であることは事実です。あなたが本当の真のユーザーを持つことがあなたにとって本質的な問題であるなら、あなたは two-factor authentication を使わなければなりません。ブロックリストは、今日ではまったく役に立ちません。

2
Alexey Vesnin

Torトラフィックの検出はかなり簡単です。これを行う主な方法は、 Tor exit node list を監視し、IPをリストと比較することです。

最近そのようなことをする必要があり、小さなRuby 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 && echo "Yep, it's an exit node"

1
user427390

30分ごとに更新されるすべてのTorノードのリストを見つけました: https://www.dan.me.uk/tornodes

これには、Torの接続と参照に使用される出口、エントリ、およびブリッジノードを含める必要があります。

このPerlスクリプトを使用して、ダウンロードしたWebページからIPアドレスを収集します。

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

IPアドレスのリストが1行に1つずつ表示されます。 Perlスクリプトなしでこれを行うものを見つけようとしましたが、何時間も検索した後、見つけることができませんでした。

これがお役に立てば幸いです。

同じサイトでも良い情報が見つかりました: https://www.dan.me.uk/dnsbl

1
user2740751

(これはPHP特定の質問のために書かれたもので、後で削除され、重複してここにリンクされました)。

免責事項:すべてのTorユーザーをブロックすることの影響について、ここでのベストアンサーで述べられているように考慮してください。すべてを包括的にブロックするのではなく、登録、支払い、コメントなどのブロック機能のみを検討してください。

-

2つの純粋なPHPソリューションです。最初はTorノードリストをダウンロードしてキャッシュし、ビジターIPをリストと比較します。2番目は Tor DNS Exit List プロジェクトを使用します訪問者がDNSルックアップを介してTorを使用しているかどうかを判断します。

方法#1(Torリレーリストに対するIPの確認):

次の一連の関数を使用して、10分間ダウンロードおよびキャッシュされる動的な list に対してIPをチェックすることにより、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セッションを使用する場合、「isTorUser」応答をセッションに(ソースIPと一緒に)キャッシュすることを強くお勧めします。 $_SERVER['REMOTE_ADDR'] != $_SESSION['last_remote_addr'])多くの重複したルックアップを実行しないように。非常に効率的にしようとしても、同じIPに対して何度も繰り返すのは無駄です。

1
drew010

はい、実際、これはすべてのWindowsマシンで実行するスクリプトです。上記の他の例と同様に、すべての出口ノードをブロックするのと同じくらい簡単ですが、それには少し手間がかかります。

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

0
Don Austin

Torプロジェクトが出口プロキシのリストを公開している可能性があります。

出口プロキシのリストは、スペース区切りテキスト形式で https://check.torproject.org/exit-addresses のプロジェクトから直接ダウンロードできます。

pythonスクリプトを作成し、それらからのすべてのパケットを拒否するすべての出口ノードにiptablesルールを追加しました。githubでスクリプトを見つけることができます: https://github.com/vab/torblock

Torプロジェクトが出口ノードのリストの公開を停止することを決定した場合、それらをブロックすることが可能になります。コードは、torネットワークに接続して出口ノードを検出するために記述する必要があります。

0
V. Alex Brennen