Как получить IP-адрес выходного узла Tor через контрольный порт? - PullRequest
14 голосов
/ 20 марта 2012

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

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

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

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

Ответы [ 3 ]

10 голосов
/ 16 июня 2013

Это отличный вопрос! Вот краткий скрипт для этого, используя stem ...

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 .

0 голосов
/ 24 августа 2017

Вы можете использовать tor control api .Но я не вижу смысла.

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

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

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

0 голосов
/ 28 апреля 2013

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

...