相信很多小伙伴买美国、日本、新加坡的机器用 AI,买香港的机器刷帖子,看网页。还见过很多商家提供一些 DNS 解锁的服务。
我们的痛点是,因为某些地区原因或 IP 质量的原因,无法访问一些流媒体网站或 AI 网站,但是解锁地区的机器买不起或者延迟较高。
常见的解决方案有:
- 客户端分流:Clash 或 V2rayN 等客户端支持用域名或 IP 进行分流的操作,用不同节点访问不同的站点,实现解锁的需求。
- 服务端分流:Xray, singbox 等主流节点搭建工具支持在服务端进行分流,基于域名或 IP 进行 "链式代理"(使用 ss 等代理再转发一遍流量到落地节点)
- DNS 解锁:基于 DNS 去进行流量分发。用 SmartDNS 工具制定分流规则,指定的流量转发到解锁机器,解锁机器转发到真正的网站。
让客户端对流媒体平台的实际 TCP/HTTP 流量绕道你的 “解锁机”,由解锁机再转发到真正的流媒体服务器,让对端看到的是 “解锁机” 的出口 IP。
当然,DNS 解锁和服务端解锁其实也没有完全的区分,节点搭建工具也支持在配置文件中指定 > 域名对应的 DNS 服务器,你可以同时使用服务端分流和 DNS 解锁。
DNS 解锁
本质上就是用 SmartDNS 等 DNS 分流工具,对 “特定域名集合(流媒体平台域名)” 给出 “特定答案”,从而把客户端的连接引导到你希望的目标。
在我们搭建的过程中,会直接把这些域名解析为解锁机的 IP ,让所有连接先打到解锁机。
实现方式:
Nginx
- HTTPS:stream + ssl_preread 直通(基于 SNI 的四层代理),保持原始 SNI,不解密。
- HTTP:80 端口反向代理,Host 头透传。
DNS 解锁负责 “把流量绕过来”,Nginx 负责 “把流量转出去”。两者缺一不可。
推荐安装方法:
- 直接 DNS 修改:让 “未解锁机器” 的系统 DNS 直指 “解锁机” 的 SmartDNS
解锁机:SmartDNS + Nginx,配置流媒体域名 → 自身公网 IPv4,其他域名回落到 1.1.1.1 等公共 DNS。
未解锁机:把系统 DNS 指向解锁机 IP。这样流媒体域名解析结果就是 “解锁机的 IPv4”,实际 TCP/HTTPS 也会打到解锁机,由 Nginx 转发。
- 更复杂但是解析效果最好:未解锁机本地也装 SmartDNS,分流流媒体域名解析为 “解锁机 IP” 其他正常域名走
1.1.1.1等公共 DNS。
为什么说第二种更好?
因为某些 Geo-DNS 会根据 DNS 查询源 IP 返回更优结果。如果全部查询使用 DNS 解锁机器的 IP 进行 DNS 查询,最坏情况是:
香港的机器查询 google.com 的 IP,解锁机在美国返回美国的谷歌 IP。原本香港接入谷歌的 2ms 延迟飙升到 200ms。
从零开始:配置解锁机(在目标地区的 VPS)
我这里使用两台机器做演示:
- 解锁机 SG 159.223.86.13
- 未解锁机 AU 170.64.197.111
一键脚本下载命令(开源地址:oneclick_smartdns):
curl -fsSL https://raw.githubusercontent.com/kilvil/oneclick_smartdns/main/oneclick.sh | bash
用 smartdnsctl 命令进行启动
- 安装组件(按 z → Nginx/SmartDNS)
安装 SmartDNS;安装 Nginx(nginx-extras),确保加载 stream 模块。
image2561×1630 144 KB
- 配置默认上游 DNS
在 DNS 列表里按 U,可以按 A 添加推荐的 1.1.1.1/8.8.8.8
image2561×1609 152 KB
- 创建 “解锁机分组”
分组页按 n:组名如 UnlockHost,DNS 地址可留空(本分组不走上游)。
进入该分组,按 m 切换为 address,按 e 填 ident = 本机公网 IPv4(若未自动填充)。
image2561×1627 158 KB
- 勾选要解锁的平台
左侧切 Region,右侧选平台。被其他分组占用会显示 “! 分组名”,不可选。
按空格选中,再按一次取消选中。
- 按 s 保存
- 开放端口与服务状态(如果你有用云厂商的安全组)
开放入站 53/UDP、80/TCP、443/TCP;确认 SmartDNS/Nginx 处于 active(UI 顶部有状态)。
SmartDNS “启动” 不会覆盖系统 DNS;解锁机不要使用 覆盖系统 DNS(会导致流量一直转发在自己身上出不去)
- 验证(在解锁机上)
按 q 退出 UI 后 nginx -t 检查 nginx 配置文件是否正常systemctl status smartdns nginx 两个服务都是 active。
未解锁机器接入,两个方案二选一
- 方案 A(直接 DNS,比较方便):把系统 DNS 指向解锁机
Linux(systemd-resolved):
sudo resolvectl dns eth0 <解锁机 IP>。
验证:
dig +short www.netflix.com @<解锁机 IP> 返回应为 “解锁机公网 IPv4”(或具体平台域名亦然,根据你勾选的解锁服务)。
未解锁机的节点连接后,访问对应平台应显示为目标区。
- 方案 B:本地 SmartDNS nameserver 到解锁机
本机也装本工具;配置默认上游 DNS。1.1.1.1/8.8.8.8
新建分组 SG,选跟之前解锁机勾选的一样的平台并保存。
本机系统 DNS 指向本机 127.0.0.1(按 z 进入服务管理,选覆盖系统 DNS → 127.0.0.1)。
image2561×1632 147 KB
究极白嫖怪
大家可以利用 强大的搜索引擎找到各个地区的 SNI Proxy 实例: FOFA。根据世界地图,选择自己喜欢的地区,找的一两个可以访问的 IP。
这个原理是,有一些人搭建了 SNI Proxy,但是没有使用防火墙仅允许自己的机器使用这些 SNI Proxy 服务。也就是搭建了解锁服务,但是暴露给所有人,这会引来其他人的白嫖,建议使用 ufw 对非自己的 IP 屏蔽。
实测可用的 IP
JP: 140.238.50.134
有了这些 IP,你可以在单机上直接实现解锁!
在 “单机” 上配置
- 打开工具,进入 DNS 分组列表
首次使用可通过 z 菜单安装 SmartDNS。无需安装本机 Nginx。
- 为每个地区创建一个分组
在分组页面按 n,输入分组名(建议用地区名,例如 US、JP、UK)。
进入该分组后:
按 m 将解析方式切换为 address。
按 e 把 ident 设置为 “该地区 sniproxy 的公网 IPv4”(例如 203.0.113.10)。
提示:这是 “按域名把流量直接解析到远端 sniproxy” 的意思,本机不做代理。
- 勾选各分组要解锁的平台
左侧选择 Region(区域分类),右侧勾选具体平台。
- 按 s 保存
如果 SmartDNS 正在运行,会提示是否重启以生效;建议立即重启。
- 让客户端使用这台 “单机” 的 DNS
本机自用:用工具的 “覆盖系统 DNS” 功能把系统 DNS 改成 127.0.0.1。
验证:
dig +short www.netflix.com @127.0.0.1 应返回某个地区 sniproxy 的公网 IPv4(你在 address 里填的 IP)。
访问对应平台,平台应按该地区出网判断。
防白嫖,防火墙
先用 apt install ufw 确保安装 ufw
- 先确保不会把自己锁在门外:开放 SSH
sudo ufw allow OpenSSH
- 允许你自己未解锁机器的 IP 访问 80/443
sudo ufw allow proto tcp from to any port 80sudo ufw allow proto tcp from to any port 443
- 拒绝其他来源访问 80/443(若之前放开过,需要删除旧规则)
查看编号:sudo ufw status numbered
删除任何 “80/tcp ALLOW Anywhere”“443/tcp ALLOW Anywhere” 之类的规则:sudo ufw delete <编号>
- 全局默认策略(推荐默认拒绝)
sudo ufw default deny incomingsudo ufw default allow outgoing
- 启用或重载 UFW
首次启用:sudo ufw enable
已启用则:sudo ufw reload
- 验证
本机查看:sudo ufw status verbose
允许端测试(你的未解锁机器):openssl s_client -connect :443 -servername www.example.com -brief
底层原理
这个小脚本本质上是用来方便大家操作配置 SmartDNS 的分流规则,让大家能够不需要考虑到底这个流媒体用的是什么域名,只需要按照平台去选择配置即可。大家也可以通过简单的命令去验证整个过程,在配置完后,看看配置文件长什么样子。
配置文件:
- SmartDNS
主配置: /etc/smartdns/smartdns.conf
DNS 缓存: /etc/smartdns/cache
进程与服务: systemctl status smartdns
- Nginx
主配置: /etc/nginx/nginx.conf
HTTP 站点: /etc/nginx/conf.d/*.conf
Stream (四层) 站点: /etc/nginx/stream.d/*.conf(在主配置里 include 引用)
动态模块目录: /usr/lib/nginx/modules
模块加载 include: /etc/nginx/modules-enabled/*.conf
日志: /var/log/nginx/access.log, /var/log/nginx/error.log
SmartDNS 配置要点与示例
- 推荐基础选项(已经默认添加了的):
dualstack-ip-selection no
speed-check-mode none
serve-expired yes
serve-expired-reply-ttl 3
serve-expired-prefetch-time 21600
prefetch-domain yes
cache-size 32768
cache-persist yes
cache-file /etc/smartdns/cache
cache-checkpoint-time 86400
- 定义上游 DNS 组
示例:把 1.1.1.1、8.8.8.8 放进名为 US 的独立分组
server 1.1.1.1 -group US -exclude-default-groupserver 8.8.8.8 -group US -exclude-default-group
默认(非分组)回退 DNS(按照从上到下的顺序生效):
server 9.9.9.9server 114.114.114.114
- 域名规则(两种方式,二选一)
指定上游分组解析(nameserver)
语法:nameserver // -group
示例:nameserver /.netflix.com/ -group US
指定固定地址解析(address)
语法:address //
示例:address /.netflix.com/ 203.0.113.10
- “解锁机” 用的分组(让所有选中域名直接解析到这台机器的公网 IPv4)
#> unlock special address 203.0.113.5
address /.netflix.com/ 203.0.113.5
address /.hulu.com/ 203.0.113.5
#< unlock
这个脚本工具使用形如 #> 与 #< 之间的内容为本工具管理(删除 / 重写时靠这对注释识别)。
Nginx 配置原理
由于 Nginx 默认安装后不带 stream 模块,我们使用了动态模块加载的形式去使用这个功能。
- stream 模块
模块的文件位置:/usr/lib/nginx/modules/ngx_stream_module.so
主配置里面使用 include /etc/nginx/modules-enabled/*.conf 动态导入模块;
在 /etc/nginx/modules-enabled/50-mod-stream.conf 添加:
load_module /usr/lib/nginx/modules/ngx_stream_module.so;
- 在主配置里 include stream 目录
在 /etc/nginx/nginx.conf 末尾添加:
stream { include /etc/nginx/stream.d/*.conf; }
- HTTPS SNI 直通
/etc/nginx/stream.d/smartdns_stream.conf 示例:
map $ssl_preread_server_name $proxy_host {
default $ssl_preread_server_name;
}
server {
listen 443 reuseport;
proxy_pass $proxy_host:443;
resolver 1.1.1.1 8.8.8.8 valid=10s;
resolver_timeout 5s;
ssl_preread on;
proxy_ssl_server_name on;
}
这里使用 1.1.1.1, 8.8.8.8 意味着解锁机用这个 DNS 去连接最终的目标站点,如果你有一台商家提供 DNS 解锁的机器,可以嵌套 DNS 解锁!也就是在这里加上商家的 DNS 解锁服务地址!(其他的未解锁机器也可以用上这个 DNS 解锁)
- HTTP 80 反向代理更为简单一些,属于 Nginx 基本功能(Host 透传)
/etc/nginx/conf.d/smartdns_http.conf 示例:
map $host $http_upstream {
default $host;
}
server {
listen 80;
resolver 1.1.1.1 8.8.8.8 valid=10s;
resolver_timeout 5s;
location / {
proxy_set_header Host $host;
proxy_pass http://$http_upstream:80;
}
}
有没有必要上 DNS 解锁呢?
我个人觉得,在商家提供了 DNS 解锁的前提下,你用来给其他机器嵌套解锁或者简单的 DNS 分流,搞 DNS 解锁还是非常不错的。
个别流媒体不仅对地区有限制,还对 IP 质量有限制,在你机器不多的情况下,嵌套解锁最大化利用了商家提供的 DNS 解锁!
其他时候如果你去自建 DNS 解锁意义其实没有很大,地区不多,还要担心因为 IP 质量的下降,原本解锁机的解锁也掉了~
相信大家肯定也有过学习客户端分流规则的经历:
- 原本只会手动开关代理,在局域网和外网之间繁琐切换 → 学会直连 / 代理的规则配置,省去手动开关
- 原本只会手动切节点,在延迟和解锁之间得不到满足 → 学会按照站点分流,不同站点用不同节点连接
相信你在完成自己的 DNS 解锁后,也能够像第一次学会分流规则那样,醍醐灌顶,爱不释手。
原本需要给手机,电脑,软路由配置节点分流 → 现在服务端一次配置,全部生效(当然,Clash 订阅也能实现)
原本嫌弃香港小鸡用不了 AI → 现在离不开香港的低延迟,DNS 解锁各个 AI,也能用的顺畅。
Comments NOTHING