首页 > 解决方案 > 从 android 应用程序“net::ERR_NAME_NOT_RESOLVED”运行 tor.so

问题描述

我正在使用 API 29 Android 模拟器编写一个电容器应用程序进行测试。我正在使用来自https://www.npmjs.com/package/@start9labs/capacitor-tor的插件电容器-tor

我已经修改了插件,使其现在从 jnilibs 文件夹执行 tor,因为它是 Api 级别 29+ 所必需的,并且它似乎运行正确,如日志所示:

D/eglCodecCommon: setVertexArrayObject: set vao to 0 (0) 7 8
I/ConnectionChangeReceiver: Switching to ONLINE mode
D/eglCodecCommon: setVertexArrayObject: set vao to 1 (1) 7 4
D/eglCodecCommon: setVertexArrayObject: set vao to 0 (0) 7 8
D/eglCodecCommon: setVertexArrayObject: set vao to 1 (1) 7 4
D/eglCodecCommon: setVertexArrayObject: set vao to 0 (0) 7 8
I/t*.p*.OnionProxyManager: Enabling network: true
I/*oxyManagerEventHandler: message: severity: NOTICE, msg: Bootstrapped 10% (conn_done): Connected to a relay
V/Capacitor/TorPlugin: Notifying listeners for event torInitProgress
D/Capacitor/TorPlugin: No listeners found for event torInitProgress
D/eglCodecCommon: setVertexArrayObject: set vao to 1 (1) 7 4
D/eglCodecCommon: setVertexArrayObject: set vao to 0 (0) 7 8
D/eglCodecCommon: setVertexArrayObject: set vao to 1 (1) 7 4
D/eglCodecCommon: setVertexArrayObject: set vao to 0 (0) 7 8
I/*oxyManagerEventHandler: message: severity: NOTICE, msg: Bootstrapped 14% (handshake): Handshaking with a relay
V/Capacitor/TorPlugin: Notifying listeners for event torInitProgress
D/Capacitor/TorPlugin: No listeners found for event torInitProgress
I/*oxyManagerEventHandler: message: severity: NOTICE, msg: Bootstrapped 15% (handshake_done): Handshake with a relay done
V/Capacitor/TorPlugin: Notifying listeners for event torInitProgress
D/Capacitor/TorPlugin: No listeners found for event torInitProgress
I/*oxyManagerEventHandler: message: severity: NOTICE, msg: Bootstrapped 75% (enough_dirinfo): Loaded enough directory info to build circuits
V/Capacitor/TorPlugin: Notifying listeners for event torInitProgress
D/Capacitor/TorPlugin: No listeners found for event torInitProgress
I/*oxyManagerEventHandler: OR connection: status: CONNECTED, orName: $8ACD73BD9BDD5E5AFC97169C5837C5E0F732A2CF~SkynetW
I/*oxyManagerEventHandler: message: severity: NOTICE, msg: Bootstrapped 90% (ap_handshake_done): Handshake finished with a relay to build circuits
V/Capacitor/TorPlugin: Notifying listeners for event torInitProgress
D/Capacitor/TorPlugin: No listeners found for event torInitProgress
I/*oxyManagerEventHandler: message: severity: NOTICE, msg: Bootstrapped 95% (circuit_create): Establishing a Tor circuit
V/Capacitor/TorPlugin: Notifying listeners for event torInitProgress
D/Capacitor/TorPlugin: No listeners found for event torInitProgress
I/*oxyManagerEventHandler: OR connection: status: CONNECTED, orName: $6429B0D703EB90A18528F9F8B843504AA27765C6~rinderwahnRelay37L
I/*oxyManagerEventHandler: message: severity: NOTICE, msg: Bootstrapped 100% (done): Done
V/Capacitor/TorPlugin: Notifying listeners for event torInitProgress
D/Capacitor/TorPlugin: No listeners found for event torInitProgress
D/TorPlugin: Finishing off tor. Started successfully: true

作为 30 秒后的测试,我再次尝试启动 tor,它已经按预期运行:

V/Capacitor/Plugin: To native (Capacitor plugin): callbackId: 51286662, pluginId: TorPlugin, methodName: start
V/Capacitor: callback: 51286662, pluginId: TorPlugin, methodName: start, methodData: {"socksPort":9250,"controlPort":9251,"initTimeout":15000}
D/TorPlugin: Kicking off tor
I/t*.p*.OnionProxyManager: Tor is already running
I/ConnectionChangeReceiver: Switching to ONLINE mode
I/t*.p*.OnionProxyManager: Enabling network: true
D/TorPlugin: Finishing off tor. Started successfully: true
I/t*.p*.OnionProxyManager: Enabling network: true

所以看起来好像 tor 运行正常。尽管我仍然得到net::ERR_NAME_NOT_RESOLVED的一切,但我的请求是由 javascript 部分中的 socket.io 和 socks-proxy-agent 的浏览器版本提出的:

var agent = new SocksProxyAgent("socks://localhost:9250");
var socket =  await io.connect(onion_v3_address.onion:3000, { agent: agent });
socket.on('connect', async socket => {
            console.log("connected to server");
            // either with send()
            socket.send('hello');            
});

chrome调试器中的错误:

GET http://onion_v3_address.onion:3000/socket.io/?EIO=4&transport=polling&t=NpbeiTH net::ERR_NAME_NOT_RESOLVED

(当然真实地址换成了onion_v3_address.onion:3000)

插件是这样开始的:

Capacitor.Plugins.TorPlugin.start({socksPort: 9250, controlPort: 9251, initTimeout: 15000});

怎么了?tor 在本地主机上不可用吗?我需要使用与 localhost 不同的 ip 吗?android是否以某种方式阻止了我的请求?还有什么可能导致这个问题?

onion_v3_address.onion:3000 的 tor 服务器当然是可以访问的,并且在从 linux 或 windows 进行测试时可以按预期工作。


如果不使用以下代理:

socket = await io.connect('127.0.0.1:9250', {resource: '/onion_v3_address.onion:3000'});

我进入 chrome 调试器:

Failed to load resource: the server responded with a status of 501 (Tor is not an HTTP Proxy)
(index):1 Access to XMLHttpRequest at 'http://127.0.0.1:9250/socket.io/?EIO=4&transport=polling&t=NpcLcw9' from origin 'http://localhost' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

所以看起来tor确实运行正确,我只是不知道如何正确地从webview请求到tor???!再次:使用代理的 javascript 代码在电子(linux、macOS、win)100% 上工作。它使用 orbot 与科尔多瓦一起工作。但我不想使用 orbot。


在 logcat 中我发现了这个:

2021-11-07 09:16:29.800 20411-20411/? W/libtor.so: type=1400 audit(0.0:1271): avc: denied { ioctl } for path="socket:[443934]" dev="sockfs" ino=443934 ioctlcmd=0x894b scontext=u:r:untrusted_app:s0:c162,c256,c512,c768 tcontext=u:r:untrusted_app:s0:c162,c256,c512,c768 tclass=tcp_socket permissive=0 app=com.github.anonym.myapp

这可能是原因还是与套接字无关?


在 Chrome 中输入 localhost:9250 时,它会在模拟器和手机中显示“这是一个袜子代理...”。所以这意味着 tor 实际上是全球可用的。

标签: javascriptjavaandroidcapacitortor

解决方案


要修复net::ERR_NAME_NOT_RESOLVED尝试解析 Onion 域时的错误,代理需要通过 Tor 进行 DNS 解析,而不是使用本地 DNS 解析器。

要通过 Tor 获得 DNS 解析,请更改:

var agent = new SocksProxyAgent("socks://localhost:9250");

至:

var agent = new SocksProxyAgent("socks5h://localhost:9250");

当 用SocksProxyAgent实例化时socks://,DNS 解析由本地解析器执行。Usingsocks5h://告诉代理也通过代理发送 DNS 请求,这正是解析洋葱域所需要的。

这也可以防止通过 Tor 发送请求但不发送 DNS 请求的 DNS 泄漏。


推荐阅读