SNIProxy+Dnsmasq实现Netflix-Proxy
一般来说,只要通过一键安装Netflix-Proxy即可实现,但是在部分场景,比如Nat中转的机器,没有对外暴露IPv4的vps,以及openVZ的机器,都无法通过一键实现,同时也了解一下Netflix-Proxy背后实际的实现方式。
我们要做的是,在一台有原生IP,或者可以访问Netflix/DisneyPlus的VPS上,搭建Dnsmasq和SNIProxy来供其它VPS做跳板。
比如,有一台H机搭建了Hysteria,另外一台X机搭建了SNIProxy+Dnsmasq做跳板。现在实际有两种实现方式
A方案
需要在H机上将所有Netflix的站点的DNS解析都指向X机,这里不管是使用AdGuard,或者直接修改H机上/etc/下dns的解析都可以。
X机上的SNIProxy会listen对外暴露的80端口和443端口,然后做反向代理,SNIProxy可以设置table来实现对哪些域名做反向代理。
X机上的SNIProxy在反代Netflix之后,再返回给H机,就实现了H跳X访问Netflix解锁。
B方案
H机上的DNS的nameserver统一改为X机,同样,不管是AdGuard还是直接修改/etc/下的dns解析,只留一个nameserver为X机。
这样,H机上的DNS解析就全部交给X机了,X机的Dnsmasq在接收到H机的解析请求,也就是53端口的访问,会进行劫持,并且在Dnsmasq通过配置对Netflix的访问统统都指向X机自己。
X机的SNIProxy在接收到Netflix访问之后进行反代。这里和A方案的第2步第3步相同。
A方案和B方案相同的地方是,X机的SNIProxy处理是一样的,区别就在谁来对Netflix做DNS解析。
A方案:H机访问Netflix —> H机解析Netflix为X机 —> H机认为Netflix为X机并进行访问 —> X机SNIProxy反代Netflix
B方案:H机访问Netflix —> H机发现DNS服务器为X机 —> H机将Netflix域名发送给X机 —> X机Dnsmasq进行劫持 —> X机将Netflix解析为自己(X机)并返回给H机 —> H机认为Netflix为X机并进行访问 —> X机SNIProxy反代Netflix
在这里可以看出,A方案实际已经不需要X机上安装Dnsmasq做域名解析,直接简单粗暴地在H机上将特定域名或者IP指向X机即可。
关于Dnsmasq配置的一点疑问和解惑
在X机上配置了Dnsmasq之后,实际X机本身已经作为一台DNS服务器了,但这个配置并不会对X机自身正常访问网站进行干扰。
在B方案中,H机请求X机的53端口,也就是请求了X机的Dnsmasq服务。但X机自己的outbound出口还是走的正常的DNS解析,这里可以查看 /etc/resolv.conf 进行确认。如果 /etc/resolv.conf 下也将X机自身的IP作为DNS,并且同时也在Dnsmasq下配置了Netflix指向自己,那将会是一个死循环!
Dnsmasq其本身的作用并不是为了给其它机器做DNS服务,而是将有干扰的域名进行清理,所以常规的用法反而是,在 /etc/resolv.conf 下将自己的IP作为DNS服务器,自己的Dnsmasq来接管所有的outbound DNS解析,然后再在Dnsmasq的配置下,将域名指向想要的IP,而非指向自己的IP!
而这篇文章的搭配仅仅是将X机作为一台转发服务器来供外界使用,所以不能把自己的outbound再进行二次处理了,否则会产生循环风暴!
Dnsmasq
Dnsmasq实际是一个本地DNS工具,原理是通过劫持本地的DNS请求,统一做转发处理。也可以对外暴露53接口(或者5353接口,然后通过iptables做转发),以供其它VPS访问。
安装
在dnsmasq的配置文件( /etc/dnsmasq.conf )中加入指定配置文件夹
进入/etc/dnsmasq.d/ 新建一个netflix.conf
将以下<IP_ADDR>替换成当前vps的IP(IPv6亦可)
重启dnsmasq
保证启动服务
通过dig工具查看解析
SNIProxy
必须先apt update
安装依赖项
切换到根目录,克隆sniproxy项目
切换到sniproxy目录
创建dpkg包
运行完之后,会在上层目录产生几个包文件,安装对应的包
安装完毕之后,会有一个conf文件,编辑
可参照如下配置进行对应修改
设置开机自动启动sniproxy
参考: SNI Proxy Tutorial · GitHub
设置:
保存,退出,重启
********** 以下部分仅供参考 **********
( 这一部分仅供参考,原因是sniproxy的包所放服务是在/etc/init.d下,启动并非由systemctl来控制,并且使用systemctl控制可能会有问题。原包下sniproxy也会自动读取 /etc/sniproxy.conf )
注意,目前这个包会自动在 /etc/init.d 放入 sniproxy,我们把它移除出去,手动重建一个
手动新建一个mysni.service
添加具体服务启动内容指向 /etc/sniproxy.conf
重启daemon
尝试启动sniproxy
查看sniproxy状态
如果成功了,则继续将mysni设为enable
********** 以上部分仅供参考 **********
sniproxy安装好之后会自动启动,查看是否启动成功
如果没有成功,需要查看具体的log
可能会发现sniproxy没有成功是因为有其它进程占用了80端口,所以无法listen
发现是apache2服务占用了80端口,那就关闭它
然后尝试重启sniproxy
至此应该已经可以使用了
注意,如果访问站点有问题,需要看下mode是否设置了 ipv4_only
IMPORTANT 重要
sniproxy打开之后, 一定要设置iptables, 防止被别人利用导致流量超标
安装使用iptables-persistent
关闭所有80/443的访问, 只留允许的IP
各种Tips
如果修改了 /etc/sniproxy.conf 不起效,或者明明代理dns了但访问返回 ERR_SSL_VERSION_OR_CIPHER_MISMATCH 错误,那就是sniproxy服务没有重启成功!!
首先,关闭sniproxy服务
查看sniproxy是否真的被关闭,需要查看进程
如果还有sniproxy在运行,直接用kill 来强制关闭进程(参数 -9)
这时候再重启sniproxy
另外查看一下sniproxy是否加载了对应的conf文件
如果此时没有出现 /etc/sniproxy.conf,则需要手动指定conf文件
最后,再确认sniproxy进程是否 运行
如果此时没有sniproxy进程,说明 conf 文件配置错误,这时就需要去查看并修改conf文件
查看端口占用
Last updated