相信很多小伙伴买美国、日本、新加坡的机器用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 + Nginx,配置流媒体域名 → 自身公网 IPv4,其他域名回落到
- 更复杂但是解析效果最好:未解锁机本地也装 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 模块。
- 配置默认上游DNS
- 在DNS列表里按 U,可以按 A 添加推荐的
1.1.1.1/8.8.8.8
- 在DNS列表里按 U,可以按 A 添加推荐的
- 创建“解锁机分组”
- 分组页按 n:组名如 UnlockHost,DNS 地址可留空(本分组不走上游)。
- 进入该分组,按 m 切换为 address,按 e 填 ident=本机公网 IPv4(若未自动填充)。
- 勾选要解锁的平台
- 左侧切 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。
- 按 q 退出UI后
未解锁机器接入,两个方案二选一
- 方案 A(直接DNS,比较方便):把系统 DNS 指向解锁机
- Linux(systemd-resolved):
- sudo resolvectl dns eth0 <解锁机IP>。
- 验证:
- dig +short www.netflix.com @<解锁机IP> 返回应为“解锁机公网 IPv4”(或具体平台域名亦然,根据你勾选的解锁服务)。
- 未解锁机的节点连接后,访问对应平台应显示为目标区。
- Linux(systemd-resolved):
- 方案 B:本地 SmartDNS nameserver 到解锁机
- 本机也装本工具;配置默认上游DNS。
1.1.1.1/8.8.8.8 - 新建分组SG,选跟之前解锁机勾选的一样的平台并保存。
- 本机系统 DNS 指向本机 127.0.0.1(按 z 进入服务管理,选覆盖系统DNS → 127.0.0.1)。
- 本机也装本工具;配置默认上游DNS。
究极白嫖怪
大家可以利用 强大的搜索引擎找到各个地区的 SNI Proxy 实例: FOFA。根据世界地图,选择自己喜欢的地区,找的一两个可以访问的IP。
这个原理是,有一些人搭建了SNI Proxy,但是没有使用防火墙仅允许自己的机器使用这些SNI Proxy服务。也就是搭建了解锁服务,但是暴露给所有人,这会引来其他人的白嫖,建议使用
ufw对非自己的IP屏蔽。
实测可用的IP
有了这些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 <IP,如203.0.113.10> to any port 80sudo ufw allow proto tcp from <IP,如203.0.113.10> 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 <SERVER_IP>: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 /<domain or regex>/ -group <GroupName> - 示例:
nameserver /.netflix.com/ -group US
- 语法:
- 指定固定地址解析(address)
- 语法:
address /<domain or regex>/ <IPv4> - 示例:
address /.netflix.com/ 203.0.113.10
- 语法:
- 指定上游分组解析(nameserver)
- “解锁机”用的分组(让所有选中域名直接解析到这台机器的公网 IPv4)
#> unlock special address 203.0.113.5
address /.netflix.com/ 203.0.113.5
address /.hulu.com/ 203.0.113.5
#< unlock
这个脚本工具使用形如
#> <region> <ident>与#<之间的内容为本工具管理(删除/重写时靠这对注释识别)。
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,也能用的顺畅





glzjin's blog
文章评论