有观看 Netflix 习惯的朋友应该都知道,VPN 或者梯子的 IP 很重要,IP 能够解锁 Netflix 是正常播放的必要条件之一。不过,因为诸多原因,我们可以不直接使用能够解锁奈飞的节点观影,而是将其架设为 DNS 服务,帮助其他原本无法解锁奈飞的客户端解锁、播放奈飞节目。这种方法不仅适用于奈飞,同样可以解锁 HBO、TVB、台湾bilibili等。原理很简单,就是通过将可解锁奈飞的 VPS A 部署为 DNS 服务,不可解锁奈飞的 B(客户端主机)的 DNS 服务器(nameserver)指向 A,A 劫持 B 对 Netflix 的解析请求, 自己扮演奈飞的角色并为 B 提供反向代理奈飞的服务。
这种方法广泛应用在奈飞等流媒体解锁领域,如 ExpressVPN 服务器网络就使用了这一方式保证了全网络节点的流媒体解锁,SNIProxy 等开源工具也一度非常流行。但是,这种方法需要付出双倍流量、不稳定、可能的滥用指控等代价。同时,最新的 nginx 1.24 中加入了对 IPv6 upstream 的支持,使得使用 nginx 部署这一服务相对更为灵活。本文分别就“老旧”的 SNIProxy 和较新的 nginx 1.24 搭建方案进行介绍,但同样会建议还没有 1 台 VPS 的小伙伴放弃折腾,直接 VPN 或代理机场走起。
适用对象
轻中度、普通用户
如果像作者一样没那么多精力死磕流媒体的轻中度用户,或者缺少专业知识、没有资源(VPS)储备的普通用户,还是花钱购买 VPN 或机场,省心省钱。这里做个小广告,推荐「ExpressVPN」和「DD 机场」。
重度用户、爱好者
如果是爱好者,可以在你的 VPS 上逐一尝试 SNIProxy 和 Nginx 方案,并做好自己动手解决一些问题的思想准备,包括稳定性问题、可能产生的运营商滥用(abuse)指控的应对。对于仅重度用户,依然推荐「ExpressVPN」,合理花费最经济最简单,应该避免去做维护服务器这种既不简单也不擅长的事。
SNIProxy方案
SNI 代理方面的开源项目有很多,这里以 SNIProxy 以及 SNIProxy 衍生脚本为例。
SNIProxy-dlundquist/sniproxy: Proxies incoming HTTP and TLS connections
SNIProxy一键安装脚本-myxuchangbin/dnsmasq_sniproxy_install
Netflix-proxy-ab77/netflix-proxy
快速安装
在可以正常解锁 Netflix 的 VPS 上,执行以下命令一键快速安装 Dnsmasq SNIProxy。
wget --no-check-certificate -O dnsmasq_sniproxy.sh https://raw.githubusercontent.com/myxuchangbin/dnsmasq_sniproxy_install/master/dnsmasq_sniproxy.sh && bash dnsmasq_sniproxy.sh -f
安装之后,可以使用 systemctl 命令查看 sniproxy 运行状态。
systemctl status sniproxy
注意事项
dnsutils安装
Dnsutils 是劫持并响应 dns 请求的关键,如解锁失败,可使用以下命令安装。
apt install dnsutils -y
端口放行与冲突解决
请确认防火墙放行 53、80、443,且确保其他服务没有占用 80、443 端口,以防端口冲突。尤其是 dns 53 端口,可以使用如下命令检查占用情况。
netstat -tlunp | grep 53 #检查占用情况
如 53 端口被系统占用,则停止 systemd-resolved 的前提下,修改 /etc/systemd/resolved.conf 配置文件。
systemctl stop systemd-resolved nano /etc/systemd/resolved.conf #... ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf systemctl restart systemd-resolved.service
/etc/systemd/resolved.conf 配置文件内容如下:
DNS=8.8.8.8 DNSStubListener=no
防止滥用
所有的解锁流量都将通过 SNI 代理 VPS 转发,所以务必设置访问控制规则,避免被滥用。
#丢弃所有请求 iptables -I INPUT -p tcp --dport 53 -j DROP iptables -I INPUT -p udp --dport 53 -j DROP #仅接受特定IP地址(a.b.c.d)的请求 iptables -I INPUT -s a.b.c.d --dport 53 -j ACCEPT #ufw allow from a.b.c.d port 53 proto tcp #ufw allow from a.b.c.d port 53 proto udp
最后,将主机上的 nameserver 指向 sniproxy 地址即可。如果主机系统为 linux,应将 resolv.conf 锁定开关打开,避免被 networkmanager、netplan 等守护进程重置。
chattr +i /etc/resolv.conf
Nginx方案
Nginx 方案中,nginx 代替了 sniproxy 的角色,结合 1.24+ 版本的 upstream 对 IPv6 的支持,可以更为高效的代理包括 netflix、hbo 甚至 disney+ 等在内的多种流媒体平台服务,对于玩 bgp 的小伙伴更友好。同时,使用 nginx 可以有效缓解恶意的扫描与探测。
第一步 安装 nginx
首先,确保系统中已安装 nginx,如未安装,debian/ubuntu 可使用以下命令安装,其他系统参考「官方文档」。
sudo apt install curl gnupg2 ca-certificates lsb-release debian-archive-keyring curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \ | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null gpg --dry-run --quiet --no-keyring --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \ http://nginx.org/packages/debian `lsb_release -cs` nginx" \ | sudo tee /etc/apt/sources.list.d/nginx.list echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n" \ | sudo tee /etc/apt/preferences.d/99nginx sudo apt update sudo apt install nginx
第二步 配置 nginx
全新安装的 nginx,可直接拷贝以下配置文件内容。
user www-data; worker_processes auto; pid /run/nginx.pid; error_log /var/log/nginx/error.log info; events { worker_connections 1024; } stream { log_format main '[$time_local] remoteAddr: $remote_addr ' 'serverAddr: $server_addr ' '$protocol status: $status sent: $bytes_sent recv: $bytes_received ' 'session_time: $session_time ' 'upstream_addr: $upstream_addr'; access_log /var/log/nginx/nginx-stream-access.log main; map $ssl_preread_server_name $filtered_sni_name { ~^(.*|)netflix\.com$ $ssl_preread_server_name; ~^(.*|)netflix\.net$ $ssl_preread_server_name; ~^(.*|)nflximg\.com$ $ssl_preread_server_name; ~^(.*|)nflximg\.net$ $ssl_preread_server_name; ~^(.*|)nflxvideo\.net$ $ssl_preread_server_name; ~^(.*|)nflxext\.com$ $ssl_preread_server_name; ~^(.*|)nflxso\.net$ $ssl_preread_server_name; ~^(.*|)fast\.com$ $ssl_preread_server_name; default "127.255.255.255"; } server { resolver 1.1.1.1 [2608:nnnn:mmmm::1] ipv4=off; # 根据需求改DNS,IPv4 修改 off 为 on #listen 127.0.0.1:443; # IPv4 使用此条,并将 127.0.0.1 替换为Private IPv4 listen [fe80::a]:443; # # IPv6 使用此条,并将 [fe80::a] 替换为Private IPv6 ssl_preread on; proxy_pass $filtered_sni_name:443; proxy_bind IP4_IP6; # IP4_IP6 同上修改 } }
第三步 安装、配置 dnsmasq
Debian 11+ 可以通过以下命令直接安装 dnsmasq。
apt install dnsmasq -y
接下来修改 dnsmasq 配置文件 /etc/dnsmasq.conf。使用 IPv4(1.2.3.4) 时删除所有 IPv6(fe80::1) 部分,使用 IPv6(fe80::1) 则删除所有 IPv4(1.2.3.4) 部分,并将对应的地址替换为解锁 VPS 实际的 Public IPv4 或IPv6。
domain-needed bogus-priv no-resolv no-poll all-servers server=8.8.8.8 server=8.8.4.4 cache-size=2048 local-ttl=60 interface=* address=/netflix.com/1.2.3.4 address=/netflix.net/1.2.3.4 address=/nflxvideo.net/1.2.3.4 address=/nflxext.com/1.2.3.4 address=/nflximg.com/1.2.3.4 address=/nflximg.net/1.2.3.4 address=/nflxso.net/1.2.3.4 address=/fast.com/1.2.3.4 address=/netflix.com/fe80::1 address=/netflix.net/fe80::1 address=/nflxvideo.net/fe80::1 address=/nflxext.com/fe80::1 address=/nflximg.com/fe80::1 address=/nflximg.net/fe80::1 address=/nflxso.net/fe80::1 address=/fast.com/fe80::1
配置文件修改完成后,重启 nginx、dnsmasq。
systemctl restart nginx systemctl restart dnsmasq
最后,为避免被滥用或盗用,还应配置防火墙对 443、53 端口的过滤规则,仅允许来自特定 IP 的请求并响应。
结语
无论使用 sniproxy 还是 nginx,都是私有化劫持(hijacking)服务,并且利用了 netflix 等流媒体平台的政策“漏洞”,肯定存在一定的风险。同时,由于涉及内容和版权,在无法保证私有化主动或被动公开化的情况下,各方面的打击会非常严厉。
从整体部署来看,关键在于 VPS 的 IP 地址是否原生,一般情况下,具有原生 IP 的 VPS 播放本区内容是没有问题的,但不少大厂的 IP CIDR 即使原生也可能被平台集体封禁,需要不断尝试。另外,在没有购买绑定住宅 IP 的前提下,不要尝试跨区观影,英文看美区、中文看新区足矣,数据中心 IP 长期跨区的结果就是封禁。
缺少动手能力或不想折腾的直接订阅「ExpressVPN」或原生解锁的「机场」。有关终端的配置,尤其是结合 clash 或 xray、sing-box 的规则,后续再进行分享。更多精彩,敬请关注老E的博客!
文章评论