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

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

  •  
  •   echoo00 · 2023-11-28 09:26:10 +08:00 · 4953 次点击
    这是一个创建于 365 天前的主题,其中的信息可能已经有所发展或是发生改变。
    背景:外企,有两条互联网线路,一条出口在国内,一条出口在日本;流量默认从日本走,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  
       2023-11-28 09:30:11 +08:00
    mosdns ?
    FrankAdler
        2
    FrankAdler  
       2023-11-28 09:45:14 +08:00 via Android
    dnsmasq 也可以做到,iptables 重定向 dns 也能做的
    soukiya
        3
    soukiya  
       2023-11-28 09:45:39 +08:00 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  
       2023-11-28 09:50:54 +08:00
    部署一个内网 DNS 服务器,在服务器上去实现这个特性
    lifei6671
        5
    lifei6671  
       2023-11-28 09:58:07 +08:00
    你说的是 SmartDNS 吧,支持自定义分组解析,自定义域名解析。
    crac
        6
    crac  
       2023-11-28 09:59:09 +08:00
    SmartDNS 可以 我就这么用的, 各家的服务用各家自己的 DNS, 效果非常好
    tool2d
        7
    tool2d  
       2023-11-28 09:59:45 +08:00
    弄个软路由可以做到,我在公司的出口安装了一个 IP 包过滤器,自己写了一个 DNS UDP 抢答模块,只要是国内的域名不查询网络,直接用缓存里数据就返回了。

    如果你自己电脑用,干脆写一个 hosts 文件管理,定期更新,更简单。
    sadfQED2
        8
    sadfQED2  
       2023-11-28 10:00:18 +08:00 via Android
    echoo00
        9
    echoo00  
    OP
       2023-11-28 10:02:10 +08:00
    多谢各位的建议,我去试一下各位提到的方案先
    stcQ2G13k9yxep40
        10
    stcQ2G13k9yxep40  
       2023-11-28 10:47:17 +08:00
    内网中搭建 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  
       2023-11-28 10:48:04 +08:00
    adguard home 也能实现(
    stcQ2G13k9yxep40
        12
    stcQ2G13k9yxep40  
       2023-11-28 10:49:19 +08:00
    @qishouvip2022 我现在的做法是虚拟化平台上,新建两台虚拟机,同时部署了 Smartdns 和 Openwrt (开启 Mosdns ),AD 域的 DNS 服务器的转发器设置为 Smartdns 和 Openwrt 的 IP 。
    A1188
        13
    A1188  
       2023-11-28 11:01:16 +08:00 via Android
    yyzh
        14
    yyzh  
       2023-11-28 11:04:41 +08:00 via Android
    同外企,我们用的是 CITIC 的网络解决方案,DNS 和分流全都由他们处理好.
    echoo00
        15
    echoo00  
    OP
       2023-11-28 11:15:46 +08:00
    目前是我自己用,只能在自己的笔记本上折腾,企业级的方案有不少,但很多东西都要总部来决定,总部又觉得我国是一个管控比较严的国家,也怕泄密,管理员权限都不给我们,没办法部署其他服务器,或者添加其他设备
    Mrealy
        16
    Mrealy  
       2023-11-28 11:16:22 +08:00
    @yyzh #14 我公司也用他们的线路也没有看到他们有啥 DNS 方案,我们自建 DNS 的用的 dnsmasq 加 dnsforward
    Puteulanus
        17
    Puteulanus  
       2023-11-28 11:17:04 +08:00
    https://www.appinn.com/acrylic/
    Windows 的我们之前用过这个,作为最前面的分流 DNS ,顺便可以支持通配 hosts
    yyzh
        18
    yyzh  
       2023-11-28 11:26:15 +08:00 via Android
    @Mrealy 那可能是你们的套餐不支持或者客户经理没说?我们这的客户经理特别提醒过要把域 DNS 的上游调成他们的 DNS.
    kursk
        19
    kursk  
       2023-11-28 11:36:32 +08:00
    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  
       2023-11-28 12:42:54 +08:00
    Windows 原生支持 DNS 分流,叫做 NRPT Rules 参考: https://x.com/jinmiaoluo/status/1723948812224360585?s=20

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

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

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

    https://github.com/zfl9/chinadns-ng
    Mrealy
        34
    Mrealy  
       2023-11-28 14:53:59 +08:00
    @yyzh #18 用你上面的 DNS 确实可以做到分游,以后 DNS 分流有问题可以用这个应急了。
    life90
        35
    life90  
       2023-11-28 15:54:06 +08:00
    其实你可以劫持 DNS ,放过 AD 域名即可。反一下思维方向。
    lululau
        36
    lululau  
       2023-11-28 16:10:29 +08:00
    这个不是系统自带的功能吗

    man 5 resolver
    K8dcnPEZ6V8b8Z6
        37
    K8dcnPEZ6V8b8Z6  
       2023-11-28 16:30:51 +08:00
    考虑到配置难度,易用性,我感觉 adguard home 是最好的选择
    fxxkgw
        38
    fxxkgw  
       2023-11-28 17:08:24 +08:00 via Android
    实际上是使用了 bind 服务的 ecs 功能
    Tumblr
        39
    Tumblr  
       2023-11-28 17:37:31 +08:00
    @echoo00 #28 这是沟通问题,不是技术问题。如果是这样的话,即使你通过技术手段实现了 DNS 分流,还是会被总部以合规问题来 challenge ,出力不讨好。
    我认为,正确的处理渠道是,引导遇到这些问题的 end user 集中找 IT 报障,然后由你们的 IT 去找总部沟通。
    uncat
        40
    uncat  
       2023-11-28 18:21:30 +08:00
    @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  
       2023-11-28 18:27:56 +08:00
    上面的代码格式化有点问题,可以看 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  
       2023-11-28 20:05:51 +08:00
    @Livid 麻烦删除 #40 影响阅读了,#41 提供了 Gist 用于阅读。
    datocp
        43
    datocp  
       2023-11-28 20:41:25 +08:00 via Android
    这是根据 openwrt wiki 配置成功的 dnsmasq 配置

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

    平时更习惯用 socks5 挂浏览器解决,只是 ie 看起来有点麻烦。
    datocp
        44
    datocp  
       2023-11-28 20:41:36 +08:00 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
       364 天前
    @uncat 多谢大佬,我找新建台虚拟机测试一下
    echoo00
        46
    echoo00  
    OP
       363 天前
    @Tumblr 不好意思,没看到你 30 楼的回复;
    针对这个只要我提个申请,我的上级同意我个人在本机上使用这些软件就合规了;目前只是想做个测试,如果测试通过,其他同事想用,那我可以写个 SOP 给到 helpdesk ,让用户申请,然后 helpdesk 去部署,毕竟现在只有财务和 HR 的一小部分人有提出这种需求
    jiaqiliu
        47
    jiaqiliu  
       363 天前
    Windows 用户的话:
    1 、用 20 楼说的 Windows 内置的 NRPT Rules ,维护起来不太直观,但是功能都有
    2 、yogadns
    jiaqiliu
        48
    jiaqiliu  
       363 天前
    yogadns 的官方截图,基本跟你要的一样

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

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