15

我想监控正在运行的 Tor 实例的状态。

我已经能够通过与控制端口的 TCP 连接获取信息。例如,“GETINFO stream-status”返回数据,但我无法确定当前选择的出口节点的 IP 地址。

可以简单地请求 whatismyip.org 之类的东西,但这太慢并且不能很好地扩展。

那么获取 Tor 连接的出口节点 IP 地址的最佳方法是什么?

4

4 回答 4

10

这是一个很好的问题!这是使用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

谢谢你的问题。我已将此添加到我们的常见问题解答中。

于 2013-06-16T03:47:01.867 回答
0

出口电路可能是由 controller.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()

于 2020-11-19T15:35:07.980 回答
0

您可以使用tor 控制 api。但我不明白这一点。

您知道出口节点id~name,您知道它正在侦听的 IP 地址。您不知道它将使用什么网络接口和什么 IP 地址来处理您的查询。

我刚刚检查了大约 5% 的 Tor 出口节点使用未发布的 ipv4 地址。

世界正在转向 ipv6。这些IP地址很便宜。每个出口节点可以有一个 ipv6 未公开地址包。

于 2017-08-23T22:47:37.970 回答
-1

根据 Tor 控制协议规范,正确的语法是“GETINFO 地址”,它应该呈现the best guess at our external IP address. 如果我们没有猜测,则返回 551 错误。(在 0.1.2.2-alpha 中添加)”。

于 2013-04-28T09:13:53.260 回答