如何通过控制端口获取Tor出口节点IP地址?

时间:2012-03-19 20:12:31

标签: ip exit tor

我想监视运行Tor实例的状态。

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

可以简单地请求像whatismyip.org这样的东西,但这样做太慢而且不能很好地扩展。

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

4 个答案:

答案 0 :(得分: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

感谢您的提问。我已将此添加到our FAQ

答案 1 :(得分:0)

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

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

我刚检查过大约5%的tor退出节点使用未发布的ipv4地址。

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

答案 2 :(得分:0)

退出电路可能是controller.get_circuits()返回的任何电路,以下是获取退出电路和ip地址的方法:
source and tutorial link

## 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()

答案 3 :(得分:-1)

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