DNS解锁一键脚本:小鸡解锁流媒体和AI

很多小伙伴买美国、日本、新加坡的机器用AI,买香港的机器刷帖子,看网页。还见过很多商家提供一些DNS解锁的服务。

我们的痛点是,因为某些地区原因或IP质量的原因,无法访问一些流媒体网站或AI网站,但是解锁地区的机器买不起或者延迟较高。

常见的解决方案有:

  1. 客户端分流:Clash或V2rayN等客户端支持用域名或IP进行分流的操作,用不同节点访问不同的站点,实现解锁的需求。
  2. 服务端分流:Xray, singbox等主流节点搭建工具支持在服务端进行分流,基于域名或IP进行”链式代理”(使用ss等代理再转发一遍流量到落地节点)
  3. 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 命令进行启动

  1. 安装组件(按 z → Nginx/SmartDNS)
  2. 配置默认上游DNS
  3. 创建“解锁机分组”
    • 分组页按 n:组名如 UnlockHost,DNS 地址可留空(本分组不走上游)。
    • 进入该分组,按 m 切换为 address,按 e 填 ident=本机公网 IPv4(若未自动填充)。
      image image2561×1627 158 KB
  4. 勾选要解锁的平台
    • 左侧切 Region,右侧选平台。被其他分组占用会显示“! 分组名”,不可选。
    • 按空格选中,再按一次取消选中。
  5. 按 s 保存
  6. 开放端口与服务状态(如果你有用云厂商的安全组)
    • 开放入站 53/UDP、80/TCP、443/TCP;确认 SmartDNS/Nginx 处于 active(UI 顶部有状态)。
    • SmartDNS“启动”不会覆盖系统 DNS;解锁机不要使用 覆盖系统 DNS (会导致流量一直转发在自己身上出不去)
  7. 验证(在解锁机上)
    • 按 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)。
      image image2561×1632 147 KB

究极白嫖怪

大家可以利用 强大的搜索引擎找到各个地区的 SNI Proxy 实例: FOFA。根据世界地图,选择自己喜欢的地区,找的一两个可以访问的IP。

这个原理是,有一些人搭建了SNI Proxy,但是没有使用防火墙仅允许自己的机器使用这些SNI Proxy服务。也就是搭建了解锁服务,但是暴露给所有人,这会引来其他人的白嫖,建议使用ufw对非自己的IP屏蔽。

实测可用的IP

有了这些IP,你可以在单机上直接实现解锁!

在“单机”上配置

  1. 打开工具,进入DNS 分组列表
    • 首次使用可通过 z 菜单安装 SmartDNS。无需安装本机 Nginx。
  2. 为每个地区创建一个分组
    • 在分组页面按 n,输入分组名(建议用地区名,例如 US、JP、UK)。
    • 进入该分组后:
      • 按 m 将解析方式切换为 address。
      • 按 e 把 ident 设置为“该地区 sniproxy 的公网 IPv4”(例如 203.0.113.10)。
    • 提示:这是“按域名把流量直接解析到远端 sniproxy”的意思,本机不做代理。
  3. 勾选各分组要解锁的平台
    • 左侧选择 Region(区域分类),右侧勾选具体平台。
  4. 按 s 保存
    • 如果 SmartDNS 正在运行,会提示是否重启以生效;建议立即重启。
  5. 让客户端使用这台“单机”的 DNS
    • 本机自用:用工具的“覆盖系统 DNS”功能把系统 DNS 改成 127.0.0.1。
    • 验证:
      • dig +short www.netflix.com @127.0.0.1 应返回某个地区 sniproxy 的公网 IPv4(你在 address 里填的 IP)。
      • 访问对应平台,平台应按该地区出网判断。

防白嫖,防火墙

先用 apt install ufw 确保安装ufw

  1. 先确保不会把自己锁在门外:开放 SSH
    • sudo ufw allow OpenSSH
  2. 允许你自己未解锁机器的 IP 访问 80/443
    • sudo ufw allow proto tcp from <IP,如203.0.113.10> to any port 80
    • sudo ufw allow proto tcp from <IP,如203.0.113.10> to any port 443
  3. 拒绝其他来源访问 80/443(若之前放开过,需要删除旧规则)
    • 查看编号:sudo ufw status numbered
    • 删除任何“80/tcp ALLOW Anywhere”“443/tcp ALLOW Anywhere”之类的规则:sudo ufw delete <编号>
  4. 全局默认策略(推荐默认拒绝)
    • sudo ufw default deny incoming
    • sudo ufw default allow outgoing
  5. 启用或重载 UFW
    • 首次启用:sudo ufw enable
    • 已启用则:sudo ufw reload
  6. 验证
    • 本机查看: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-group
      • server 8.8.8.8 -group US -exclude-default-group
    • 默认(非分组)回退 DNS(按照从上到下的顺序生效):
      • server 9.9.9.9
      • server 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
  • “解锁机”用的分组(让所有选中域名直接解析到这台机器的公网 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,也能用的顺畅。

© 版权声明
THE END
喜欢就支持一下吧
点赞13 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容