pymumu / smartdns

A local DNS server to obtain the fastest website IP for the best Internet experience, support DoT, DoH. 一个本地DNS服务器,获取最快的网站IP,获得最佳上网体验,支持DoH,DoT。
https://pymumu.github.io/smartdns/
GNU General Public License v3.0
8.31k stars 1.06k forks source link

将域名解析的 Cloudflare IP 重定向至最快 IP #1062

Closed Auska closed 8 months ago

Auska commented 2 years ago

需求应用场景 访问使用Cloudflare加速的域名返回的IP不一定很快

建议的方案 增加IP的匹配器,返回指定的IP(最好能够返回两个或三个IP,提高稳定性) 使用mosdns实现上述场景建议的方案。

设备信息

  1. debian 11
PikuZheng commented 2 years ago

没懂。 只要是套cf的网站,用哪个IP连都可以吗?如果之前确定的这个IP突然不可用,怎么识别?

Auska commented 2 years ago

没懂。 只要是套cf的网站,用哪个IP连都可以吗?如果之前确定的这个IP突然不可用,怎么识别?

国外很多网站都在使用 Cloudflare CDN,但分配给中国内地访客的 IP 并不友好(延迟高、丢包多、速度慢)。 Cloudflare 公开了所有 IP 段 ,所以只要找到自己合适的IP,将DNS请求的IP替换掉,能大大改善连接速度。 问题1:是的,只要套了cf的都可以用这种方式 问题2:一般IP不可用的情况极少出现,所以我建议能提供两三个IP的返回 这种方式当然最好需要定期维护,我基本两三月会维护一次,但是它省去很多重复测速的情况。 我建议直接改造blacklist-ip,增加可自定返回IP的功能

PikuZheng commented 2 years ago

这不应该是路由器的事嘛。。只要是在cf的ip段中,就将目标重定向到另一个ip

Auska commented 2 years ago

这不应该是路由器的事嘛。。只要是在cf的ip段中,就将目标重定向到另一个ip

在路由解决也是可以的,但是很容易出现路由黑洞。这个IP就在CF的IP段中,很容易会导致TTL耗尽,却没有转发的情况出现。 在dns里面解决可能是更好的方式。

PikuZheng commented 2 years ago

路由黑洞?重定向不会改变路由表,为啥会黑洞。。。也可以配ip池,随机选择一个可用ip作为目标

Auska commented 2 years ago

路由黑洞?重定向不会改变路由表,为啥会黑洞。。。也可以配ip池,随机选择一个可用ip作为目标

套CF的IP的站点会返回CF的IP段里面的地址,然后规则会匹配所有CF的IP端,然后转发到事先选择的CF的IP,然后循环就开始了。

PikuZheng commented 2 years ago

mos那个例子也不完全对,cf是分免费段和付费段的,两个段并不互通

Auska commented 2 years ago

mos那个例子也不完全对,cf是分免费段和付费段的,两个段并不互通

我长期使用没发现什么问题,我会在稍后做些这方面的测试。我开这个issues的目的,是希望能增加IP段匹配的功能。

PikuZheng commented 2 years ago

套CF的IP的站点会返回CF的IP段里面的地址,然后规则会匹配所有CF的IP端,然后转发到事先选择的CF的IP,然后循环就开始了。

这个地址要先return啊ss就是这么处理的

上午去隔壁项目讨论了一番。在dns正确的情况下,cf默认拿到的两个ip和自主测速得到的ip,路由(路线和速度)是一样的。除非这两个ip都无法ping通,或位置非常离谱(比如我这里162段要绕美到澳)才需要换ip。 在这个前提下,配置多个上游和正确的edns并减小缓存甚至不缓存,尽可能获取到不同的ip比绑定一个IP不变的风险更小。

openips commented 2 years ago

没必要 定期更新address条目就可以

PikuZheng commented 2 years ago

定期更新address条目就可以

他的意思应该是针对域名不确定的情况

pymumu commented 2 years ago

smartdns不是有测速吗?测速不能满足要求?

Auska commented 2 years ago

smartdns不是有测速吗?测速不能满足要求?

感谢回复,我将smartdns用在我所管理的一个大型网络中(大概有10W~13W的设备),目前使用smartdns的效果很好,但我更希望返回的IP能够可控。

PikuZheng commented 2 years ago

smartdns不是有测速吗?测速不能满足要求?

cf比较特殊。默认情况下cf总是给出(cf认为是最优的)两个ip(付费网站是三个),对这两个ip进行测速没有意义。 这两个ip在中国大陆一般是104和172开头(德国)的,但104段被运营商针对,连通性很差(间歇丢包)。

为了保证连通性,强制换成cf的其他ip段ip可能更有意义。而且考虑到cf用户众多,对域名进行收集比较困难。

pymumu commented 2 years ago

你的意思应该是alias能力,就是返回的某些IP段的地址,用指定段的IP地址替换吧?

如下面dnsmasq的功能。 https://thekelleys.org.uk/dnsmasq/docs/dnsmasq-man.html

-V, --alias=[<old-ip>]|[<start-ip>-<end-ip>],<new-ip>[,<mask>]
Modify IPv4 addresses returned from upstream nameservers; old-ip is replaced by new-ip.   
If the optional mask is given then any address which matches the masked old-ip will be re-written. So,   
for instance --alias=1.2.3.0,6.7.8.0,255.255.255.0 will map 1.2.3.56 to 6.7.8.56 and 1.2.3.67 to 6.7.8.67.  
This is what Cisco PIX routers call "DNS doctoring". If the old IP is given as range, then only addresses in the range,   
rather than a whole subnet, are re-written. So  
 --alias=192.168.0.10-192.168.0.40,10.0.0.0,255.255.255.0 maps 192.168.0.10->192.168.0.40 to 10.0.0.10->10.0.0.40

但你说的可能new-ip就是一个ip段,并且是测速的?

但这个有风险是,如果映射的IP地址,cf入口没做anycast,就挂了。 我不清楚效果怎么样,有相关的实践?

PikuZheng commented 2 years ago

smartdns不是有测速吗?测速不能满足要求?

另一方面,直接屏蔽掉整个104段可能是更简单的方法。但是由于blacklist-list会丢弃包含匹配地址的完整结果,导致另一个172段的地址也被丢弃,无法返回任何结果。

但你说的可能new-ip就是一个ip段,并且是测速的?

newip是一个或几个特定的ip,有其他工具给出

pymumu commented 2 years ago

我的理解不知道对不对, 比如,国外域名A.com,用cf,但cdn没在国内,那么返回的地址返回可能是在国外,这样即使smartdns测速,也必然走国外。 国内域名B.com,也用cf,国内有cdn加速。国内的IP地址比较快。 因为cf有anycast技术,可以将A.com用B.com的地址来访问。这样速度就用国内了,避免走了国外。

所以这里的风险就是,是否所有域名都支持这么操作。

PikuZheng commented 2 years ago

是否所有域名都支持这么操作

证实支持。cf分为付费域名和免费域名,在付费段内的ip都通用,在免费ip段内的ip都通用。另有个别保留ip不能用

将A.com用B.com的地址来访问

原理上是对的,但此处不是用B.com的地址,而是一个确定的ip(这个ip由其他工具给出,可能不匹配任何域名)

57382 commented 1 year ago

相关,重复的 https://github.com/pymumu/smartdns/issues/1387 https://github.com/pymumu/smartdns/issues/1387

pymumu commented 8 months ago

最新代码已经支持 https://pymumu.github.io/smartdns/config/ip-alias/