1
zbatman 2023-11-28 09:30:11 +08:00
mosdns ?
|
2
FrankAdler 2023-11-28 09:45:14 +08:00 via Android
dnsmasq 也可以做到,iptables 重定向 dns 也能做的
|
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 |
4
artnowben 2023-11-28 09:50:54 +08:00
部署一个内网 DNS 服务器,在服务器上去实现这个特性
|
5
lifei6671 2023-11-28 09:58:07 +08:00
你说的是 SmartDNS 吧,支持自定义分组解析,自定义域名解析。
|
6
crac 2023-11-28 09:59:09 +08:00
SmartDNS 可以 我就这么用的, 各家的服务用各家自己的 DNS, 效果非常好
|
7
tool2d 2023-11-28 09:59:45 +08:00
弄个软路由可以做到,我在公司的出口安装了一个 IP 包过滤器,自己写了一个 DNS UDP 抢答模块,只要是国内的域名不查询网络,直接用缓存里数据就返回了。
如果你自己电脑用,干脆写一个 hosts 文件管理,定期更新,更简单。 |
8
sadfQED2 2023-11-28 10:00:18 +08:00 via Android
|
9
echoo00 OP 多谢各位的建议,我去试一下各位提到的方案先
|
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 数据库。
|
11
mouyase 2023-11-28 10:48:04 +08:00
adguard home 也能实现(
|
12
stcQ2G13k9yxep40 2023-11-28 10:49:19 +08:00
@qishouvip2022 我现在的做法是虚拟化平台上,新建两台虚拟机,同时部署了 Smartdns 和 Openwrt (开启 Mosdns ),AD 域的 DNS 服务器的转发器设置为 Smartdns 和 Openwrt 的 IP 。
|
13
A1188 2023-11-28 11:01:16 +08:00 via Android
|
14
yyzh 2023-11-28 11:04:41 +08:00 via Android
同外企,我们用的是 CITIC 的网络解决方案,DNS 和分流全都由他们处理好.
|
15
echoo00 OP 目前是我自己用,只能在自己的笔记本上折腾,企业级的方案有不少,但很多东西都要总部来决定,总部又觉得我国是一个管控比较严的国家,也怕泄密,管理员权限都不给我们,没办法部署其他服务器,或者添加其他设备
|
16
Mrealy 2023-11-28 11:16:22 +08:00
@yyzh #14 我公司也用他们的线路也没有看到他们有啥 DNS 方案,我们自建 DNS 的用的 dnsmasq 加 dnsforward
|
17
Puteulanus 2023-11-28 11:17:04 +08:00
https://www.appinn.com/acrylic/
Windows 的我们之前用过这个,作为最前面的分流 DNS ,顺便可以支持通配 hosts |
18
yyzh 2023-11-28 11:26:15 +08:00 via Android
|
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 的功能集中在一台设备上。 |
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 。啥都不用安装。 |
21
uncat 2023-11-28 12:43:41 +08:00
然后在 DHCP 服务器上,将默认的 DNS 地址从网关,改为这台 Linux 的内网 IP 即可。
|
22
uncat 2023-11-28 12:44:53 +08:00
如果只是自己的 Windows 设备需要 DNS 分流,通过 PowerShell 添加 NRPT 规则即可。如果是内部团队的需求,则可以考虑采用第二种方案。
|
23
xenme 2023-11-28 12:49:01 +08:00 via iPhone
mosdns ,全部可以自定义,之前软路由一直用的这个
|
24
nkloveni 2023-11-28 13:21:33 +08:00
听起来有个非常简单的办法,就是你直接在财务的电脑手工设置一下 DNS ,指向你那个 223.5.5.5 就行了,不用折腾别的
|
25
yyysuo 2023-11-28 13:22:38 +08:00
当然是 Adguard Home 了,可以根据客户端指定 dns ,这个需求简单,不需要搞 mosdns 或者 smartdns 那么麻烦。
|
26
Tumblr 2023-11-28 13:35:10 +08:00
对于 multi-site 的公司,如果你们的 DNS 没做 anycast ,首先建议的是对于不同 site 的设备,在 DHCP 上直接指派不同的 DNS 服务器,然后 DNS 服务器在本地出局,这个是最简单也是最易行,也是最常用的方式。
如果以上方案在你们公司难以落地,建议参照 @uncat #20 的提议,在域控上下发个策略,给到相应的电脑,通过 NRPT 实现。 |
27
echoo00 OP @nkloveni 完全不可行,手动指向外部,内网所有资源,还有被 GFW 墙的资源就访问不了;另外财务没有权限去改系统的设置
|
29
uncat 2023-11-28 14:01:08 +08:00
在财务小姐姐的电脑上,PowerShell 管理员权限,执行添加一条 NRPT 规则的命令就行了(规则长期生效的)。
规则指定的域名(也就是你说的域名池)将会使用规则 IP 指定的 DNS 服务器来解析域名,否则采用默认的 DNS 服务器解析。(注意,截图中域名前的 . 不可省略) 参考这张截图中的命令: https://x.com/jinmiaoluo/status/1723948812224360585?s=20 |
30
echoo00 OP @uncat 这个看到了,但域名列表有一大堆,他能指定文件吗?比如我建和 txt 文档,这个 txt 文档里的域名全从 223.5.5.5 去查
|
31
rrfeng 2023-11-28 14:18:56 +08:00
dnsproxy 就可以。
adguardhome 的内核也是 dnsproxy 。 |
32
pagxir 2023-11-28 14:25:01 +08:00 via Android
最简单的还是用 PAC 吧
|
33
mantouboji 2023-11-28 14:31:01 +08:00
|
35
life90 2023-11-28 15:54:06 +08:00
其实你可以劫持 DNS ,放过 AD 域名即可。反一下思维方向。
|
36
lululau 2023-11-28 16:10:29 +08:00
这个不是系统自带的功能吗
man 5 resolver |
37
K8dcnPEZ6V8b8Z6 2023-11-28 16:30:51 +08:00
考虑到配置难度,易用性,我感觉 adguard home 是最好的选择
|
38
fxxkgw 2023-11-28 17:08:24 +08:00 via Android
实际上是使用了 bind 服务的 ecs 功能
|
39
Tumblr 2023-11-28 17:37:31 +08:00
@echoo00 #28 这是沟通问题,不是技术问题。如果是这样的话,即使你通过技术手段实现了 DNS 分流,还是会被总部以合规问题来 challenge ,出力不讨好。
我认为,正确的处理渠道是,引导遇到这些问题的 end user 集中找 IT 报障,然后由你们的 IT 去找总部沟通。 |
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 ``` |
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 规则,恢复初始状态。 |
43
datocp 2023-11-28 20:41:25 +08:00 via Android
这是根据 openwrt wiki 配置成功的 dnsmasq 配置
上面针对单机,下面针对静态 vlan 。但是很怀疑仅靠 dns 不改网络就有效果。 平时更习惯用 socks5 挂浏览器解决,只是 ie 看起来有点麻烦。 |
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 |
46
echoo00 OP @Tumblr 不好意思,没看到你 30 楼的回复;
针对这个只要我提个申请,我的上级同意我个人在本机上使用这些软件就合规了;目前只是想做个测试,如果测试通过,其他同事想用,那我可以写个 SOP 给到 helpdesk ,让用户申请,然后 helpdesk 去部署,毕竟现在只有财务和 HR 的一小部分人有提出这种需求 |
47
jiaqiliu 2023-12-01 00:10:12 +08:00
Windows 用户的话:
1 、用 20 楼说的 Windows 内置的 NRPT Rules ,维护起来不太直观,但是功能都有 2 、yogadns |
48
jiaqiliu 2023-12-01 00:12:01 +08:00
|