K 机 DNS 解锁:dnsmasq 劫持 + sniproxy SNI 代理一键部署(含管理菜单)
这是什么
手里有一台流媒体解锁能力强的 VPS(本文叫 K 机),想让其他小鸡也蹭到它的解锁能力?办法:把 K 机做成专用 DNS。
- dnsmasq 监听 53 端口:把 Netflix / Disney+ / Prime Video / Dazn 等域名劫持到 K 机本机 IP,其他域名正常向上游(8.8.8.8 / 1.1.1.1)解析
- sniproxy 监听 443 端口:按 SNI 把流量代理到真实源站
- iptables:53 端口白名单制,只放行自家机器,其余 DROP(防止被扫成公共 DNS);443 放行
其他 VPS 只需把 DNS 指向 K 机,解锁测试直接变绿。IPv4 / IPv6 双栈可用。
部署步骤
- 把
kunlock.sh传到 K 机的/root/kunlock.sh - 执行下面两行:
- 选 1 安装:公网 IP 自动检测,白名单自动从现行 iptables 导入(已部署过的机器直接覆盖装即可,幂等)
- 选 6 运行状态,确认 dnsmasq / sniproxy 都是运行中
- 以后直接打
ku就能呼出管理菜单
chmod +x /root/kunlock.sh
/root/kunlock.sh管理菜单一览
- 1 安装
- 2 卸载(恢复原装:停服务、删配置、恢复原防火墙、卸载软件包)
- 3 / 4 / 5 开始 / 停止 / 重启
- 6 运行状态(菜单顶栏也常显两个服务状态)
- 7 查看白名单
- 8 编辑白名单(编号增删,支持多个、支持 1-3 区间,改完自动生效,不用重启服务)
- 9 客户端设置说明(复制粘贴即用)
- 0 退出
白名单说明
53 端口默认 DROP,只有白名单里的 IP 能查询。127.0.0.1 和本机 IP 默认在列。增删白名单走菜单 8,全自动重建防火墙规则并保存,重启机器也不丢。
客户端设置
在需要解锁的 VPS 上执行,复制粘贴即可:
chattr -i /etc/resolv.conf 2>/dev/null
cp -a /etc/resolv.conf /etc/resolv.conf.bak.kunlock
printf 'nameserver 157.20.104.98n' > /etc/resolv.conf
getent hosts www.netflix.comgetent 返回 K 机 IP 说明劫持生效,然后跑解锁测试脚本,看 Netflix / Disney+ 是否为 SG。
不需要解锁时,一行恢复原来 DNS:
cp -a /etc/resolv.conf.bak.kunlock /etc/resolv.conf注意:部分系统(DHCP / NetworkManager / systemd-resolved)会覆写 /etc/resolv.conf,若发现被改回,请在对应服务中锁定 DNS。
部署中踩过的坑
- Debian 的 dnsmasq 硬塞
--local-service:/usr/share/dnsmasq/init-system-common里写死了这个参数,公网来源的 DNS 查询会被静默丢弃(日志报ignoring query from non-local network),tcpdump 只见进包不见回包,极易误诊成防火墙问题。解法:配置里加listen-address,dnsmasq 会自动忽略--local-service,且升级不丢。 - sniproxy 的 systemd 误判:Debian 包的 unit 没写 Type,daemonize 后 systemd 显示 inactive,其实进程在正常监听。用 drop-in 覆盖
Type=forking+PIDFile解决。 - 443 端口重复绑定:sniproxy 不能同时
listen 0.0.0.0:443和listen [::]:443,会报 bind already in use,只留[::]:443双栈监听即可。 - resolv.conf 写不动:有的机器
/etc/resolv.conf带了chattr +i属性,root 也写不了,先chattr -i解锁。