Akasoent
V2EX  ›  DNS

多运营商环境下,自建内网 DNS 有什么好的方案么?

  •  
  •   Akasoent · 18h 23m ago · 1879 views
    多运营商接入。之前内网用 adguardhome 容器一直没问问题。
    现在多运营商接入。内网中部分机器只用联通,部分机器只用电信。。。。。
    每个运营商都分配了不同的内网网段。
    adguardhome 容器添加了多个网桥,每个网桥都有着独立的内网 IP ,分配给不同的运营商。

    现在问题是 adguardhome 访问上游 DNS 服务器时只用一条运营商的出口。
    具体来说,无论内网机器用联通、电信的内网访问 adguardhome ,adguardhome 都用只用移动的出口访问 DNS 服务器。结果返回的 DNS 查询全是移动的 IP 。

    此外
    用电信的机器访问 adguardhome 时,如果缓存中已经有了联通的解析结果,adguardhome 会直接使用这个缓存。导致缓存相互污染。

    除了为每个运营商单独配置一个 DNS 服务器外,还有什么方案能解决这个问题么?
    Supplement 1  ·  13h 9m ago
    很多人压根没意识到问题所在。。。。。。。。。

    假设联通内网 10.0.0.0/24 ,移动 10.0.1.0/24 ,电信 10.0.2.0/24

    内网 DNS 服务器有三个网卡,三个网卡分别接入这三个网段。
    内网 DNS 的三个 IP 都是 10.0.x.10/24

    某个联通机器( 10.0.0.55 )向内网 DNS ( 10.0.0.10 )查询。这一步没有任何问题。
    但是内网 DNS ( 10.0.0.10 )向公共 DNS 查询时走哪个出口没法指定,这是一个完全独立的连接,走的是容器内默认的路由表。默认走电信( 10.0.2.10 ),DNS 查询返回的自然全是电信的 IP 。

    DNS 递归查询时,adguardhome 没法控制从哪来的 DNS 请求再从哪个网卡出去。

    =========================================================================================
    用了 15L 的方法解决了。
    adguardhome 中为每个运营商分配不同的客户端。每个客户端指定不同的上游 DNS 服务器。然后路由器上面为不同的 DNS 服务器指定出口(仅限 V4 )

    具体来说
    举个例子:adguardhome 中为联通的机器配置 223.5.5.5 ,电信的机器配置 114.114.114.114 。
    无所谓 adguardhome 走哪个出口。
    路由器中目的地址是 114.114.114.114 的强制走电信出口,223.5.5.5 的强制走联通出口。

    V6 在容器内用脚本手动指定出口,每次容器启动后会自动在容器内执行。
    ip -6 route replace <目标 V6> via <v6 网关(用 fe80 即可))> dev <网卡名>

    例如让阿里 DNS 的 V6 地址 2400:3200:baba::1 强制走网卡 adh_CUCC 。fe80::223:1123:2:f25 是下一跳的地址,也就是内网联通 IPv6 的网关。
    ip -6 route replace 2400:3200:baba::1 via fe80::223:1123:2:f25 dev adh_CUCC
    23 replies  •  2026-11-10 23:09:58 +08:00
    Coolsir
    Coolsir
    17h 54m ago
    1
    这种问题直接问 AI
    Akasoent
    Akasoent
    OP
    17h 45m ago
    2
    @Coolsir
    AI 已读乱回
    duoluo1234
    duoluo1234
    17h 38m ago
    3
    让 ai 修,或者自己创建分流组,网桥没啥用
    xdzhang
    xdzhang
    17h 36m ago
    4
    我记得爱快有个多线 DNS 另外 smartdns 有个多线 DNS 可以根据返回速度选择 dns 具体你可以尝试下
    v1
    v1
    17h 33m ago
    5
    每个运营商单独配置一个 adguardhome 实列是最优最省事的。🎉
    Akasoent
    Akasoent
    OP
    17h 27m ago
    6
    @xdzhang
    这个不行,返回最快的不一定是线路对的。smartdns 同样解决不了缓存相互污染的问题。
    Akasoent
    Akasoent
    OP
    17h 25m ago
    7
    @v1
    就是不想为每个运营商单独配置。才看看有没有别的方案。
    改成这样不但要维护几个 dns 服务器,一堆防火墙和路由表还要重写。
    zhcode
    zhcode
    17h 18m ago
    8
    https://github.com/svenshi/oxidns
    根据机器 ip 做分流,使用匹配器 matcher 匹配 client_ip
    https://oxidns.org/plugin-reference/matcher/request#client_ip

    例如 10.0.0.100-10.0.0.150 走移动的上游 dns ,10.0.0.151-10.0.0.200 走电信的上游 dns
    duoluo1234
    duoluo1234
    17h 7m ago
    9
    我 ros ,靠目标 ip 走哪个出口
    Akasoent
    Akasoent
    OP
    17h 5m ago
    10
    @zhcode
    大致扫了一眼,看起来还行,但文档中没有提 IPv6 环境下的 client_ip 配置。
    IPv6 前后缀都是动态的,没法手动写死。不打算用 Nat6 方案。
    找时间折腾下看看。
    Akasoent
    Akasoent
    OP
    17h 2m ago
    11
    @duoluo1234
    大兄弟,你完全没有理解问题所在。
    举个例子,假设目标 IP 是 223.5.5.5 你说该走哪个出口?
    v1
    v1
    16h 57m ago
    12
    @Akasoent 😂祝你好运。我是折腾了一圈之后发现多实例更好维护,什么防火墙路由表都是小事情,后期出现波动卡顿,要排查测试的时候就知道”多么痛的领悟“了。
    Akasoent
    Akasoent
    OP
    16h 46m ago
    13
    @v1
    不是的,我这线路配置比较复杂,多条宽带公用一个路由器,内网有 VLan 交换机。V4 、V6 防火墙+路由表超过 150 条规则,当时学习这玩意的时候什么各种线路冗余、劫持所有内网 DNS 请求全部到自建的 DNS 服务器。。。。。一堆规则全上了,我现在都看不懂自己当时写了什么😂。。。。。。
    sleepm
    sleepm
    16h 46m ago
    14
    客户端 标识符可以使用 cidr
    可以设置上游缓存
    hubaq
    hubaq
    16h 40m ago
    15
    新建客户端 里面有一个上游 DNS 配置,你可以联通机器走联通 DNS ,电信机器走电信 DNS ,然后路由层面联通和电信 DNS 分别走对应的运营商出口出去
    adoal
    adoal
    16h 37m ago
    16
    是不是可以把只用电信的接到电信内网,只用联通的接到联通内网,然后两边的路由器之间再连一个/30 的小网段,做静态路由实现内网间互通。这样各方都简单。
    Akasoent
    Akasoent
    OP
    16h 32m ago
    17
    @hubaq
    是个办法。
    但这种情况下只能为联通,电信设置不同的 DNS 服务器。如果都用 223.5.5.5 依旧有问题。
    importcode
    importcode
    16h 27m ago
    18
    部署多个 adguardhome 监听在不同的 ip 上 ,分别给联通与电信使用不就好了么
    duoluo1234
    duoluo1234
    16h 19m ago
    19
    用标识符,cidr ,和 dns 没关系,他只解析,外加 ecs 那更稳了
    SenLief
    SenLief
    15h 18m ago via iPhone
    20
    adg 支持不同网段配置独立的 dns 解析,把局域网不同服务商的网段区分一下 cidr ,需要开启独立缓存。
    Ipsum
    Ipsum
    15h 11m ago
    21
    docker 开 3 个服务呗,dhcp 按网段指派 dns 。又不费资源。
    Akasoent
    Akasoent
    OP
    13h 8m ago
    22
    @v1
    已经解决了,用了 15L 的方法
    yijiangchengming
    23
    oxidns 写配置根据不同的来源使用不同的 dns 服务器,甚至可以和 ros 联动,自动运营商路由
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1125 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 77ms · UTC 23:09 · PVG 07:09 · LAX 15:09 · JFK 18:09
    ♥ Do have faith in what you're doing.