[GH-ISSUE #700] 再次探讨 #633 安卓上运行ARM版本,不能使用域名,只能使用IP的问题 #548

Closed
opened 2026-05-05 12:21:26 -06:00 by gitea-mirror · 19 comments
Owner

Originally created by @iineva on GitHub (Apr 9, 2018).
Original GitHub issue: https://github.com/fatedier/frp/issues/700

源问题在 #633 后来算是不了了之了。
另外补充一个问题,因为下面提及的相同原因,socks5模式下,也是不能通过域名上网的。

我进过深入研究,已经排查到原因,因为Android下不是标准的Linux系统,没有/etc/resolv.conf文件。
golang标准库中的net模块是通过解析/etc/resolv.conf文件获取到DNS服务器地址的。由于不能获取到,会使用默认值127.0.0.1:53,而本地又没有开启DNS服务所以就报错了。
解决办法有5个(前两个都需要root权限):

  1. 自行创建/etc/resolv.conf文件,文件内容 nameserver 114.114.114.114,优点是最简单粗暴,缺点是不够灵活,而且小米手机官方root是权限不足够的;
  2. 在Android上运行一个DNS服务,我用的是godns,修改部分源码,通过命令getprop net.dns1可以获取到Android系统下正确的DNS,由于需要占用53号端口,所以需要root权限;
  3. frp中代码中自行解析DNS,个人认为这个是比较的解决办法,并且便于交叉编译,希望能完成;
  4. 修改golang源码中的net模块,用定制版编译器编译frp
  5. 使用Android真机直接编译:本人使用的方法是,termux下安装golang,然后直接编译二进制,无DNS问题。
  • golang标准库中的相关源码:

https://golang.org/src/net/dnsclient_unix.go#L169

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

@fatedier commented on GitHub (Apr 9, 2018):

你提到的四个解决方法中,方案三是可取的,我个人目前没有这方面的开发计划,如果有需求可以自行修改源码提 PR,尽量在最小的改动下实现这个功能,如果需要改动较多,可能暂不考虑在这个项目中实现。

考虑一种可能的简单修改: 通过修改 net.DefaultResolver 的 Dial 函数来将 dns 查询请求转发到用户指定的 ip 和 端口。

<!-- gh-comment-id:379808910 --> @fatedier commented on GitHub (Apr 9, 2018): 你提到的四个解决方法中,方案三是可取的,我个人目前没有这方面的开发计划,如果有需求可以自行修改源码提 PR,尽量在最小的改动下实现这个功能,如果需要改动较多,可能暂不考虑在这个项目中实现。 考虑一种可能的简单修改: 通过修改 net.DefaultResolver 的 Dial 函数来将 dns 查询请求转发到用户指定的 ip 和 端口。
Author
Owner

@linkerlin commented on GitHub (Apr 9, 2018):

或者在frp里面所有Dail的地方,预先用 nslookup命令 解析好域名?

<!-- gh-comment-id:379812597 --> @linkerlin commented on GitHub (Apr 9, 2018): 或者在frp里面所有Dail的地方,预先用 nslookup命令 解析好域名?
Author
Owner

@fatedier commented on GitHub (Apr 9, 2018):

@linkerlin 你提的这个方法,需要修改所有 Dial 调用的地方,如果可以通过修改 net.DefaultResolver 的 Dial 函数来实现,相当于只需要在初始化时全局修改一次,相对来说,改动更小。

<!-- gh-comment-id:379814474 --> @fatedier commented on GitHub (Apr 9, 2018): @linkerlin 你提的这个方法,需要修改所有 Dial 调用的地方,如果可以通过修改 net.DefaultResolver 的 Dial 函数来实现,相当于只需要在初始化时全局修改一次,相对来说,改动更小。
Author
Owner

@zhoujun2 commented on GitHub (Apr 10, 2018):

我是提交#633事件的人。termux需要安卓5.0才能使用,不一定所有人都有。
你能不能发一个文档,如何在termux上编译,给不会开发的人阅读

<!-- gh-comment-id:379956986 --> @zhoujun2 commented on GitHub (Apr 10, 2018): 我是提交#633事件的人。termux需要安卓5.0才能使用,不一定所有人都有。 你能不能发一个文档,如何在termux上编译,给不会开发的人阅读
Author
Owner

@fei-ke commented on GitHub (Apr 10, 2018):

https://github.com/golang/go/issues/8877

go 上讨论跟这个应该是一个问题吧

<!-- gh-comment-id:379987197 --> @fei-ke commented on GitHub (Apr 10, 2018): https://github.com/golang/go/issues/8877 go 上讨论跟这个应该是一个问题吧
Author
Owner

@iineva commented on GitHub (Apr 10, 2018):

用termux编译的方法如下

  1. 在电脑端执行
cd ~/.ssh
# 如果~/.ssh 目录下没有id_rsa.pub文件,执行命令 ssh-keygen 即可生成
php -S 0.0.0.0:5000
  1. termux 端执行
pkg install openssh curl
sshd
# http://xxxxxx/id_rsa.pub为你的电脑公钥
curl http://YOUR_IP_ADDRESS:5000/id_rsa.pub >> $HOME/.ssh/authorized_keys
  1. 在电脑端执行,以下命令即可远程连接到手机
ssh root@YOUR_IP_ADDRESS -p 8022
  • 安装golang
pkg install golang
  • 获取frp源码
go get github.com/fatedier/frp
  • 编译frpsfrpc
cd $HOME/go/src/github.com/fatedier/frp/cmd/frpc
go build
cd $HOME/go/src/github.com/fatedier/frp/cmd/frps
go build
<!-- gh-comment-id:380017974 --> @iineva commented on GitHub (Apr 10, 2018): # 用termux编译的方法如下 * 如果不想自己编译,可以直接下载我编译好的二进制文件即可,后面的一大堆东西可以不用看了 [frps.zip](https://github.com/fatedier/frp/files/1893727/frps.zip) [frpc.zip](https://github.com/fatedier/frp/files/1893729/frpc.zip) * 安装 [com.termux.apk.zip](https://github.com/fatedier/frp/files/1893666/com.termux.apk.zip), [com.termux.boot.apk.zip(可选,这个是用来执行自启动脚本的)](https://github.com/fatedier/frp/files/1893668/com.termux.boot.apk.zip),然后打开`termux` APP * 安装并启动`openssh`,由于手机端不方便输入命令,使用电脑ssh到手机,方便操作(可选) 1. 在电脑端执行 ```shell cd ~/.ssh # 如果~/.ssh 目录下没有id_rsa.pub文件,执行命令 ssh-keygen 即可生成 php -S 0.0.0.0:5000 ``` 2. termux 端执行 ```shell pkg install openssh curl sshd # http://xxxxxx/id_rsa.pub为你的电脑公钥 curl http://YOUR_IP_ADDRESS:5000/id_rsa.pub >> $HOME/.ssh/authorized_keys ``` 3. 在电脑端执行,以下命令即可远程连接到手机 ```shell ssh root@YOUR_IP_ADDRESS -p 8022 ``` * 安装`golang` ```shell pkg install golang ``` * 获取`frp`源码 ```shell go get github.com/fatedier/frp ``` * 编译`frps`和`frpc` ```shell cd $HOME/go/src/github.com/fatedier/frp/cmd/frpc go build cd $HOME/go/src/github.com/fatedier/frp/cmd/frps go build ```
Author
Owner

@iineva commented on GitHub (Apr 10, 2018):

@fei-ke 确实是同一个问题,上面讨论了三年多了,我不指望能在那边得到解决

<!-- gh-comment-id:380018648 --> @iineva commented on GitHub (Apr 10, 2018): @fei-ke 确实是同一个问题,上面讨论了三年多了,我不指望能在那边得到解决
Author
Owner

@nirui commented on GitHub (Apr 10, 2018):

其实还可以用第三方库,比如:https://github.com/miekg/dns 。这样就不用自己实现整个DNS的RFC了。

<!-- gh-comment-id:380110452 --> @nirui commented on GitHub (Apr 10, 2018): 其实还可以用第三方库,比如:https://github.com/miekg/dns 。这样就不用自己实现整个DNS的RFC了。
Author
Owner

@zhoujun2 commented on GitHub (Apr 11, 2018):

安卓终端模拟器,如果因dns变化导致连接失败,进程不会重启,有什么办法让进程守护吗

<!-- gh-comment-id:380392221 --> @zhoujun2 commented on GitHub (Apr 11, 2018): 安卓终端模拟器,如果因dns变化导致连接失败,进程不会重启,有什么办法让进程守护吗
Author
Owner

@iineva commented on GitHub (Aug 12, 2018):

补充添加v0.21.0的已编译版本
frpc-0.21.0.zip
frps-0.21.0.zip

<!-- gh-comment-id:412342295 --> @iineva commented on GitHub (Aug 12, 2018): 补充添加v0.21.0的已编译版本 [frpc-0.21.0.zip](https://github.com/fatedier/frp/files/2280993/frpc-0.21.0.zip) [frps-0.21.0.zip](https://github.com/fatedier/frp/files/2280994/frps-0.21.0.zip)
Author
Owner

@neatstudio commented on GitHub (Sep 16, 2018):

赞。但问题是我服务器用的是0.20.有多个0.20的客户端在运行。真纠结

<!-- gh-comment-id:421781583 --> @neatstudio commented on GitHub (Sep 16, 2018): 赞。但问题是我服务器用的是0.20.有多个0.20的客户端在运行。真纠结
Author
Owner

@neatstudio commented on GitHub (Sep 16, 2018):

准备明天在我的耻辱机上试一下。不知道能不能跑起来。好纠结

<!-- gh-comment-id:421781836 --> @neatstudio commented on GitHub (Sep 16, 2018): 准备明天在我的耻辱机上试一下。不知道能不能跑起来。好纠结
Author
Owner

@neatstudio commented on GitHub (Sep 17, 2018):

补充添加v0.21.0的已编译版本
frpc-0.21.0.zip
frps-0.21.0.zip

没跑起来,
cannot link executable "./frpc-0.21.0" "/data/data/com.termux/files/usr/lib/libtermux-exec.so" is 64-bit instead of 32-bit....

<!-- gh-comment-id:421897248 --> @neatstudio commented on GitHub (Sep 17, 2018): > 补充添加v0.21.0的已编译版本 > [frpc-0.21.0.zip](https://github.com/fatedier/frp/files/2280993/frpc-0.21.0.zip) > [frps-0.21.0.zip](https://github.com/fatedier/frp/files/2280994/frps-0.21.0.zip) 没跑起来, cannot link executable "./frpc-0.21.0" "/data/data/com.termux/files/usr/lib/libtermux-exec.so" is 64-bit instead of 32-bit....
Author
Owner

@Sak94664 commented on GitHub (Jan 20, 2019):

嗯...试着在termux上执行一下termux-chroot,虚拟一个chroot,这样程序就应该可以找到正确的resolv.conf了,也不用自己编译了。

<!-- gh-comment-id:455842071 --> @Sak94664 commented on GitHub (Jan 20, 2019): 嗯...试着在termux上执行一下termux-chroot,虚拟一个chroot,这样程序就应该可以找到正确的resolv.conf了,也不用自己编译了。
Author
Owner

@obetame commented on GitHub (Mar 19, 2019):

你们为啥不装一个linux deploy呢?我都部署了个网站在我机子上跑了。。。

<!-- gh-comment-id:474427026 --> @obetame commented on GitHub (Mar 19, 2019): 你们为啥不装一个linux deploy呢?我都部署了个网站在我机子上跑了。。。
Author
Owner

@svengong commented on GitHub (Jun 5, 2020):

已经2020了,还是不行

<!-- gh-comment-id:639242954 --> @svengong commented on GitHub (Jun 5, 2020): 已经2020了,还是不行
Author
Owner

@fatedier commented on GitHub (Jun 5, 2020):

@svengong https://github.com/fatedier/frp/blob/master/conf/frpc_full.ini#L56
上面的 history 中有对应 commit。

<!-- gh-comment-id:639245893 --> @fatedier commented on GitHub (Jun 5, 2020): @svengong https://github.com/fatedier/frp/blob/master/conf/frpc_full.ini#L56 上面的 history 中有对应 commit。
Author
Owner

@jonozw commented on GitHub (Jan 6, 2023):

所以这个问题依然是无解吗。。。

<!-- gh-comment-id:1373762232 --> @jonozw commented on GitHub (Jan 6, 2023): 所以这个问题依然是无解吗。。。
Author
Owner

@donmor commented on GitHub (Jul 4, 2025):

在搓安卓客户端中(研究一下前台服务),查资料有提到过启用CGO并设置变量CC=/path/to/ndk_clang可以启用交叉编译,据说可以解决dns问题(以及解决安卓api36+的amd64系统下因为没有对齐16k分页而无法启动的问题)

<!-- gh-comment-id:3036798148 --> @donmor commented on GitHub (Jul 4, 2025): 在搓安卓客户端中(研究一下前台服务),查资料有提到过启用CGO并设置变量CC=/path/to/ndk_clang可以启用交叉编译,据说可以解决dns问题(以及解决安卓api36+的amd64系统下因为没有对齐16k分页而无法启动的问题)
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: github-starred/frp#548
No description provided.