.:. 草榴社區 » 技術討論區 » 基于云函数 制作 v2ray 节点监测 自动复活机制
本頁主題: 基于云函数 制作 v2ray 节点监测 自动复活机制字體大小 寬屏顯示 只看樓主 最新點評 熱門評論 時間順序
爱自由


級別:精靈王 ( 12 )
發帖:1226
威望:906 點
金錢:999 USD
貢獻:31448 點
註冊:2015-03-27

基于云函数 制作 v2ray 节点监测 自动复活机制

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 官方接口把自己的实例, 关机在开机.
複製代碼
  1. # -*- coding: utf-8 -*-
  2. import logging
  3. import json
  4. import os
  5. import re
  6. regex = r"([0-9]+) requests made, ([0-9]+) success, total time ([0-9.]+)s"
  7. AWS_CONFIG = {
  8.     "aws_access_key_id": "xxxx",
  9.     "aws_secret_access_key": "xxxx",
  10.     "region_name": "ap-southeast-1",
  11.     "instanceName": "CentOS-1-V2ray",
  12. }
  13. LIGHTSAIL_CLIENT = boto3.client(
  14.     'lightsail',
  15.     aws_access_key_id=AWS_CONFIG['aws_access_key_id'],
  16.     aws_secret_access_key=AWS_CONFIG['aws_secret_access_key'],
  17.     region_name=AWS_CONFIG['region_name']
  18. )
  19. def get_instance_vmess():
  20.     item = LIGHTSAIL_CLIENT.get_instance(
  21.         instanceName=AWS_CONFIG.get('instanceName')
  22.     )
  23.     detail = {
  24.         "v": "2",
  25.         "ps": "爱自由",
  26.         "add": item['instance'].get('publicIpAddress'),
  27.         "port": 3306,
  28.         "id": "xxxx",
  29.         "aid": 2,
  30.         "net": "tcp",
  31.         "type": "none",
  32.         "host": "",
  33.         "path": "",
  34.         "tls": "none"
  35.     }
  36.     return detail, str(base64.b64encode(json.dumps(detail).encode('utf-8')), 'utf-8')
  37. def handler(event, context):
  38.   logger = logging.getLogger()
  39.   vmess = get_instance_vmess()
  40.   output = os.popen(f'/opt/python/vmessping_amd64_linux -c 3 {vmess}')
  41.   ping_resp = output.read()
  42.   matches = re.search(regex, ping_resp, re.MULTILINE)
  43.   matches.groups()
  44.   matches = re.finditer(regex, ping_resp, re.MULTILINE)
  45.   ping_result = matches.groups()
  46.   if groups[1]=='0':
  47.     refresh_ec2_ip(LIGHTSAIL_CLIENT)
  48.   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,则检测失败, 我们就可以执行服务器重启的业务逻辑了.
複製代碼
  1. Vmessping ver[v0.3.4], A prober for v2ray (v2ray-core: 4.23.2)
  2. Net: tcp
  3. Addr: xxx.xxx.xxx.xxx
  4. Port: 3306
  5. UUID: xxxx
  6. Type: none
  7. TLS: none
  8. PS: xxx
  9. Ping http://www.google.com/gen_204: seq=1 time=208 ms
  10. Ping http://www.google.com/gen_204: seq=2 time=235 ms
  11. Ping http://www.google.com/gen_204: seq=3 time=174 ms
  12. --- vmess ping statistics ---
  13. 3 requests made, 3 success, total time 2.618939579s
複製代碼


后记
关于 v2ray 的搭建, 其实下次也可出一片文章.
授人以鱼不如授人以渔




赞(40)
DMCA / ABUSE REPORT | TOP Posted: 08-26 21:14 發表評論
.:. 草榴社區 » 技術討論區


電腦版 手機版 客戶端 DMCA
用時 0.02(s) x3, 11-07 09:38