0. 前记
题主 v2ray 是购买的 aws lightsail 自己搭建的, 3.5 刀一个月.
但是时不时会抽风, ip 被和谐.
因此, 研究了下, 基于云函数制作了 定时监测 以及挂了自动刷新 ip 的脚本,
感觉不错, share 出来
1. 原理
整个流程, 比较简单.
首先云函数用的 阿里云的 python 允函数, 免费额度够用了,
其次监测 是 基于 v2ray 官方的 vmessping 工具实现的.
aws 的服务器有一点好的就是关闭后在启动, 服务区 ip 会变, 所以, 如果 ip 被墙, 重启换个 ip 就又复活了
这里我是每次服务器变更 ip 后, 自动把新 ip 指向我的域名, 我客户端也是直接使用的 域名.
所以当前 v2ray 服务端变更 ip 后, 手机/电脑上的 v2ray 客户端不需要做变更,也可正常使用
流程图 大概如下:
2. 具体实现
2.1 云函数
这里我用的阿里云的云函数, region 选的 北京,
必须选大陆的 region, 因为网络请求是在当前region下发起的, 如果选国外, 那么大概率你的梯子永远“健康”...
考虑到篇幅问题, 我把部分 refresh_ec2_ip 函数代码去掉了,其实就是调用 aws 官方接口把自己的实例, 关机在开机.
2.2 云函数触发器
2.3 vmessping
vmessping 这个是 v2ray 官方二进制程序, Github Release 页面下载后直接打包进函数代码即可:
用法 : vmessping 'vmess://ew0KI ...'
vmess:// 后面那一串是自己节点信息的json串, 然后执行 base64 得到的.
这个命令 监测返回格式如下:
代表 ping 了 三次, 成功 三次, 耗时 2.61秒, 如果 成功数为0,则检测失败, 我们就可以执行服务器重启的业务逻辑了.
后记
关于 v2ray 的搭建, 其实下次也可出一片文章.
授人以鱼不如授人以渔
题主 v2ray 是购买的 aws lightsail 自己搭建的, 3.5 刀一个月.
但是时不时会抽风, ip 被和谐.
因此, 研究了下, 基于云函数制作了 定时监测 以及挂了自动刷新 ip 的脚本,
感觉不错, share 出来
1. 原理
整个流程, 比较简单.
首先云函数用的 阿里云的 python 允函数, 免费额度够用了,
其次监测 是 基于 v2ray 官方的 vmessping 工具实现的.
aws 的服务器有一点好的就是关闭后在启动, 服务区 ip 会变, 所以, 如果 ip 被墙, 重启换个 ip 就又复活了
这里我是每次服务器变更 ip 后, 自动把新 ip 指向我的域名, 我客户端也是直接使用的 域名.
所以当前 v2ray 服务端变更 ip 后, 手机/电脑上的 v2ray 客户端不需要做变更,也可正常使用
流程图 大概如下:
2. 具体实现
2.1 云函数
这里我用的阿里云的云函数, region 选的 北京,
必须选大陆的 region, 因为网络请求是在当前region下发起的, 如果选国外, 那么大概率你的梯子永远“健康”...
考虑到篇幅问题, 我把部分 refresh_ec2_ip 函数代码去掉了,其实就是调用 aws 官方接口把自己的实例, 关机在开机.
複製代码
# -*- coding: utf-8 -*-
import logging
import json
import os
import re
regex = r"([0-9]+) requests made, ([0-9]+) success, total time ([0-9.]+)s"
AWS_CONFIG = {
"aws_access_key_id": "xxxx",
"aws_secret_access_key": "xxxx",
"region_name": "ap-southeast-1",
"instanceName": "CentOS-1-V2ray",
}
LIGHTSAIL_CLIENT = boto3.client(
'lightsail',
aws_access_key_id=AWS_CONFIG['aws_access_key_id'],
aws_secret_access_key=AWS_CONFIG['aws_secret_access_key'],
region_name=AWS_CONFIG['region_name']
)
def get_instance_vmess():
item = LIGHTSAIL_CLIENT.get_instance(
instanceName=AWS_CONFIG.get('instanceName')
)
detail = {
"v": "2",
"ps": "爱自由",
"add": item['instance'].get('publicIpAddress'),
"port": 3306,
"id": "xxxx",
"aid": 2,
"net": "tcp",
"type": "none",
"host": "",
"path": "",
"tls": "none"
}
return detail, str(base64.b64encode(json.dumps(detail).encode('utf-8')), 'utf-8')
def handler(event, context):
logger = logging.getLogger()
vmess = get_instance_vmess()
output = os.popen(f'/opt/python/vmessping_amd64_linux -c 3 {vmess}')
ping_resp = output.read()
matches = re.search(regex, ping_resp, re.MULTILINE)
matches.groups()
matches = re.finditer(regex, ping_resp, re.MULTILINE)
ping_result = matches.groups()
if groups[1]=='0':
refresh_ec2_ip(LIGHTSAIL_CLIENT)
return ''
2.2 云函数触发器
2.3 vmessping
vmessping 这个是 v2ray 官方二进制程序, Github Release 页面下载后直接打包进函数代码即可:
用法 : vmessping 'vmess://ew0KI ...'
vmess:// 后面那一串是自己节点信息的json串, 然后执行 base64 得到的.
这个命令 监测返回格式如下:
複製代码
3 requests made, 3 success, total time 2.618939579s
代表 ping 了 三次, 成功 三次, 耗时 2.61秒, 如果 成功数为0,则检测失败, 我们就可以执行服务器重启的业务逻辑了.
複製代码
Vmessping ver[v0.3.4], A prober for v2ray (v2ray-core: 4.23.2)
Net: tcp
Addr: xxx.xxx.xxx.xxx
Port: 3306
UUID: xxxx
Type: none
TLS: none
PS: xxx
Ping http://www.google.com/gen_204: seq=1 time=208 ms
Ping http://www.google.com/gen_204: seq=2 time=235 ms
Ping http://www.google.com/gen_204: seq=3 time=174 ms
--- vmess ping statistics ---
3 requests made, 3 success, total time 2.618939579s
后记
关于 v2ray 的搭建, 其实下次也可出一片文章.
授人以鱼不如授人以渔
精彩评论