DNS流媒体解锁配置方法(下)

DNS流媒体解锁配置方法(下)

从上次发布了DNS流媒体解锁(上)以后,因为发现warp可以完美解锁Netflix,DNS流媒体解锁的(下集)迟迟没有再发布。后来Netflix封堵了warp,我才又重新开始配置我的dns解锁。由于我的拖延症,在我写完并录制本视频的时候,warp重新可以解锁Netflix,我想如果您是喜欢折腾,想要减少成本,仍然可以再次使用warp进行Netflix解锁。因为上次Netflix将warp全网关闭,所以后续可能随时会在此关闭。如果不想折腾,也有可以使用的dns解锁服务,享受稳定的服务(本进阶方案后面会提供一个python的自动监护进程,实在容灾自动切换),希望灵活自由的切换不同区域的Netflix(或者其他流媒体)的服务,仍然可以使用本教程的方案。

  • 工具说明

上期我们使用了dnsmasq可以灵活的实现分流,但是vps本身的流量也会按照分流规则分流走,此次我们就只用v2ray实现只有通过v2ray的流量分流,vps本机的其他服务均保持原生的状态。

前期准备:v2ray配置文件

{
  "inbounds": [{
    "port": 1080,  // SOCKS 代理端口,在浏览器中需配置代理并指向这个端口
    "listen": "127.0.0.1",
    "protocol": "socks",
    "settings": {
      "udp": true
    }
  }],
  "outbounds": [{
    "protocol": "vmess",
    "settings": {
      "vnext": [{
        "address": "server", // 服务器地址,请修改为你自己的服务器 ip 或域名
        "port": 10086,  // 服务器端口
        "users": [{ "id": "b831381d-6324-4d53-ad4f-8cda48b30811" }]
      }]
    }
  },{
    "protocol": "freedom",
    "tag": "direct",
    "settings": {}
  }],
  "routing": {
    "domainStrategy": "IPOnDemand",
    "rules": [{
      "type": "field",
      "ip": ["geoip:private"],
      "outboundTag": "direct"
    }]
  }
}

需要进行的就增加对DNS的指定:

利用什么:DNS基础配置

{
 "dns": {
   "servers": [
     "1.1.1.1",
     "localhost"
   ]
 }
}

DNS 模块的基础使用并没有什么特别复杂的地方,就是指定一个或几个 DNS 服务器,v2ray 会依次使用(查询失败时候会查询下一个)。其中"localhost"的意义是特殊的,作用是本地程序用系统的 DNS 去发请求,而不是 V2ray 直接跟 DNS 服务器通信,这个通信不受 Routing 等模块的控制。

初具雏形:DNS分流配置

{
 "dns": {
   "servers": [
     {
       "address": "119.29.29.29",
       "port": 53,
       "domains": [
         "geosite:cn"
       ],
       "expectIPs": [
         "geoip:cn"
       ]
     },
     {
       "address": "8.8.8.8",
       "port": 53,
       "domains": [
         "geosite:geolocation-!cn",
         "geosite:speedtest",
         "ext:h2y.dat:gfw"
       ]
     },
     "1.1.1.1",
     "localhost"
   ]
 }
}

DNS 服务是可以用来分流的,大致思路是,”哪些域名要去哪个 DNS 服务器解析,并希望得到属于那里的 IP 地址“。 配置的规则跟路由模式中用的是相似的,详细使用还需参考官方文档。

上面的配置思路这里解释一下:国内域名匹配到 domains 里面,使用 119.29.29.29 进行查询,并期待得到国内的 IP 地址;如果得到的地址并不是国内的,则进行下一个 DNS 服务器进行查询,并使用新的结果。不是国内的域名会匹配到第二个配置, 使用 8.8.8.8 进行查询,这次不需要期待特别的 IP 了,可直接使用返回的;如果以上过程都有问题,则直接查询 1.1.1.1,再不行让本地 DNS 试试吧。

能做什么?

上面就是我们使用v2ray进行配置的基础知识,在上面的基础上,我们配置三个等级的使用:

  1. 在vps上实现流媒体的分流,并实现针对不同流媒体服务使用不同的节点,例如Netflix通过新加坡节点、hbo使用美国dns解锁节点。
  2. 实现dns解锁流媒体和自有的落地主机的分流,什么意思?在流媒体解锁的同时我们还可能需要针对一些特定服务(特别是安全性高的服务)例如PayPal,如果新注册账号全球乱转的登录可能触发风控,对于类似的这种服务我们可能需要导流到美国的某一落地机器上;
  3. 通过外挂进程实现解锁效果的自动检测,因为dns服务上在不同的区域会提供多个节点,如果某个节点无法访问或者节点被封堵后无法解锁时,我们自动切换到可以使用的其它节点上。

考虑到之前发布上以后拖延时间太长,为了避免挖坑,此次我们一口气全部介绍完,如果介绍的不够透彻的地方,有问题也请留言给我我再出视频进行补充。

  • 实际配置

v2ray的安装就全部跳过了,无论你是使用的v2ray的哪种协议的安装都是可以的,你只需要知道v2ray的配置文件的位置在哪里就可以了。

1、DNS简单分流

使用下面的代码覆盖原代码中:

  "outbounds": [
      {
          "tag": "direct",
          "protocol": "freedom",
          "settings": {
              "response": null,
              "domainStrategy": "UseIP"
          }
      },
      {
          "tag": "block",
          "protocol": "blackhole",
          "settings": {}
      }
  ],
  "dns": {
        "servers": [
            "8.8.8.8",
            {
                "address": "66.187.6.136",      //USAVPS
                "port": 53,
                "domains": ["geosite:amazon","geoip:amazon"]
            },
            {
                "address": "185.213.174.13",      //GLOBEVPS
                "port": 53,
                "domains": [
                    "geosite:netflix","geoip:netflix"
                ]
            }
        ]
  },
  "routing": {
        "domainStrategy": "AsIs",
        "rules": [
            {
                "ip": [
                    "geoip:private"
                ],
                "domain": null,
                "type": "field",
                "port": null,
                "outboundTag": "blocked"
            }
        ]
    }

上面的代码实现使用欧洲的Netflix,使用美国的Amazon video。

 

2、DNS与VPS混合分流

  "outbounds": [
      {
          "tag": "direct",
          "protocol": "freedom",
          "settings": {
              "response": null,
              "domainStrategy": "UseIP"
          }
      },
    {
      "tag": "paypal",
      "protocol": "vmess",
      "settings": {
          "vnext": [
              {
                  "port": 443,
                  "address": "IP地址",     //落地VPS的地址
                  "users": [
                      {
                          "alterId": 0,
                          "security": "auto",
                          "id": "XXXXXXXX-XXX-XXX-XXXX-XXXXXXXXX"            落地VPS的ID编码
                      }
                  ]
              }
          ]
      },
      "streamSettings": {
          "network": "ws",
          "security": "tls",
          "wsSettings": {
              "path": "/XXXXXX",                     落地VPS的path信息
              "headers": {
                  "host": "XX.XX.com"             落地VPS的域名
              }
          },
          "sockopt": {
               "mark": 255
          }
      }
    },
      {
          "tag": "block",
          "protocol": "blackhole",
          "settings": {}
      }
  ],
  "dns": {
        "servers": [
            "8.8.8.8",
            {
                "address": "66.187.6.136",      //USAVPS
                "port": 53,
                "domains": ["geosite:amazon","geoip:amazon"]
            },
            {
                "address": "185.213.174.13",      //GLOBEVPS
                "port": 53,
                "domains": [
                    "geosite:netflix","geoip:netflix"
                ]
            }
        ]
  },
  "routing": {
        "domainStrategy": "AsIs",
        "rules": [
            {
                "type": "field",
                "port": null,
                "outboundTag": "paypal",
                "ip": null,
                "domain": [
                    "geosite:paypal","geoip:paypal","geosite:hbo","geoip:hbo","geosite:disney","geoip:disney"
                ]
            },
            {
                "ip": [
                    "geoip:private"
                ],
                "domain": null,
                "type": "field",
                "port": null,
                "outboundTag": "blocked"
            }
        ]
    }

域名的分流组合方式可以根据自己的实际使用需要进行调整,因为我的落地机可以解锁disney,因此Netflix和amazon交给dns流媒体解锁进行,而Disney则由自己的vps完成。

 

到此一个相对灵活的流媒体解锁服务就构建完成了,即使偶然遇到无法解锁的情况,登录到vps上进行下参数的调整也就ok了。

如果你还想做到一次部署再不操心,那再往下看,因为我没有进行各种机器的场景适配,脚本也非一点部署方式,因此多少还是需要一点儿动手能力的。

3、实现自动监控、自动优选解锁节点

通过增加一个监护进程,随时验证Netflix的解锁情况,切换可以使用的解锁节点。

部署一个python的程序,以下是程序的代码,基本原理过程是:

从dns解锁服务商获取一个解锁dns,通过该dns访问Netflix的验证影片,并记录是否可以观看及页面的响应的时间,从可以使用的dns中选择响应时间最短的一个,替换原来的配置,实现Netflix始终可以解锁状态。

dns的解锁列表保存在一个dns_netflix.txt文件中,根据你的需要可以将所有的dns放进去,这样可能出现Netflix切换区域的情况,原来可以观看的节目换区后没有的情况,所以可以只选择自己常看区域,例如欧洲区域。

#coding=UTF-8

import requests
import time
import io
import os
import urllib


class HostHeaderSSLAdapter(requests.adapters.HTTPAdapter):
    def send(self, request, **kwargs):
        from urllib.parse import urlparse

        connection_pool_kwargs = self.poolmanager.connection_pool_kw

        result = urlparse(request.url)

        if result.scheme == 'https' and resolved_ip:
            request.url = request.url.replace(
                'https://' + result.hostname,
                'https://' + resolved_ip,
            )
            connection_pool_kwargs['server_hostname'] = result.hostname  # SNI
            connection_pool_kwargs['assert_hostname'] = result.hostname

            # overwrite the host header
            request.headers['Host'] = result.hostname
            
        else:
            # theses headers from a previous request may have been left
            connection_pool_kwargs.pop('server_hostname', None)
            connection_pool_kwargs.pop('assert_hostname', None)

        return super(HostHeaderSSLAdapter, self).send(request, **kwargs)
    
resolved_ip = '13.115.79.146'
sContry = ''
sSpeedIP = ''
sSpeedRG = ''
sDuration = time.time()
sSpeedIP_US = ''
sSpeedRG_US = ''
sDuration_US = time.time()

f = open("dns_netflix.txt")               # 返回一个文件对象 
line = f.readline()               # 调用文件的 readline()方法 
k = 0
while line: 
    #print(k)
    k = k + 1
    if len(line.strip()) == 0:
        #开始读取下一行的国家
        line = f.readline().strip()               # 调用文件的 readline()方法 
        sContry = line
        print("地区:"+line)
    
    if line.strip() == '主:':
        #开始读取下一行的IP地址
        line = f.readline().strip()               # 调用文件的 readline()方法 
        print("IP:"+line)
        
        try:
            t1 = time.time()
            #对IP地址进行验证
            url = 'https://www.netflix.com/title/80027042'
            resolved_ip = line
            session = requests.Session()
            session.mount('https://', HostHeaderSSLAdapter())
            r = session.get(url, timeout=10)
            print("结果状态:" )
            print(r.status_code )
            session.close()

            t2 = time.time() # 结束时间
            print('耗时:%s' % (t2 - t1))
            
            #选择最快服务器
            if r.status_code == 200 and (t2 - t1)<sDuration and '香港' not in sContry:
                sSpeedIP = resolved_ip
                sSpeedRG = sContry
                sDuration = t2 - t1
            #选择最快美国服务器
            if r.status_code == 200 and (t2 - t1)<sDuration_US and '美國' in sContry:
                sSpeedIP_US = resolved_ip
                sSpeedRG_US = sContry
                sDuration_US = t2 - t1
        except OSError as err:
            print("连接超时")
            
        
    line = f.readline() 
f.close()  
print('最快服务器,地区:' + sSpeedRG + ' IP地址:' + sSpeedIP + ' 耗时:' + str(sDuration))
print('最快美国服务器,地区:' + sSpeedRG_US + ' IP地址:' + sSpeedIP_US + ' 耗时:' + str(sDuration_US))
file_data = ""
with io.open('/etc/v2ray/config_0.json', "r", encoding="utf-8") as f:
    for line in f:
        if 'USAVPS' in line:
            line = '                "address": "' + sSpeedIP_US +'",      //USAVPS\n'
        if 'GLOBEVPS' in line:
            line = '                "address": "' + sSpeedIP +'",      //GLOBEVPS\n'
        file_data += line
with io.open('/etc/v2ray/config.json',"w",encoding="utf-8") as f:
    f.write(file_data)
os.system('systemctl restart v2ray')
#os.system('ls -')
print('执行完毕')

部署vps后最后一步就是将命令的执行脚本放入到定时器中,让vps每几个小时自动检测和更新一次。

crontab -e

然后加入以下代码:

30 */3 * * * python3 /root/nf_dns.py >> /root/nf_dns.log

大功告成!!

本操作的视频教程:https://www.youtube.com/watch?v=tBBwNMRvRS4

欢迎关注我上面的YouTube频道

 

 

 

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

Back To Top