Как получить IP-адрес выходного узла Tor через порт управления?

Я хочу отслеживать статус запущенных экземпляров Tor.

Я уже могу получать информацию через TCP-соединение с управляющими портами. Например. "GETINFO stream-status" возвращает данные, но я не могу определить IP-адрес текущего выбранного выходного узла.

Можно было бы просто запросить что-то вроде whatismyip.org, но это слишком медленно и плохо масштабируется.

Итак, как лучше всего получить IP-адрес выходного узла соединения Tor?


person pintpint    schedule 19.03.2012    source источник
comment
Вы нашли решение?   -  person Fluffy    schedule 03.02.2013


Ответы (4)


Это большой вопрос! Вот краткий скрипт для этого с использованием стема...

from stem import CircStatus
from stem.control import Controller

with Controller.from_port(port = 9051) as controller:
  controller.authenticate()

  for circ in controller.get_circuits():
    if circ.status != CircStatus.BUILT:
      continue

    exit_fp, exit_nickname = circ.path[-1]

    exit_desc = controller.get_network_status(exit_fp, None)
    exit_address = exit_desc.address if exit_desc else 'unknown'

    print "Exit relay"
    print "  fingerprint: %s" % exit_fp
    print "  nickname: %s" % exit_nickname
    print "  address: %s" % exit_address
    print

Спасибо за вопрос. Я добавил это в наш FAQ< /а>.

person Damian    schedule 16.06.2013
comment
Как узнать, какой из них будет использовать Tor? - person Tyilo; 20.08.2013
comment
Да, как мы узнаем, какой из них используется Tor? - person rdsoze; 30.01.2014
comment
Как это использование python/stem переводится в протокол управления Tor? Я думаю, это GETINFO circuit-status. - person Markus Malkusch; 13.03.2016
comment
Вы используете circuit-status для получения списка ВСТРОЕННЫХ схем, используется первая. Затем вы извлекаете идентификатор последнего узла, чтобы получить информацию с помощью ns/id/$NODEID - person HugoPoi; 08.12.2016
comment
конечно, я не очень хорошо знаю внутренности tor, но с помощью этого кода сообщается о двух адресах, как узнать, какой из них выбран - person pouya; 19.11.2017
comment
играя с кодом, в некоторых случаях сообщается о трех или более адресах, и они не приходят последовательно - person pouya; 19.11.2017

Вы можете использовать API управления Tor. Но я не вижу смысла.

Вы знаете выходной узел id~name, вы знаете IP-адрес, который он прослушивает. Вы не знаете, какой сетевой интерфейс и какой IP-адрес он будет использовать для обработки вашего запроса.

Я только что проверил, что около 5% выходных узлов Tor используют неопубликованные адреса ipv4.

Мир переходит на ipv6. Эти IP-адреса дешевы. Каждый выходной узел может иметь пакет неопубликованных адресов ipv6.

person puchu    schedule 23.08.2017

Схема выхода может быть любой из схем, возвращаемых контроллером.get_circuits(). Ниже показано, как вы получаете схему выхода и IP-адрес:
ссылка на источник и руководство

## https://stem.torproject.org/tutorials/examples/exit_used.html
import functools

from stem import StreamStatus
from stem.control import EventType, Controller

def main():
  print("Tracking requests for tor exits. Press 'enter' to end.")
  print("")

  with Controller.from_port() as controller:
    controller.authenticate()

    stream_listener = functools.partial(stream_event, controller)
    controller.add_event_listener(stream_listener, EventType.STREAM)

    input()  # wait for user to press enter


def stream_event(controller, event):
  if event.status == StreamStatus.SUCCEEDED and event.circ_id:
    circ = controller.get_circuit(event.circ_id)

    exit_fingerprint = circ.path[-1][0]
    exit_relay = controller.get_network_status(exit_fingerprint)

    print("Exit relay for our connection to %s" % (event.target))
    print("  address: %s:%i" % (exit_relay.address, exit_relay.or_port))
    print("  fingerprint: %s" % exit_relay.fingerprint)
    print("  nickname: %s" % exit_relay.nickname)
    print("  locale: %s" % controller.get_info("ip-to-country/%s" % exit_relay.address, 'unknown'))
    print("")


if __name__ == '__main__':
  main()

person Iceberg    schedule 19.11.2020

Согласно протоколу управления Tor spec, правильный синтаксис - «адрес GETINFO», который должен отображать the best guess at our external IP address. Если у нас нет предположений, верните ошибку 551. (Добавлено в 0.1.2.2-альфа)".

person PacoBell    schedule 28.04.2013
comment
GETINFO address предоставляет ваш собственный IP-адрес (то есть адрес, который увидят другие люди, если вы решите быть ретранслятором). То, о чем спрашивает плакат, - это адрес выходного ретранслятора его нынешних цепей. - person Damian; 16.06.2013
comment
getinfo circuit-status электрические цепи построены и готовы. Он будет содержать имя OR (имя маршрутизатора/перехода) и идентификатор. С этим вы можете получить с getinfo ns/id/<OR ID> или getinfo ns/name/<OR Name> может позволить вам определить ip - person gesell; 03.07.2015