Frp: 再次探讨 #633 安卓上运行ARM版本,不能使用域名,只能使用IP的问题

Created on 9 Apr 2018  ·  17Comments  ·  Source: fatedier/frp

源问题在 #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

help wanted

Most helpful comment

用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

All 17 comments

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

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

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

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

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

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

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

用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

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

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

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

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

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

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

补充添加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....

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

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

已经2020了,还是不行

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

Was this page helpful?
0 / 5 - 0 ratings