实现原因
身边的几个朋友有着查查谷歌学术,逛逛ig的需求,但是都对科学上网了解不多且对软件的认知还停在vpn阶段。
因此计划利用家用服务器进行节点的搭建,对外只暴露为vmess节点,内部为多个机场与服务器组成的负载均衡节点,在保障科学上网稳定的同时也可以降低朋友们的学习成本,采用流行的软件进行连接即可。
最终效果
外部节点效果
x-ui面板管理节点界面
v2rayA界面
Uptime Kuma节点监控界面
Bark推送示例
架构设计
架构为下图所示
在路由器针对单用户节点进行端口转发,在xui中设置出站流量转发至v2raya。
部署环境
在nas上进行部署,配置如下图,配置不高但转发性能远大于家宽上传带宽,因此将就一下也可以。
全部组件都在Docker上进行部署,便于后续的维护与升级。
v2raya搭建
项目地址 https://github.com/v2rayA/v2rayA
本次项目的核心负载均衡部分由开源项目v2rayA进行控制,v2rayA 是一个支持全局透明代理的 V2Ray Linux 客户端,同时兼容SS、SSR、Trojan(trojan-go)、PingTunnel协议。
采用Docker进行部署v2rayA
采用Docker进行部署。在本项目中由于我们主要将v2rayA用以对外服务,因此在部署时不采用host模式,手动进行端口的开放。我们只需要开发管理后台的2017端口以及接收x-ui面板转发socks5流量的20172端口(可自行选择更换)。也可以开放更多端口供后续其他用途。
# run v2raya
docker run -d \
-p 2017:2017 \
-p 20170-20172:20170-20172 \
--restart=always \
--name v2raya \
-e V2RAYA_LOG_FILE=/tmp/v2raya.log \
-v /etc/v2raya:/etc/v2raya \
mzz2017/v2raya
管理后台配置
因为v2rayA的用途为节点的负载均衡,因此在设置中可以将分流关闭,对外只作为一个节点,并且将透明代理与系统代理关闭,不进行过多的流量处理。
在设置中开启端口分享,在地址与端口中将socks5端口绑定到Docker部署时开放的端口。
节点的添加与负载均衡
v2rayA可以添加服务器与订阅多种使用节点的方式,点击创建为新建单节点,点击导入则为订阅。
在添加完节点与订阅后,只需点击节点后的选择,即为加入负载均衡列表中。
负载均衡的原理为针对每个节点进行延迟的测试,自动连接延迟最低的节点进行使用。在PROXY中可以配置延迟测试的站点,测试间隔时间。
配置完成后,点击左上角运行按钮,等待显示正在运行蓝色按钮即配置完成。也可在左边栏中查看当前节点连接情况与延迟。
x-ui搭建
x-ui为一个支持多协议多用户的xray面板,在项目中只要用作对外开放节点的管理以及将出口流量转发至v2rayA。
采用Docker进行部署x-ui
在部署x-ui时,采用host模式进行部署,避免后续节点新增带来的端口映射问题。
mkdir x-ui && cd x-ui
docker run -itd --network=host \
-v $PWD/db/:/etc/x-ui/ \
-v $PWD/cert/:/root/cert/ \
--name x-ui --restart=unless-stopped \
enwaiax/x-ui:latest
部署完成后,访问ip:54321进行面板的访问,初始用户名与密码为admin。
登陆完成后,务必修改用户名与密码。
x-ui流量转发配置
此步将配置x-ui全部的出站流量转发至v2rayA中,达到采用负载均衡节点的目的。
在面板设置中的xray项目相关设置中进行设置。
{
"api": {
"services": ["HandlerService", "LoggerService", "StatsService"],
"tag": "api"
},
"inbounds": [
{
"listen": "127.0.0.1",
"port": 62789,
"protocol": "dokodemo-door",
"settings": {
"address": "127.0.0.1"
},
"tag": "api"
}
],
"outbounds": [
{
"protocol": "socks",
"settings": {
"servers": [
{
"address": "192.168.31.93",
"port": 20172,
"users": []
}
]
}
},
{
"protocol": "freedom",
"tag": "direct",
"settings": {}
},
{
"protocol": "blackhole",
"settings": {},
"tag": "blocked"
}
],
"policy": {
"system": {
"statsInboundDownlink": true,
"statsInboundUplink": true
}
},
"routing": {
"rules": [
{
"inboundTag": ["api"],
"outboundTag": "api",
"type": "field"
},
{
"ip": ["geoip:private"],
"outboundTag": "blocked",
"type": "field"
},
{
"type": "field",
"domain": ["geosite:cn"],
"outboundTag": "direct"
},
{
"type": "field",
"ip": ["geoip:cn"],
"outboundTag": "direct"
},
{
"outboundTag": "blocked",
"protocol": ["bittorrent"],
"type": "field"
}
]
},
"stats": {}
}
核心在outbounds中,进行协议的配置与目标服务器ip与端口的配置,此处填入服务器内网ip与socks5端口即可。
添加节点进行测试
在入站列表进行对外节点的添加,选择vmess协议,端口随机生成,其余配置不变点击添加。
可以利用软件扫描节点二维码进行连接测试。
DDNS
在上述组件配置完成后,最后一步则是进行域名的配置,因为家宽的ip通常在72小时会进行重新拨号获取,因此采用DDNS用于动态域名解析,省去手动更换ip进行连接的使用成本。
本项目采用DDNS-Go进行动态解析。在Domains中填入需要动态解析的域名即可。IP变更通知配置可采用bark推送进行通知。
路由器进行端口转发并通过域名进行节点连接
在路由器后台针对单节点进行端口转发即可用域名加端口的方式进行节点连接。
节点监控
采用uptimekuma进行节点的监控,采用bark进行推送。
在xui新建一个加密的sock5节点(注意⚠️:这种方式并不安全),记录信息后在uptimekuma中进行创建新监控服务。
通过检测访问https://gstatic.com/generate_204进行节点连通性的检测。
节点通知
采用bark进行节点状态的通知,关于推送配置可直接使用Uptime Kuma中的bark配置或BarkPush-Go进行多设备统一推送,此项目仍在完善中,请关注后续文章。
服务器监控
最后可以针对nas整体进行状态的监控,本项目采用哪吒探针进行监控。
https://github.com/naiba/nezha
最后的话
生命不息,折腾不止。