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

2023-11-28 09:26:10 +08:00
 echoo00
背景:外企,有两条互联网线路,一条出口在国内,一条出口在日本;流量默认从日本走,DNS 默认是域控的地址,上游默认查询 8.8.8.8

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

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

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

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

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

man 5 resolver
K8dcnPEZ6V8b8Z6
2023-11-28 16:30:51 +08:00
考虑到配置难度,易用性,我感觉 adguard home 是最好的选择
fxxkgw
2023-11-28 17:08:24 +08:00
实际上是使用了 bind 服务的 ecs 功能
Tumblr
2023-11-28 17:37:31 +08:00
@echoo00 #28 这是沟通问题,不是技术问题。如果是这样的话,即使你通过技术手段实现了 DNS 分流,还是会被总部以合规问题来 challenge ,出力不讨好。
我认为,正确的处理渠道是,引导遇到这些问题的 end user 集中找 IT 报障,然后由你们的 IT 去找总部沟通。
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


```

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/995812

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX