новая идентификация для TOR с использованием Perl в Linux

Я запускаю сценарий Perl для чтения данных для множества различных веб-сайтов через сеть TOR. Но некоторые из этих сайтов занесли в черный список некоторые узлы выхода TOR и отправляют http-status 403 вместо ожидаемого ответа. В этом случае я хочу отправить команду своему локальному процессу TOR, чтобы изменить его схему / идентификатор.

Это подводит меня к моему первому (второстепенному) вопросу:

Означают ли »схема« и »идентичность« одно и то же, когда мы говорим о ТЗ?

Но мой более важный вопрос таков:

Как я могу отправить команду »изменить идентификатор« локальному запущенному процессу TOR из сценария Perl?

(Насколько я знаю, это команда signal newnym, но как я могу ее отправить?)

Я уже задавал этот вопрос на TOR-StackExchange, и мне сказали выполнить системный вызов

pkill -SIGHUP tor  

что должно заставить TOR перезагрузить свои файлы конфигурации, а затем установить новую схему, но это не работает. Я предполагаю, что это потому, что мое socks-соединение все еще открыто, и даже после -SIGHUP продолжает использовать те же идентификаторы для все еще открытых соединений. (просто догадываюсь)

И я думаю, что это своего рода перегрузка, заставляющая TOR перезагружать свои файлы конфигурации только для создания новой схемы. Думаю, должно быть более элегантное решение, например

  1. создать соединение с контрольным портом TOR
  2. отправить »изменить личность« (signal newnym)
  3. тесная связь

Как можно написать эти три шага на Perl?

Читая некоторую документацию, я прочитал, что вы должны включить использование порта управления в каком-то конфигурационном файле и что вы должны использовать пароль. Подскажите пожалуйста, как это все сделать! - Спасибо


person Hubert Schölnast    schedule 21.10.2015    source источник
comment
Первый вопрос, вероятно, лучше подходит для сообщества TOR. Думаю, там он будет очень популярен. Фактический вопрос Perl с вашим алгоритмом, описанным ниже, может быть очень специфичным для предметной области и даже немного широким. Я не собираюсь закрывать голосование, так как думаю, что это по теме, но я также не очень уверен в том, что здесь будет большая помощь. Удачи. :)   -  person simbabque    schedule 21.10.2015


Ответы (2)


Полистав множество разных документов, я нашел решение:

if (my $socket = new IO::Socket::INET(
            'PeerHost' => '127.0.0.1',
            'PeerPort' => '9051',
            'Proto'    => 'tcp')) {
    my @requ = ('authenticate ""','SIGNAL NEWNYM','QUIT');
    foreach my $requ (@requ) {
        print $socket $requ."\n";
        my $dummy = <$socket>;
    }
    $socket->close();
    print "OK: New circuit established\n";
} else {
    print "ERROR: couldn't connect with socket\n";
}

Объяснение:

my $socket = new IO::Socket::INET(
            'PeerHost' => '127.0.0.1',
            'PeerPort' => '9051',
            'Proto'    => 'tcp')

создает новый объект сокета. Если это сработало, он возвращает сокет, иначе undef.

Я встроил этот оператор в оператор if. Его первый блок будет выполнен, если сокет может быть создан, второй блок выводит сообщение об ошибке.

В блоке if я отправляю эти три команды через сокет в TOR:

  1. аутентифицировать ""
  2. СИГНАЛ NEWNYM
  3. ПОКИДАТЬ

1 выполняет нулевую аутентификацию.
2 выполняет то, что я действительно хочу: эта команда сообщает TOR о необходимости установления новой цепи.
3 завершает разговор.

В конце закрываю розетку и печатаю сообщение.

Я не анализирую ответ TOR, но я должен его прочитать (с $dummy = <$socket>;). Можно было проверить, действительно ли TOR отвечает три раза «250», и отреагировать, если нет. Но я решил надеяться, что это всегда сработает.

person Hubert Schölnast    schedule 21.10.2015
comment
Вы выбрали правильный метод, чтобы сделать это программно, вам нужно открыть соединение с управляющим портом и выполнить команду SIGNAL NEWNYM, как вы это сделали. - person drew010; 22.10.2015

Если вам не обязательно, чтобы это был Perl, однострочник оболочки тоже подойдет:

В зависимости от ваших средств аутентификации (возможно, файла control_auth_cookie в data / tor) вы можете выдать этот однострочный (и, сделав это, также проверьте, что у вас есть новый внешний IP-адрес, на всякий случай), например:

printf "AUTHENTICATE \"$(cat <<location of your control_auth_cookie file>>)\"\r\nSIGNAL NEWNYM\r\n" | nc localhost 9151; curl --socks5-host localhost:9150 http://myexternalip.com/raw

Вам нужно будет настроить 9151 на фактический номер порта службы в вашей настройке.

person Jinxed    schedule 18.10.2020