Akasoent
V2EX  ›  DNS

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

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

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

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

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