V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
echoo00
V2EX  ›  DNS

请教下有没有这样一种 DNS 解析工具,可能定义地址池的,根据地址池的不同,使用不同的公共 DNS 来解析?

  •  
  •   echoo00 · 361 天前 · 4949 次点击
    这是一个创建于 361 天前的主题,其中的信息可能已经有所发展或是发生改变。
    背景:外企,有两条互联网线路,一条出口在国内,一条出口在日本;流量默认从日本走,DNS 默认是域控的地址,上游默认查询 8.8.8.8

    遇到的问题:因为所有的 DNS 查询默读都是从日本出去的,返回的 IP 地址也绝大多数是国外的 IP ,这样访问国内一些政府网站,或者比较大的有 CDN 的网站时,默认就是日本绕回来访问,一些网站的样式无法正常显示;财务和 HR 同事日常使用这类系统/网站比较多,有较多的抱怨,临时方案是拉了条 ADSL 线他们用,要上国内网站就连这条 ADSL 放出来的 SSID ;

    需求:有没有一个 wiin 系统下的软件,可以自定义一个域名池,这个池子里的域名固定去 223.5.5.5 解析,其他默认的该怎么走怎么走
    网络上有负载均衡设备可以实现上述功能,但目前公司不太愿意投资,我只是想方便我自己使用,来找这么一个软件测试下,谢谢!
    49 条回复    2023-12-01 09:19:43 +08:00
    zbatman
        1
    zbatman  
       361 天前
    mosdns ?
    FrankAdler
        2
    FrankAdler  
       361 天前 via Android
    dnsmasq 也可以做到,iptables 重定向 dns 也能做的
    soukiya
        3
    soukiya  
       361 天前 via iPhone
    DNS 分流? Mac 和 iOS 下好实现,类似于你的要求的?: https://github.com/VirgilClyne/GetSomeFries/wiki/%F0%9F%8C%90-DNS#%E7%AE%80%E4%BB%8B
    Win 端 Clash 的 fake ip 也能够实现 DNS 分流:
    https://blog.lv5.moe/p/use-dns-to-create-split-routing-for-different-domain-or-ip-ranges
    artnowben
        4
    artnowben  
       361 天前
    部署一个内网 DNS 服务器,在服务器上去实现这个特性
    lifei6671
        5
    lifei6671  
       361 天前
    你说的是 SmartDNS 吧,支持自定义分组解析,自定义域名解析。
    crac
        6
    crac  
       361 天前
    SmartDNS 可以 我就这么用的, 各家的服务用各家自己的 DNS, 效果非常好
    tool2d
        7
    tool2d  
       361 天前
    弄个软路由可以做到,我在公司的出口安装了一个 IP 包过滤器,自己写了一个 DNS UDP 抢答模块,只要是国内的域名不查询网络,直接用缓存里数据就返回了。

    如果你自己电脑用,干脆写一个 hosts 文件管理,定期更新,更简单。
    sadfQED2
        8
    sadfQED2  
       361 天前 via Android
    echoo00
        9
    echoo00  
    OP
       361 天前
    多谢各位的建议,我去试一下各位提到的方案先
    stcQ2G13k9yxep40
        10
    stcQ2G13k9yxep40  
       361 天前
    内网中搭建 Smartdns 或 Mosdns 分流服务,AD 域的 DNS 服务器中把首选转发器设置为分流 DNS 的地址,然后分流服务中设置好上游 DNS 服务器(国内 223.5.5.5/119.29.29.29 )和远程 DNS 服务器(国外 8.8.8.8/1.1.1.1 ),然后每天更新 GeoIP & GeoSite 数据库。
    mouyase
        11
    mouyase  
       361 天前
    adguard home 也能实现(
    stcQ2G13k9yxep40
        12
    stcQ2G13k9yxep40  
       361 天前
    @qishouvip2022 我现在的做法是虚拟化平台上,新建两台虚拟机,同时部署了 Smartdns 和 Openwrt (开启 Mosdns ),AD 域的 DNS 服务器的转发器设置为 Smartdns 和 Openwrt 的 IP 。
    A1188
        13
    A1188  
       361 天前 via Android
    yyzh
        14
    yyzh  
       361 天前 via Android
    同外企,我们用的是 CITIC 的网络解决方案,DNS 和分流全都由他们处理好.
    echoo00
        15
    echoo00  
    OP
       361 天前
    目前是我自己用,只能在自己的笔记本上折腾,企业级的方案有不少,但很多东西都要总部来决定,总部又觉得我国是一个管控比较严的国家,也怕泄密,管理员权限都不给我们,没办法部署其他服务器,或者添加其他设备
    Mrealy
        16
    Mrealy  
       361 天前
    @yyzh #14 我公司也用他们的线路也没有看到他们有啥 DNS 方案,我们自建 DNS 的用的 dnsmasq 加 dnsforward
    Puteulanus
        17
    Puteulanus  
       361 天前
    https://www.appinn.com/acrylic/
    Windows 的我们之前用过这个,作为最前面的分流 DNS ,顺便可以支持通配 hosts
    yyzh
        18
    yyzh  
       361 天前 via Android
    @Mrealy 那可能是你们的套餐不支持或者客户经理没说?我们这的客户经理特别提醒过要把域 DNS 的上游调成他们的 DNS.
    kursk
        19
    kursk  
       361 天前
    linux 下使用 dnsmasq + (nftables)iptables + ipset 可以完美解决

    dnsmasq 的配置如下

    server=/facebook.net/8.8.8.8#53
    nftset=/facebook.net/4#inet#wgcross#crs_dst

    server=/163.net/223.5.5.5#53
    nftset=/163.net/4#inet#wgcross#cn

    server 和 nftset 是 dnsmasq 的两个配置项,server 项的作用是收到 dns 请求后进行匹配(可按照域名级别进行匹配),比如上面例子中*.facebook.net 的域名都被转发给 8.8.8.8 解析,并且将解析的 ip 写入 nftables 中的 wgcross 表的 crs_dst set 进行存储,然后路由表当然也要设置,我的例子如下

    chain PREROUTING { # handle 2
    type nat hook prerouting priority filter; policy accept;
    ip daddr { 23.95.146.49, 65.49.219.226, 193.22.152.174 } accept # handle 4
    ip daddr { 0.0.0.0/8, 10.0.0.0/8, 127.0.0.0/8, 169.254.0.0/16, 172.16.0.0/12, 192.168.0.0/16, 224.0.0.0-255.255.255.255 } accept # handle 6
    ip daddr @cn accept # handle 8
    ip daddr @crs_dst counter name "cnt_cross" meta mark set 0x00000009 accept # handle 10
    }

    最后两个路由条目,cn set 针对国内的路由,命中这个 set 中的路由就返回上级 chain(及走国内线路),而另一个 crs_dst set 会 mark 0x9 ,然后在 ip route 中挑出来走海外线路

    这个技术路线,必须 DNS\route gateway 的功能集中在一台设备上。
    uncat
        20
    uncat  
       361 天前
    Windows 原生支持 DNS 分流,叫做 NRPT Rules 参考: https://x.com/jinmiaoluo/status/1723948812224360585?s=20

    Linux 也是原生支持 DNS 分流的,你可以在内网,随便一台 Linux ,通过 systemd 内置的 systemd-resolved 配置好分流规则后,作为一台内网 DNS proxy 。啥都不用安装。
    uncat
        21
    uncat  
       361 天前
    然后在 DHCP 服务器上,将默认的 DNS 地址从网关,改为这台 Linux 的内网 IP 即可。
    uncat
        22
    uncat  
       361 天前
    如果只是自己的 Windows 设备需要 DNS 分流,通过 PowerShell 添加 NRPT 规则即可。如果是内部团队的需求,则可以考虑采用第二种方案。
    xenme
        23
    xenme  
       361 天前 via iPhone
    mosdns ,全部可以自定义,之前软路由一直用的这个
    nkloveni
        24
    nkloveni  
       361 天前
    听起来有个非常简单的办法,就是你直接在财务的电脑手工设置一下 DNS ,指向你那个 223.5.5.5 就行了,不用折腾别的
    yyysuo
        25
    yyysuo  
       361 天前
    当然是 Adguard Home 了,可以根据客户端指定 dns ,这个需求简单,不需要搞 mosdns 或者 smartdns 那么麻烦。
    Tumblr
        26
    Tumblr  
       361 天前
    对于 multi-site 的公司,如果你们的 DNS 没做 anycast ,首先建议的是对于不同 site 的设备,在 DHCP 上直接指派不同的 DNS 服务器,然后 DNS 服务器在本地出局,这个是最简单也是最易行,也是最常用的方式。
    如果以上方案在你们公司难以落地,建议参照 @uncat #20 的提议,在域控上下发个策略,给到相应的电脑,通过 NRPT 实现。
    echoo00
        27
    echoo00  
    OP
       361 天前
    @nkloveni 完全不可行,手动指向外部,内网所有资源,还有被 GFW 墙的资源就访问不了;另外财务没有权限去改系统的设置
    echoo00
        28
    echoo00  
    OP
       361 天前
    @Tumblr 企业级的解决方案很多,我自己也实施过不少,但是不能落地啊,总部不支持,也不信任中国区域
    uncat
        29
    uncat  
       361 天前
    在财务小姐姐的电脑上,PowerShell 管理员权限,执行添加一条 NRPT 规则的命令就行了(规则长期生效的)。

    规则指定的域名(也就是你说的域名池)将会使用规则 IP 指定的 DNS 服务器来解析域名,否则采用默认的 DNS 服务器解析。(注意,截图中域名前的 . 不可省略)

    参考这张截图中的命令: https://x.com/jinmiaoluo/status/1723948812224360585?s=20
    echoo00
        30
    echoo00  
    OP
       361 天前
    @uncat 这个看到了,但域名列表有一大堆,他能指定文件吗?比如我建和 txt 文档,这个 txt 文档里的域名全从 223.5.5.5 去查
    rrfeng
        31
    rrfeng  
       361 天前
    dnsproxy 就可以。
    adguardhome 的内核也是 dnsproxy 。
    pagxir
        32
    pagxir  
       361 天前 via Android
    最简单的还是用 PAC 吧
    mantouboji
        33
    mantouboji  
       361 天前
    Windows 下不知道,但是我用的 ChinaDNS-NG 效果非常好。你可以用一个单独的小盒子或者虚拟机去跑。

    https://github.com/zfl9/chinadns-ng
    Mrealy
        34
    Mrealy  
       361 天前
    @yyzh #18 用你上面的 DNS 确实可以做到分游,以后 DNS 分流有问题可以用这个应急了。
    life90
        35
    life90  
       361 天前
    其实你可以劫持 DNS ,放过 AD 域名即可。反一下思维方向。
    lululau
        36
    lululau  
       360 天前
    这个不是系统自带的功能吗

    man 5 resolver
    K8dcnPEZ6V8b8Z6
        37
    K8dcnPEZ6V8b8Z6  
       360 天前
    考虑到配置难度,易用性,我感觉 adguard home 是最好的选择
    fxxkgw
        38
    fxxkgw  
       360 天前 via Android
    实际上是使用了 bind 服务的 ecs 功能
    Tumblr
        39
    Tumblr  
       360 天前
    @echoo00 #28 这是沟通问题,不是技术问题。如果是这样的话,即使你通过技术手段实现了 DNS 分流,还是会被总部以合规问题来 challenge ,出力不讨好。
    我认为,正确的处理渠道是,引导遇到这些问题的 end user 集中找 IT 报障,然后由你们的 IT 去找总部沟通。
    uncat
        40
    uncat  
       360 天前
    @echoo00 思路:

    通过 PowerShell 实现一个函数来维护操作的逻辑。

    1. 读取特定路径的 domain.txt 来管理规则
    2. 实现 Add 操作的逻辑,NRPT 规则不存在则添加
    3. 实现 Add 操作的逻辑,NRPT 规则存在则更新
    4. 实现 Add 操作的逻辑,NRPT 规则多余则删除
    5. 实现 Clean 操作的逻辑,清理本机所有 NRPT 规则,恢复初始状态。

    代码如下:

    ```powershell

    param (
    [string]$Action = "Add", # 可以是 Add 或 Clean
    [string]$FilePath = ".\domains.txt", # 包含域名的文件路径
    [string]$NameServer = "192.168.188.2" # 默认的 DNS 服务器地址
    )

    function Manage-NrptRuleFromFile {
    param (
    [string]$Action,
    [string]$FilePath,
    [string]$NameServer
    )

    # 读取文件中的域名,添加前缀 '.'
    $fileNamespaces = Get-Content $FilePath | ForEach-Object { "." + $_ }

    switch ($Action) {
    "Get" {
    $rules = Get-DnsClientNrptRule
    if ($rules) {
    Write-Host "Current NRPT rules:"
    $rules | Format-Table -Property Namespace, NameServers
    } else {
    Write-Host "No NRPT rules found"
    }
    }
    "Add" {
    # 获取当前所有的 NRPT 规则
    $currentRules = Get-DnsClientNrptRule

    # 添加或更新规则
    foreach ($ns in $fileNamespaces) {
    $rule = $currentRules | Where-Object { $_.Namespace -eq $ns }
    if ($rule) {
    if ($rule.NameServers -ne $NameServer) {
    Set-DnsClientNrptRule -Name $rule.Name -NameServers $NameServer
    Write-Host "Updated NRPT rule for $ns $NameServer"
    }
    } else {
    Add-DnsClientNrptRule -Namespace $ns -NameServers $NameServer
    Write-Host "Added NRPT rule for $ns"
    }
    }

    # 清除不在文件中的规则
    $currentRules | Where-Object { $fileNamespaces -notcontains $_.Namespace } | ForEach-Object {
    Remove-DnsClientNrptRule -Name $_.Name
    Write-Host "Removed NRPT rule for $($_.Namespace)"
    }
    }
    "Clean" {
    Get-DnsClientNrptRule | Remove-DnsClientNrptRule -Force
    Write-Host "Cleaned all NRPT rules"
    }
    default {
    Write-Host "Invalid action: $Action"
    }
    }
    }

    # 调用 Manage-NrptRuleFromFile 函数
    Manage-NrptRuleFromFile -Action $Action -FilePath $FilePath -NameServer $NameServer

    # 示例用法
    # 将内容保存为 nrpt.ps1 文件,在 CWD 内添加一份 domains.txt ,每个域名一行,比如:
    # example-01.com
    # example-02.com
    # example-03.com
    #
    # 指定 NameServer 地址
    # .\nrpt.ps1 -NameServer "10.0.0.2"
    #
    # 指定文件地址
    # .\nrpt.ps1 -FilePath ".\another-domains.txt"
    #
    # 清除所有规则
    # .\nrpt.ps1 -Action Clean


    ```
    uncat
        41
    uncat  
       360 天前
    上面的代码格式化有点问题,可以看 Gist: https://gist.github.com/jinmiaoluo/6a8eb9176bac7f06eaf6fa8ba6866a37

    思路:

    1. 读取特定路径的 domain.txt 来管理规则
    2. 实现 Add 操作的逻辑,NRPT 规则不存在则添加
    3. 实现 Add 操作的逻辑,NRPT 规则存在则更新
    4. 实现 Add 操作的逻辑,NRPT 规则多余则删除
    5. 实现 Clean 操作的逻辑,清理本机所有 NRPT 规则,恢复初始状态。
    uncat
        42
    uncat  
       360 天前
    @Livid 麻烦删除 #40 影响阅读了,#41 提供了 Gist 用于阅读。
    datocp
        43
    datocp  
       360 天前 via Android
    这是根据 openwrt wiki 配置成功的 dnsmasq 配置

    上面针对单机,下面针对静态 vlan 。但是很怀疑仅靠 dns 不改网络就有效果。

    平时更习惯用 socks5 挂浏览器解决,只是 ie 看起来有点麻烦。
    datocp
        44
    datocp  
       360 天前 via Android
    dhcp-host=44:8a:5b:xx:xx:xx,xx,192.168.1.100,2h,set:green
    #dhcp-option=tag:green,3,192.168.1.254
    #dhcp-option=tag:green,6,211.140.13.188,211.140.188.188
    #dhcp-host=44:8a:5b:28:5d:e0,xx,net:green,192.168.1.100,3h
    #dhcp-option=net:green,6,211.140.13.188

    #v3
    dhcp-range=v3,192.168.98.10,192.168.98.250,2h
    dhcp-option=v3,3,192.168.98.254
    dhcp-option=v3,6,192.168.99.253
    echoo00
        45
    echoo00  
    OP
       360 天前
    @uncat 多谢大佬,我找新建台虚拟机测试一下
    echoo00
        46
    echoo00  
    OP
       359 天前
    @Tumblr 不好意思,没看到你 30 楼的回复;
    针对这个只要我提个申请,我的上级同意我个人在本机上使用这些软件就合规了;目前只是想做个测试,如果测试通过,其他同事想用,那我可以写个 SOP 给到 helpdesk ,让用户申请,然后 helpdesk 去部署,毕竟现在只有财务和 HR 的一小部分人有提出这种需求
    jiaqiliu
        47
    jiaqiliu  
       358 天前
    Windows 用户的话:
    1 、用 20 楼说的 Windows 内置的 NRPT Rules ,维护起来不太直观,但是功能都有
    2 、yogadns
    jiaqiliu
        48
    jiaqiliu  
       358 天前
    yogadns 的官方截图,基本跟你要的一样

    https://www.yogadns.com/screen2.png

    https://www.yogadns.com/screen1.png
    echoo00
        49
    echoo00  
    OP
       358 天前
    @jiaqiliu 30 刀。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2874 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 07:55 · PVG 15:55 · LAX 23:55 · JFK 02:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.