Как получить Tor выход node IP-адрес через порт управления?
Я хочу отслеживать состояние запуска экземпляров Tor.
Я уже могу получить информацию через TCP-соединение с портами управления.
Например. "Состояние потока GETINFO" возвращает данные, но я не могу определить IP-адрес текущего выбранного выхода node.
Можно было бы просто запросить что-то вроде whatismyip.org, но это слишком медленно и плохо масштабируется.
Итак, каков наилучший способ получить выход node IP-адрес соединения Tor?
Ответы
Ответ 1
Это отличный вопрос! Здесь короткий script для этого, используя 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
Спасибо за вопрос. Я добавил это в наши часто задаваемые вопросы.
Ответ 2
Вы можете использовать tor control api. Но я не вижу смысла.
Вы знаете выход node id~name
, вы знаете IP-адрес, который он прослушивает. Вы не знаете, какой сетевой интерфейс и какой IP-адрес он будет использовать для обработки вашего запроса.
Я только что проверил, что около 5% узлов выхода tor используют неопубликованные адреса ipv4.
Мир движется к ipv6. Эти IP-адреса дешевы. Каждый выход node может иметь пакет непокрытых адресов ipv6.
Ответ 3
Согласно протоколу управления Tor spec, правильный синтаксис - это "адрес GETINFO", который должен отображать the best guess at our external IP address
. Если у нас нет догадки, верните ошибку 551. (Добавлено в 0.1.2.2-альфа) ".