четверг, 17 октября 2013 г.

Как определить запрос из tor-сети

Для определения ip-адреса из tor-сетки можно послать запрос для A-записи, вида
<reversed ip>.<port>.<addr>.ip-port.exitlist.torproject.org
Где:
  • reversed ip - целевой ip в DNS PTR виде (перевернутый)
  • port - порт, на который стучится запрос от целевого адреса
  • addr - ip-адрес, на который стучится целевой адрес
Например, если мы проверяем ip 30.1.234.50, который долбится на адрес 80.10.200.30 на порт 80, то наш конечный запрос на проверку будет выглядеть так:
50.234.1.30.80.80.10.200.30.ip-port.exitlist.torproject.org
В итоге, если конечный запрос долбится с tor сетки через целевой ip на определенный порт на определенный адрес, то в указанном запросе нам вернется 127.0.0.2. В противном случае вернется nxdomain.

На PHP эта проверка может быть следующей:
// Целевой ip
$ip = implode('.', array_reverse(explode('.', $_SERVER['REMOTE_ADDR'])));
// Порт
$port = 80;
// Адрес:)
$addr = '0.0.0.0';

$ipInfo = dns_get_record("$ip.$port.$addr.ip-port.exitlist.torproject.org");

if (count($ipInfo)) {
    $ip = current($ipInfo);
    if (isset($ip['ip']) && $ip['ip'] == '127.0.0.2') {
        // Да, это tor
    }
}