从上次发布了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进行配置的基础知识,在上面的基础上,我们配置三个等级的使用:
- 在vps上实现流媒体的分流,并实现针对不同流媒体服务使用不同的节点,例如Netflix通过新加坡节点、hbo使用美国dns解锁节点。
- 实现dns解锁流媒体和自有的落地主机的分流,什么意思?在流媒体解锁的同时我们还可能需要针对一些特定服务(特别是安全性高的服务)例如PayPal,如果新注册账号全球乱转的登录可能触发风控,对于类似的这种服务我们可能需要导流到美国的某一落地机器上;
- 通过外挂进程实现解锁效果的自动检测,因为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频道