fatedier / frp

A fast reverse proxy to help you expose a local server behind a NAT or firewall to the internet.
Apache License 2.0
86.51k stars 13.38k forks source link

希望能在HTTP/Socks5的代理里增加独立的DNS设置 #793

Closed ChenWenBrian closed 6 years ago

ChenWenBrian commented 6 years ago

目前在frpc里可以设置整体的DNS server,但是该设置也会同时影响到其他端口的服务,例如HTTP和Socks5的代理。

遇到的问题: frps的服务器地址是通过公网的动态域名解析的,公司内网的网关DNS虽然也能解析,但是每次更换IP后内网DNS会缓存很久之前的解析结果(约半小时);而公网如223.6.6.6(阿里的)、8.8.8.8往往只缓存10分钟,可以保证frpc更快的连接到新IP。 于是我在frpc上设置了dns_server,但是发现这样做后,HTTP代理都不能正常解析内网域名了,因为所有的域名解析都是公网的DNS在做,而公网DNS没法知道内网的域名情况。

希望能有如下的DNS独立设置项:

  1. 对服务器端地址的DNS(或者依然使用整体的DNS);
  2. HTTP代理可以单独设置DNS,这样用户访问内网web时域名解析可以不受全局DNS设置的影响;
  3. Socks5代理,同HTTP;
  4. 其它可能受影响的TCP通道;
fatedier commented 6 years ago

不太可能会考虑这样的问题,设置 DNS server 也不推荐使用,原本只是为了解决在 android 上遇到的不使用操作系统默认 DNS 的问题,之后会将这个配置注释以让大多人不需要感知。

我个人不推荐在程序里加入过多和项目本身无关的功能,能够通过其他工具或者方式解决的问题就不要全都放在一起。你如果有对 DNS 解析的特殊需求可以考虑借助于其他工具解决。

ChenWenBrian commented 6 years ago

那可否考虑将目前的DNS_SERVER的设置作为仅与frps端连接前的域名解析使用?

fatedier commented 6 years ago

这样的修改是一件很奇怪的事情,我建议还是不要使用这个功能,直接使用操作系统的 DNS 解析。

xiaoyell commented 6 years ago

@ChenWenBrian 你不妨把你的网络环境具体的说下,看看大家有什么好办法了

ChenWenBrian commented 6 years ago

Hi @xiaoyell,抱歉回复的晚了,这几天一直再尝试各种解决方案,虽然问题有解决,还是期望FRP本身能支持。

frp 网络环境可以见上图。 目前主要的问题就是阿里的DDNS解析和公司内网的DNS问题。阿里的DDNS最低TTL是600,也就是10分钟才会更新,而公司的DNS更变态,要缓存半小时。而从公司内网FRPC去连接家里的FRPS,需要用到DDNS解析。当家里路由器的IP变更时,FRPC会重新连接,我希望这个时间尽可能的短。如果我指定DNS为阿里的,则10分钟内必然连接成功,但是问题是内网的http_proxy和socks_proxy的解析就全部出错;如果我指定DNS为内网的,则每次耗时在30分钟左右,好处是可以解析内网域名。

我个人想到的几种方案:

  1. 配置文件中的DNS服务器只针对FRPS的域名解析有效,http_proxy和socks_proxy插件不受配置DNS影响,而直接使用服务器本身的DNS配置;
  2. http_proxy和socks_proxy插件可以独立配置DNS;
  3. FRPC在启动连接、重连FRPS端的时候,提供相应事件配置,譬如begin_connect=./connect.sh。这样用户可以在连接前通过自定义脚本或者应用去扩展FRPC的功能。比如用户自己写一个SH脚本去获取最新的IP并写入本地hosts文件,或者写入FRPC的配置(需重新load配置),或者作为返回值返回给FRPC(需定义返回值结构)
  4. 如@fatedier 所言,使用第三方方案。目前我有尝试本地开进程去一直轮询最新IP并更新到本地hosts文件,也有尝试使用第三方代理软件,然后让FRPC去端口映射。都能达到目的,只是觉得FRP本身就有的功能,却偏偏还需要另开服务有点怪。

个人比较倾向第三种方案,增强FRPC的扩展能力,这样大家再遇到类似需求的时候,可以由用户自行扩展一些简单的功能,希望各位大神能考虑下,谢谢。

ChenWenBrian commented 6 years ago

写了个脚本动态监控阿里的域名解析变化,并更新本地hosts文件。然后frpc直接使用动态域名去连接家里的服务器就可以了,无需再设置dns服务器。 脚本放github了,供有同样需求的同学参考 AliDDNS