mosdns icon indicating copy to clipboard operation
mosdns copied to clipboard

[Feature request] ecs插件支持动态设置或加载ipv4, 解决VPN内网下DNS的CDN问题

Open xiaolei0125 opened this issue 2 years ago • 5 comments

希望添加的功能

在ecs插件中可以支持动态设置或加载ipv4地址

type: "ecs"
args:
  auto: false                         # 是否自动将用户请求的来源地址作为 ECS 附加到请求。
  ipv4: 'provider:my_ecs_ip.'         # 预设的 IPv4 地址。会优先附加在 A 请求里。

需求背景:

  • 架设环境:mosdns架设在内网,手机在移动或WIFI网络上使用WireGuard VPN连接到内网,并使用mosdns作为VPN的DNS,用来访问内网的服务,以及分流去广告等。
  • 面临问题:手机端访问国内网站使用自身的移动网络, 不走VPN, 但DNS是通过家里宽带网络的mosdns解析,对4G或其他WIFI网络CDN效果不佳。而且手机app通过VPN内网访问mosdns, mosdns无法获取DNS请求报文携带的公网出口源IP, 无法直接使用ecs插件的auto功能。而且手机是移动的使用的网络环境不同,所以ecs的ipv4是无法固定或预设的。
  • 解决办法: 自己编写代码获取VPN下手机的移动网络出口IP, 将出口IP保存到my_ecs_ip.txt文件,然后通过ecs插件的ipv4: 'provider:my_ecs_ip.' 自动加载, 如果ecs ipv4能支持provider的话。

总结说明:

  • mosdns的架构设计非常优秀,目前使用mosdns几乎能满足我所有DNS相关的需求。非常感谢@IrineSistiana 提供这么好的软件!
  • 大多数使用VPN的场景下,通过VPN网络访问内网的mosdns, 应该都会面临这种CDN的问题,希望ecs插件能提供相关的支持,谢谢!

xiaolei0125 avatar Jul 26 '22 03:07 xiaolei0125

#264 [Feature request] 远程动态数据更新 如果可以支持远程动态更新ecs插件中的ipv4地址,那么也可以满足这个需求,无需支持动态加载provider:my_ecs_ip

xiaolei0125 avatar Jul 26 '22 05:07 xiaolei0125

我的理解,你应该是想加个访问者IP判断的功能,如果访问IP来自你的手机IP,则强制修改ECS为你手机公网IP子网段。 给你提供一种临时的解决思路,使用不同的端口创建两个不同的main_sequence, 例如main_sequence_a和main_sequence_b 其中一个main_sequence_b的全部ECS判定,子网IP设置为你的手机IP段 手机去访问main_sequence_b的端口,应该可以解决你的问题

pmkol avatar Jul 26 '22 14:07 pmkol

我的理解,你应该是想加个访问者IP判断的功能,如果访问IP来自你的手机IP,则强制修改ECS为你手机公网IP子网段。 给你提供一种临时的解决思路,使用不同的端口创建两个不同的main_sequence, 例如main_sequence_a和main_sequence_b 其中一个main_sequence_b的全部ECS判定,子网IP设置为你的手机IP段 手机去访问main_sequence_b的端口,应该可以解决你的问题

@pmkol 判断访问者可以通过query_matcher插件的client_ip功能实现,因为手机VPN模式下访问内网DNS时client ip是固定的。

我需要解决的问题是手机漫游到不同的网络(4G或WIFI), 访问国内的CDN网站时,由于DNS是内网modns解析的,CDN不是最优的。需要使用mosdns的ecs插件ipv4字段能动态设置上不同网络(4G或WIFI)的出口公网IP或subnet. 目前ecs插件的ipv4地址是事先配置好固定的。

xiaolei0125 avatar Jul 27 '22 06:07 xiaolei0125

我的理解,你应该是想加个访问者IP判断的功能,如果访问IP来自你的手机IP,则强制修改ECS为你手机公网IP子网段。 给你提供一种临时的解决思路,使用不同的端口创建两个不同的main_sequence, 例如main_sequence_a和main_sequence_b 其中一个main_sequence_b的全部ECS判定,子网IP设置为你的手机IP段 手机去访问main_sequence_b的端口,应该可以解决你的问题

@pmkol 判断访问者可以通过query_matcher插件的client_ip功能实现,因为手机VPN模式下访问内网DNS时client ip是固定的。

我需要解决的问题是手机漫游到不同的网络(4G或WIFI), 访问国内的CDN网站时,由于DNS是内网modns解析的,CDN不是最优的。需要使用mosdns的ecs插件ipv4字段能动态设置上不同网络(4G或WIFI)的出口公网IP或subnet. 目前ecs插件的ipv4地址是事先配置好固定的。

用上面的方法,建立两个不同的main_sequence,把其中一个设置为你手机专用的,即所有ECS都是你手机的子网IP,这样不能解决么?

pmkol avatar Jul 27 '22 14:07 pmkol

@pmkol 手机通过VPN网络访问内网的mosdns, ecs插件获取的是内网ip,而不是手机的公网ip出口,ecs使用内网ip无意义。我是通过其他途径获取到手机公网出口ip, 需要动态通过ecs插件设置ip

xiaolei0125 avatar Jul 27 '22 15:07 xiaolei0125