0%

浅析DNS流媒体解锁在代理环境中的应用

在谈论DNS流媒体解锁所需的SNI代理服务器之前,先来回顾和了解下通常情况下DNS请求发出之后的整个生命周期。首先,在客户端发出基于UDP协议53端口的DNS请求后,浏览器DNS缓存机制会率先寻找本地的缓存。假如未命中缓存则调用操作系统的getaddrinfo()系统函数,向操作系统寻求解析结果。倘若操作系统的DNS缓存依旧无法响应请求,则计算机向配置的上游DNS服务器发送请求,DNS服务器经历了递归和迭代之后,成功的将解析结果返回给设备的操作系统,随后向该IP发起HTTPS连接即可。

简述DNS解锁

通常情况下,关于DNS流媒体解锁适用的业务场景即为通过代理服务器可以畅通无碍的访问Netflix、HBO、Amazon Prime Video等平台,由于上述平台的某些使用限制,非IDC网段的请求才能被正常的响应,否则就会遇到类似”Proxy Error”这样的错误返回值。

  • 通常情况下的访问请求
    1
    2
    3
    4
    5
    +----------+       +--------------+       +-----------+
    | | | | | |
    | Client +-------> Proxy Server +-------> Website |
    | | | | | |
    +----------+ +--------------+ +-----------+
  • 倘若代理服务器不支持访问某些流媒体网站,那么就需要在此基础上增加DNS代理。
    1
    2
    3
    4
    5
    +----------+       +--------------+       +------------------+      +---------+
    | | | | | | | |
    | Client +-------> Proxy Server +-------> Smart DNS Server +------> Website |
    | | | | | | | |
    +----------+ +--------------+ +------------------+ +---------+
  • 在支持访问流媒体的服务器上安装SNI代理,将远端服务器的部分流媒体流量全部转发到SNI代理服务器上,这样代理服务器也就具备了访问受限制的流媒体的能力。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
                                                +-----------+
    | |
    +---> Website |
    +----------+ +----------------+ | | |
    | | | | | +-----------+
    | Client +------> Proxy Server +----+
    | | | | | +-----------+ +--------------+
    +----------+ +----------------+ | | | | |
    +---> SNI Proxy +------> Netflix/HBO |
    | | | |
    +-----------+ +--------------+

使用netflix-proxy实现DNS解锁

该项目GitHub 服务器操作系统要求为Ubuntu或者Debian,运行下列命令。

1
2
3
4
5
6
apt-get -y install vim dnsutils curl sudo
curl -fsSL https://get.docker.com/ | sh || apt-get -y install docker.io
mkdir -p ~/netflix-proxy
cd ~/netflix-proxy
curl -fsSL https://github.com/ab77/netflix-proxy/archive/latest.tar.gz | gunzip - | tar x --strip-components=1
./build.sh

运行完成后会给出相应用户名及密码,可以配置反向代理方便未来的维护和使用。

1
netflix-proxy-admin site=http://IP:8080/credentials=admin:password

配置代理服务器的DNS服务器地址为流媒体解锁服务器IP地址

1
2
3
4
5
6
7
8
9
10
11
12
#修改/etc/NetworkManager/NetworkManager.conf文件,在main部分添加"dns=none"选项:
vi /etc/NetworkManager/NetworkManager.conf
[main]
plugins=ifcfg-rh
dns=none

#修改/etc/resolv.conf文件
vi /etc/resolv.conf
#Generated by NetworkManager
search openstacklocal
nameserver 8.8.8.8
nameserver *.*.*.*

(可选)在服务器的其他地方保存resolv.conf文件的一个副本(假设放在/root)并设置一个crontab定时命令

1
2
3
4
5
cp /root/resolv.conf /etc/resolv.conf
#添加写保护:
chattr +i /etc/resolv.conf
#修改生成resolv.conf的相关配置文件,譬如centos7中:
vi /etc/NetworkManager/NetworkManager.conf

重启网络

1
service network restart

⚠新版遇到python3出问题后可更换至旧版,️新版主要是buil.sh中的一行命令:apt install python3.6,导致python环境部署失败,详情可见netflix-proxy.log。

1
2
3
4
5
6
7
apt-get update\
&& apt-get -y install vim dnsutils curl sudo\
&& curl -fsSL https://get.docker.com/ | sh || apt-get -y install docker.io\
&& mkdir -p ~/netflix-proxy\
&& cd ~/netflix-proxy\
&& curl -fsSL https://github.com/Newlearner365/netflix-proxy/archive/latest.tar.gz | gunzip - | tar x --strip-components=1\
&& ./build.sh

对于部署的docker容器的运行情况,可以使用docker ps -a命令来查看。

使用Dnsmasq实现DNS解锁

该服务的原理是,使用Dnsmasq的DNS将网站解析劫持到SNI proxy反向代理的页面上。默认解锁Netflix/Hulu/HBO等流媒体,如需增删流媒体域名请编辑文件/etc/dnsmasq.d/custom_netflix.conf和/etc/sniproxy.conf,现以支持CentOS6/7, Debian8/9/10, Ubuntu16/18系统。

安装方法
1
wget --no-check-certificate -O dnsmasq_sniproxy.sh https://raw.githubusercontent.com/myxuchangbin/dnsmasq_sniproxy_install/master/dnsmasq_sniproxy.sh && bash dnsmasq_sniproxy.sh -i
卸载方法:
1
wget --no-check-certificate -O dnsmasq_sniproxy.sh https://raw.githubusercontent.com/myxuchangbin/dnsmasq_sniproxy_install/master/dnsmasq_sniproxy.sh && bash dnsmasq_sniproxy.sh -u
DNS地址修改
1
vi /etc/resolv.conf
调试排错
  • 确认sniproxy有效运行
    1
    2
    3
    4
    #重启sni命令:
    #如果sni不在运行,可检查配置/etc/sniproxy.conf,避免nginx或者其他程序监听80,443,可将其配置文件的80更改为801等。
    #443端口必须给sni监听放行,查看:netstat -tlunp|grep 443
    systemctl restart sniproxy
  • 确认防火墙放行443,53端口
    1
    2
    #调试可直接关闭防火墙 
    systemctl stop firewalld.service
  • 解析域名
    1
    2
    3
    4
    5
    6
    #配置完毕DNS后,解析域名,判断IP是否是NETFLIX代理机器IP。
    nslookup netflix.com
    #如果不存在nslookup命令,CENTOS安装:
    yum install -y bind-utils
    #DEBIAN安装:
    apt-get -y install dnsutils

相关工具:HTTPS代理 Dnsmasq Caddy

  • 本文作者: 夜阑听烟雨
  • 本文链接: https://blog.kixcs.com/archives/90d0/
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!