源问题在 #633 后来算是不了了之了。
另外补充一个问题,因为下面提及的相同原因,socks5模式下,也是不能通过域名上网的。
我进过深入研究,已经排查到原因,因为Android下不是标准的Linux系统,没有/etc/resolv.conf文件。
而golang标准库中的net模块是通过解析/etc/resolv.conf文件获取到DNS服务器地址的。由于不能获取到,会使用默认值127.0.0.1:53,而本地又没有开启DNS服务所以就报错了。
解决办法有5个(前两个都需要root权限):
- 自行创建
/etc/resolv.conf文件,文件内容 nameserver 114.114.114.114,优点是最简单粗暴,缺点是不够灵活,而且小米手机官方root是权限不足够的;
- 在Android上运行一个DNS服务,我用的是godns,修改部分源码,通过命令
getprop net.dns1可以获取到Android系统下正确的DNS,由于需要占用53号端口,所以需要root权限;
frp中代码中自行解析DNS,个人认为这个是比较的解决办法,并且便于交叉编译,希望能完成;
- 修改
golang源码中的net模块,用定制版编译器编译frp;
- 使用Android真机直接编译:本人使用的方法是,termux下安装golang,然后直接编译二进制,无DNS问题。
https://golang.org/src/net/dnsclient_unix.go#L169
源问题在 #633 后来算是不了了之了。
另外补充一个问题,因为下面提及的相同原因,socks5模式下,也是不能通过域名上网的。
我进过深入研究,已经排查到原因,因为Android下不是标准的Linux系统,没有
/etc/resolv.conf文件。而
golang标准库中的net模块是通过解析/etc/resolv.conf文件获取到DNS服务器地址的。由于不能获取到,会使用默认值127.0.0.1:53,而本地又没有开启DNS服务所以就报错了。解决办法有5个(前两个都需要
root权限):/etc/resolv.conf文件,文件内容nameserver 114.114.114.114,优点是最简单粗暴,缺点是不够灵活,而且小米手机官方root是权限不足够的;getprop net.dns1可以获取到Android系统下正确的DNS,由于需要占用53号端口,所以需要root权限;frp中代码中自行解析DNS,个人认为这个是比较的解决办法,并且便于交叉编译,希望能完成;golang源码中的net模块,用定制版编译器编译frp;https://golang.org/src/net/dnsclient_unix.go#L169