前言

之前有朋友「我也不知道是哪个不知名的网友了」找站长搭过一次 V2board 面板,也接触到了后端 XrayR,然后刚好目睹了脑残硬刚开源作者删库事件,虽然没有对外运营机场,但自己也偶尔需要爬墙头,索性就自个儿弄了个专用机场,关系户找来了也能给开个账号显得高大上!

也不知道是不是特别受照顾,私人专用机场都隔三差五被墙需要搬家,虽然只有 2 台节点服务器,但对咱这非专业人士需要维护劳动量也是巨大,每次改安装改配置都不能忍,索性就写了个脚本。

脚本功能虽然不完善,但好歹能用,经常见有人问起这啊那的,干脆把自用的这破程序放出来吧,有缘人自取。

恰饭广告

  1. 币圈必备:可以消费 USDC/USDT 的信用卡 - OneKey Card
  2. 币圈必备:可以消费 USDT 的预付信用卡 - Depay

实现功能

  1. 一键配置并安装 XrayR
  2. 自动获取面板上指定的节点信息
  3. 自动 CloudFlare 解析节点域名
  4. 每日自动更换节点端口

准备条件

脚本实现功能时,要求输入:

  1. V2board/Xboard 面板接口域名和通讯密钥:面板上设置
  2. V2board/Xboard 面板上指定的节点ID和类型
  3. V2board/Xboard 面板数据库信息
  4. CloudFlare 增删改域名解析权限 API Token:去 CloudFlare 控制台添加,具体方法查看 CloudFlare 帮助文档

因为信息都是固定的,n 年难得变一次,索性偷懒到底,弄个如下一键命令实现信息复用:

1
2
3
4
5
6
7
export DB_Host="xx.xx.xx"          //数据库远程访问地址,记得设置远程访问权限
export DB_Name="xx"
export DB_User="xx"
export DB_PWD="xx"
export Api_Host="https://xx.xx.xx" //面板接口,如果不支持https就用http
export Api_Key="xx" //面板通讯密钥
export CF_TOKEN_DNS="xx-xx-xx" //CloudFlare API Token

Xshell 上添加个命令按钮,组合上面这一套命令放一起完成就可以,直接和下方的脚本一起组合到一个按钮里都行

每次运行 xrayR_for_V2board.sh 脚本前运行一遍上面的命令,就可以省去这部分的手动输入,最终就剩下输入节点 ID类型 了。

使用

SSH 终端登录服务器,运行如下命令:

1
2
apt install -y wget curl
bash <(curl -Ls https://github.com/cdnf/shell/raw/master/proxy/xrayR_for_V2board.sh)

然后就能看到如下选择菜单,按提示完成后续的输入即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
======================================
Author: 金三将军
Version: 4.2.5
======================================

1.安装XrayR
2.新增nodes
3.开启定期更换端口
4.开启系统Swap
9.卸载XrayR
0.退出


请输入数字选项:

选了开启定期更换端口功能后,会将自动更换端口脚本名称添加到系统命令,除每日自动任务运行外,也可以手动运行autoPort 命令即时更换。

1
2
3
4
root@xx:~# which autoPort 
/usr/bin/autoPort
root@xx:~# cat /etc/crontab
30 3 * * * root autoPort >> /dev/null 2>&1

支持自动解析和换端口

自动域名解析3.开启定期更换端口 功能需要面板数据支持,所以需要在 V2board 面板节点接口 app\Http\Controllers\Server\UniProxyController.php 中额外添加如下信息返回:

1
2
'host' => $this->nodeInfo->host,
'port' => $this->nodeInfo->port,

最终代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
 // 后端获取配置
public function config(Request $request)
{
switch ($this->nodeType) {
case 'shadowsocks':
$response = [
'host' => $this->nodeInfo->host,
'port' => $this->nodeInfo->port,
'server_port' => $this->nodeInfo->server_port,
'cipher' => $this->nodeInfo->cipher,
'obfs' => $this->nodeInfo->obfs,
'obfs_settings' => $this->nodeInfo->obfs_settings
];

if ($this->nodeInfo->cipher === '2022-blake3-aes-128-gcm') {
$response['server_key'] = Helper::getServerKey($this->nodeInfo->created_at, 16);
}
if ($this->nodeInfo->cipher === '2022-blake3-aes-256-gcm') {
$response['server_key'] = Helper::getServerKey($this->nodeInfo->created_at, 32);
}
break;
case 'vmess':
$response = [
'host' => $this->nodeInfo->host,
'port' => $this->nodeInfo->port,
'server_port' => $this->nodeInfo->server_port,
'network' => $this->nodeInfo->network,
'networkSettings' => $this->nodeInfo->networkSettings,
'tls' => $this->nodeInfo->tls
];
break;
case 'trojan':
$response = [
'host' => $this->nodeInfo->host,
'port' => $this->nodeInfo->port,
'server_port' => $this->nodeInfo->server_port,
'server_name' => $this->nodeInfo->server_name,
];
break;
case 'hysteria':
$response = [
'host' => $this->nodeInfo->host,
'port' => $this->nodeInfo->port,
'server_port' => $this->nodeInfo->server_port,
'server_name' => $this->nodeInfo->server_name,
'up_mbps' => $this->nodeInfo->up_mbps,
'down_mbps' => $this->nodeInfo->down_mbps,
'obfs' => Helper::getServerKey($this->nodeInfo->created_at, 16)
];
break;
}
}

后记

这是个不完善的 shell,所以有问题也是正常的。如果不爽,自己去改去完善。

为了这个脚本能称心如意,站长特意去钻研了 jq,有兴趣的可以参考:常用 linux jq 命令语法整理