我想监视运行Tor实例的状态。
我已经能够通过TCP连接获取有关控制端口的信息。 例如。 “GETINFO stream-status”返回数据,但我无法确定当前所选退出节点的IP地址。
可以简单地请求像whatismyip.org这样的东西,但这样做太慢而且不能很好地扩展。
那么获得Tor连接的出口节点IP地址的最佳方法是什么?
答案 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中添加)“。