Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Closed
iineva opened this issue Apr 9, 2018 · 18 comments

Comments

@iineva
Copy link

iineva commented Apr 9, 2018

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

@fatedier
Copy link
Owner

fatedier commented Apr 9, 2018

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

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

@linkerlin
Copy link

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

@fatedier
Copy link
Owner

fatedier commented Apr 9, 2018

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

@zhoujun2
Copy link

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

@fei-ke
Copy link

fei-ke commented Apr 10, 2018

golang/go#8877

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

@iineva
Copy link
Author

iineva commented 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

@iineva
Copy link
Author

iineva commented Apr 10, 2018

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

@nirui
Copy link

nirui commented Apr 10, 2018

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

@zhoujun2
Copy link

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

@iineva
Copy link
Author

iineva commented Aug 12, 2018

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

@neatstudio
Copy link

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

@neatstudio
Copy link

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

@neatstudio
Copy link

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

@Sak94664
Copy link

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

@obetame
Copy link

obetame commented Mar 19, 2019

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

@svengong
Copy link

svengong commented Jun 5, 2020

已经2020了,还是不行

@fatedier
Copy link
Owner

fatedier commented Jun 5, 2020

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

@jonozw
Copy link

jonozw commented Jan 6, 2023

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests