42

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

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

4

15 に答える 15

42

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

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

于 2012-03-25T14:55:04.600 に答える
20

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

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

Denyhostsは、Torがポート22にアクセスできるようにするTor出口ノードを自動的にブロックします。匿名のユーザーや、犯罪者にSSHサービスを攻撃させないTor出口ノードのオペレーターへのアクセスを不必要に拒否することはありません。

于 2013-04-06T07:37:57.723 に答える
7

Torプロジェクトは実際にここに独自のリストを提供しています:

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

于 2015-10-03T01:34:31.963 に答える
6

.NETでは、それは可能でシンプルです。私は自分のサイトにそれを実装しました。

議論のために、サイトの外部IPアドレスが192.168.0.5であるとします。投稿時の実際のTORIPアドレス: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アドレスのリストがありますが、明らかにそれらは常に変更されるため、常にリアルタイムであるため、私の関数を使用するのが最善の方法です。

于 2014-11-04T22:39:33.353 に答える
3

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

重要な注意事項:

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

  • 応答が得られるまでに数秒かかる場合があるため、サイトのレンダリングに遅延が生じることに注意してください。

于 2017-10-30T07:36:41.047 に答える
2

事実、アプリケーションの最善の防御は、ファイアウォールのブロックリストではなく、コードとセキュリティです。真のユーザーを確保することが重要な場合は、2要素認証を使用する必要があります。現在、ブロックリストはまったく役に立たない。

于 2013-12-04T18:23:35.200 に答える
2

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

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

-

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

方法1(Torリレーリストに対してIPをチェックする):

次の一連の関数を使用して、IPがダウンロードされて10分間キャッシュされる動的出口リストと照合することにより、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://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を使用してインストールし、アプリケーションcomposer require dapphp/torutilsに標準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に対して何度も繰り返すのは無駄です。

于 2017-06-21T15:52:53.887 に答える
2

ここhttps://github.com/RD17/DeTorを参照)は、リクエストがTORネットワークから行われたかどうかを判断するための単純なRESTAPIです。

リクエストは次のとおり 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" />

于 2017-07-07T07:19:03.260 に答える
1

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

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

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

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

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

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

また、同じサイトでいくつかの良い情報を見つけました: https ://www.dan.me.uk/dnsbl

于 2013-09-02T19:23:54.620 に答える
1

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

私は最近そのようなことをする必要があり、出口ノードのリストを最新に保ち、出口ノードを検出する簡単な方法を提供するために小さなRubygemを構築しました。また、出口ノードの検出に使用できる小さな実行可能ファイルも作成しました。

宝石はオープンソースであり、ここで見つけることができます: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"

于 2017-08-07T06:56:28.347 に答える
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への回答を投稿してからしばらく経ちましたので、ご容赦ください。可能であれば改善にご協力ください。

于 2020-05-05T21:58:48.643 に答える
0

Torプロジェクトが出口プロキシのリストを公開しているために可能です。

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

出口ノードからのすべてのパケットを拒否するすべての出口ノードにiptablesルールを追加するPythonスクリプトを作成しました。スクリプトはここでgithubにあります:https ://github.com/vab/torblock

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

于 2016-12-26T23:11:34.940 に答える
0

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

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

于 2019-05-15T22:33:13.600 に答える
0

私はすでにtorノードとtor出口ノードのリストをキュレートしており、これらは1時間ごとに更新されます。https://github.com/SecOps-Institute/Tor-IP-Addressesを参照してください

1時間ごとにgitpullを実行して、最新のリストを取得できます。

于 2019-12-12T08:47:13.643 に答える
0

なんらかの理由で、ここで別の答えを見つけることができませんでした。現時点では(20 Shevat 5781(Creationから))、この特定のリンクがあります。

https://check.torproject.org/torbulkexitlist

Torをダウンロードし、IPアドレスの検索Webサイトを開いて、そのIPアドレスに移動します(たまたまhttp://195.176.3.20/に移動します。移動すると、リストも表示されます)、そしてそれにナビゲートする....

于 2021-02-02T22:41:37.237 に答える