首次提交/仓库初始化
This commit is contained in:
10
.idea/.gitignore
generated
vendored
Normal file
10
.idea/.gitignore
generated
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
# 默认忽略的文件
|
||||
/shelf/
|
||||
/workspace.xml
|
||||
# 基于编辑器的 HTTP 客户端请求
|
||||
/httpRequests/
|
||||
# 已忽略包含查询文件的默认文件夹
|
||||
/queries/
|
||||
# Datasource local storage ignored files
|
||||
/dataSources/
|
||||
/dataSources.local.xml
|
||||
9
.idea/easytier_deploy.iml
generated
Normal file
9
.idea/easytier_deploy.iml
generated
Normal file
@@ -0,0 +1,9 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module type="JAVA_MODULE" version="4">
|
||||
<component name="NewModuleRootManager" inherit-compiler-output="true">
|
||||
<exclude-output />
|
||||
<content url="file://$MODULE_DIR$" />
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
</component>
|
||||
</module>
|
||||
6
.idea/misc.xml
generated
Normal file
6
.idea/misc.xml
generated
Normal file
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_25" default="true" project-jdk-name="ms-25" project-jdk-type="JavaSDK">
|
||||
<output url="file://$PROJECT_DIR$/out" />
|
||||
</component>
|
||||
</project>
|
||||
8
.idea/modules.xml
generated
Normal file
8
.idea/modules.xml
generated
Normal file
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectModuleManager">
|
||||
<modules>
|
||||
<module fileurl="file://$PROJECT_DIR$/.idea/easytier_deploy.iml" filepath="$PROJECT_DIR$/.idea/easytier_deploy.iml" />
|
||||
</modules>
|
||||
</component>
|
||||
</project>
|
||||
132
README.md
132
README.md
@@ -1,2 +1,132 @@
|
||||
# easytier_deploy
|
||||
# EasyTier Deploy
|
||||
|
||||
EasyTier VPN Mesh 网络一键自动化部署工具,支持服务端 / 客户端模式的快速搭建与卸载。
|
||||
|
||||
## 功能特性
|
||||
|
||||
- **一键部署**:自动完成下载、解压、配置 systemd 服务并启动
|
||||
- **双模式支持**:可选择部署为服务端或客户端
|
||||
- **一键卸载**:完整清理服务、安装目录及下载文件
|
||||
- **多架构支持**:x86_64 / arm64 (aarch64) / armv7
|
||||
- **多系统兼容**:Debian / Ubuntu / CentOS / RHEL
|
||||
- **自动架构检测**:根据系统架构自动选择对应的安装包
|
||||
|
||||
## 系统要求
|
||||
|
||||
- **操作系统**:Linux(Debian/Ubuntu/CentOS/RHEL)
|
||||
- **权限**:需要 root 权限
|
||||
- **架构**:x86_64 / aarch64 / armv7
|
||||
|
||||
## 快速开始
|
||||
|
||||
### 下载并运行
|
||||
|
||||
```bash
|
||||
# 下载项目
|
||||
git clone https://git.opensource-studio.info/nfgj/easytier_deploy.git
|
||||
cd easytier_deploy
|
||||
|
||||
# 赋予执行权限并运行
|
||||
chmod +x main.sh
|
||||
sudo bash main.sh
|
||||
```
|
||||
|
||||
### 交互式菜单
|
||||
|
||||
运行脚本后将看到如下菜单:
|
||||
|
||||
```
|
||||
==========================================
|
||||
Easytier VPN 一键管理脚本
|
||||
==========================================
|
||||
|
||||
1. 部署为 服务端
|
||||
2. 部署为 客户端
|
||||
3. 卸载 Easytier
|
||||
|
||||
请选择 [1/2/3]:
|
||||
```
|
||||
|
||||
### 部署为服务端
|
||||
|
||||
选择 `1` 后,按提示输入:
|
||||
|
||||
| 参数 | 说明 | 默认值 |
|
||||
|------|------|--------|
|
||||
| 服务端虚拟 IP | VPN 网络中服务端的虚拟 IP 地址 | `10.126.5.1` |
|
||||
|
||||
服务端部署后将自动:
|
||||
- 下载并安装 EasyTier 到 `/opt/easytier`
|
||||
- 配置 systemd 服务并设为开机自启
|
||||
- 开放端口 `11010`(TCP/UDP)和 `15888`(RPC)
|
||||
- 启用出口节点功能
|
||||
|
||||
### 部署为客户端
|
||||
|
||||
选择 `2` 后,按提示输入:
|
||||
|
||||
| 参数 | 说明 | 默认值 |
|
||||
|------|------|--------|
|
||||
| 服务器公网 IP | 服务端的公网 IP 地址 | 必填 |
|
||||
| 服务端虚拟 IP | 服务端在 VPN 网络中的虚拟 IP | `10.126.5.1` |
|
||||
|
||||
客户端部署后将自动通过 DHCP 获取虚拟 IP,并将出口流量路由至服务端。
|
||||
|
||||
### 卸载
|
||||
|
||||
选择 `3` 后将执行以下操作(需二次确认):
|
||||
|
||||
1. 停止并禁用 easytier 服务
|
||||
2. 删除 systemd 服务文件
|
||||
3. 删除安装目录 `/opt/easytier`
|
||||
4. 清理下载的 ZIP 文件
|
||||
|
||||
## 配置说明
|
||||
|
||||
脚本顶部的用户配置变量需要修改:
|
||||
|
||||
```bash
|
||||
# VPN 网络密钥(所有节点必须一致)
|
||||
SECRET='<secret_test>'
|
||||
|
||||
# VPN 网络名称(所有节点必须一致)
|
||||
NETWORK_NAME="<test-network>"
|
||||
|
||||
# Easytier 安装目录
|
||||
EASYTIER_DIR="/opt/easytier"
|
||||
|
||||
# EasyTier 版本号
|
||||
VERSION="v2.6.4"
|
||||
```
|
||||
|
||||
> **注意**:`SECRET` 和 `NETWORK_NAME` 必须在所有节点保持一致,否则节点间无法通信。
|
||||
|
||||
## 常用命令
|
||||
|
||||
| 操作 | 命令 |
|
||||
|------|------|
|
||||
| 查看日志 | `journalctl -u easytier -f` |
|
||||
| 重启服务 | `systemctl restart easytier` |
|
||||
| 停止服务 | `systemctl stop easytier` |
|
||||
| 启动服务 | `systemctl start easytier` |
|
||||
| 查看状态 | `systemctl status easytier` |
|
||||
|
||||
## 项目结构
|
||||
|
||||
```
|
||||
easytier_deploy/
|
||||
├── main.sh # 主脚本(部署/卸载逻辑)
|
||||
├── LICENSE # Apache License 2.0
|
||||
└── README.md # 项目说明文档
|
||||
```
|
||||
|
||||
## 技术细节
|
||||
|
||||
- **下载源**:使用 GitHub 加速镜像 (`ghfast.top`) 下载 EasyTier 发行版
|
||||
- **服务管理**:基于 systemd,支持开机自启与异常自动重启(`RestartSec=10`)
|
||||
- **服务端特性**:启用 RPC 管理接口,自动配置白名单为 VPN 网段 + 本地回环
|
||||
- **客户端特性**:通过 TCP 连接服务端,自动获取虚拟 IP
|
||||
|
||||
## 许可证
|
||||
|
||||
本项目基于 [Apache License 2.0](LICENSE) 开源。
|
||||
|
||||
344
main.sh
Normal file
344
main.sh
Normal file
@@ -0,0 +1,344 @@
|
||||
#!/bin/bash
|
||||
# ============================================
|
||||
# Easytier 一键部署/卸载脚本(服务端 / 客户端)
|
||||
# 功能:自动下载、解压、配置 systemd 服务并启动 Easytier VPN
|
||||
# 适用系统:Debian/Ubuntu/CentOS/RHEL
|
||||
# 支持架构:x86_64 / arm64 (aarch64)
|
||||
# ============================================
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
# ============================================
|
||||
# 颜色输出函数
|
||||
# ============================================
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
CYAN='\033[0;36m'
|
||||
NC='\033[0m'
|
||||
|
||||
log_info() { echo -e "${GREEN}[INFO]${NC} $1"; }
|
||||
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
|
||||
log_error() { echo -e "${RED}[ERROR]${NC} $1" >&2; exit 1; }
|
||||
|
||||
# ============================================
|
||||
# 用户配置变量(按需修改)
|
||||
# ============================================
|
||||
|
||||
# VPN 网络密钥(所有节点必须一致)
|
||||
SECRET='<secret_test>'
|
||||
|
||||
# VPN 网络名称(所有节点必须一致)
|
||||
NETWORK_NAME="<test-network>"
|
||||
|
||||
# Easytier 安装目录
|
||||
EASYTIER_DIR="/opt/easytier"
|
||||
|
||||
# 版本号
|
||||
VERSION="v2.6.4"
|
||||
|
||||
# 下载地址(GitHub 加速镜像)
|
||||
# 自动检测系统架构
|
||||
ARCH=$(uname -m)
|
||||
case "$ARCH" in
|
||||
x86_64) ARCH_NAME="x86_64" ;;
|
||||
aarch64) ARCH_NAME="aarch64" ;;
|
||||
armv7*) ARCH_NAME="armv7" ;;
|
||||
*) log_error "不支持的架构: $ARCH(仅支持 x86_64/arm64/armv7)" ;;
|
||||
esac
|
||||
|
||||
DOWNLOAD_URL="https://ghfast.top/https://github.com/EasyTier/EasyTier/releases/download/${VERSION}/easytier-linux-${ARCH_NAME}-${VERSION}.zip"
|
||||
|
||||
# 下载后的 ZIP 文件名
|
||||
ZIP_FILE="easytier-linux-${ARCH_NAME}-${VERSION}.zip"
|
||||
|
||||
# 解压后的子目录名
|
||||
EXTRACT_DIR="easytier-linux-${ARCH_NAME}"
|
||||
|
||||
# ============================================
|
||||
# 卸载函数
|
||||
# ============================================
|
||||
uninstall_easytier() {
|
||||
echo ""
|
||||
echo -e "${RED}==========================================${NC}"
|
||||
echo -e "${RED} Easytier VPN 卸载确认${NC}"
|
||||
echo -e "${RED}==========================================${NC}"
|
||||
echo ""
|
||||
echo " 将执行以下操作:"
|
||||
echo " 1. 停止并禁用 easytier 服务"
|
||||
echo " 2. 删除 systemd 服务文件"
|
||||
echo " 3. 删除安装目录: $EASYTIER_DIR"
|
||||
echo " 4. 删除下载的 ZIP 文件"
|
||||
echo ""
|
||||
read -p "确认卸载?此操作不可恢复 [y/N]: " CONFIRM_UNINSTALL
|
||||
if [[ ! "$CONFIRM_UNINSTALL" =~ ^[Yy]$ ]]; then
|
||||
log_info "已取消卸载"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
log_info "停止 easytier 服务..."
|
||||
systemctl stop easytier 2>/dev/null || true
|
||||
systemctl disable easytier 2>/dev/null || true
|
||||
|
||||
log_info "删除 systemd 服务文件..."
|
||||
rm -f /etc/systemd/system/easytier.service
|
||||
systemctl daemon-reload
|
||||
|
||||
log_info "删除安装目录: $EASYTIER_DIR"
|
||||
rm -rf "$EASYTIER_DIR"
|
||||
|
||||
log_info "清理下载的 ZIP 文件..."
|
||||
rm -f "easytier-linux-x86_64-"*.zip
|
||||
rm -f "easytier-linux-aarch64-"*.zip
|
||||
rm -f "easytier-linux-armv7-"*.zip
|
||||
|
||||
echo ""
|
||||
log_info "Easytier 已完全卸载"
|
||||
echo ""
|
||||
exit 0
|
||||
}
|
||||
|
||||
# ============================================
|
||||
# 1. 检查 root 权限
|
||||
# ============================================
|
||||
if [ "$EUID" -ne 0 ]; then
|
||||
log_error "请使用 root 用户执行: sudo bash $0"
|
||||
fi
|
||||
|
||||
# ============================================
|
||||
# 2. 选择部署模式
|
||||
# ============================================
|
||||
clear
|
||||
echo ""
|
||||
echo -e "${CYAN}==========================================${NC}"
|
||||
echo -e "${CYAN} Easytier VPN 一键管理脚本${NC}"
|
||||
echo -e "${CYAN}==========================================${NC}"
|
||||
echo ""
|
||||
echo -e " ${GREEN}1.${NC} 部署为 ${GREEN}服务端${NC}"
|
||||
echo -e " ${YELLOW}2.${NC} 部署为 ${YELLOW}客户端${NC}"
|
||||
echo -e " ${RED}3.${NC} ${RED}卸载 Easytier${NC}"
|
||||
echo ""
|
||||
read -p "请选择 [1/2/3]: " MODE
|
||||
|
||||
case "$MODE" in
|
||||
3)
|
||||
uninstall_easytier
|
||||
;;
|
||||
1)
|
||||
ROLE="server"
|
||||
# 服务端虚拟 IP
|
||||
read -p "请输入服务端虚拟 IP [10.126.5.1]: " VIRTUAL_IP
|
||||
VIRTUAL_IP="${VIRTUAL_IP:-10.126.5.1}"
|
||||
HOSTNAME=$(hostname)
|
||||
;;
|
||||
2)
|
||||
ROLE="client"
|
||||
# 客户端需要知道服务端信息
|
||||
read -p "请输入服务器公网 IP: " SERVER_PUBLIC_IP
|
||||
if [ -z "$SERVER_PUBLIC_IP" ]; then
|
||||
log_error "服务器公网 IP 不能为空"
|
||||
fi
|
||||
read -p "请输入服务端虚拟 IP [10.126.5.1]: " SERVER_VIRTUAL_IP
|
||||
SERVER_VIRTUAL_IP="${SERVER_VIRTUAL_IP:-10.126.5.1}"
|
||||
VIRTUAL_IP="dhcp"
|
||||
HOSTNAME=$(hostname)
|
||||
;;
|
||||
*)
|
||||
log_error "无效选择,请输入 1 或 2"
|
||||
;;
|
||||
esac
|
||||
|
||||
# 校验虚拟 IP 格式(服务端模式)
|
||||
if [ "$ROLE" = "server" ] && [ "$VIRTUAL_IP" != "dhcp" ]; then
|
||||
if ! echo "$VIRTUAL_IP" | grep -qE '^([0-9]{1,3}\.){3}[0-9]{1,3}$'; then
|
||||
log_error "虚拟 IP 格式错误,请输入类似 10.126.5.1 的格式"
|
||||
fi
|
||||
# 校验 IP 每段数值范围 0-255
|
||||
IFS='.' read -r -a IP_PARTS <<< "$VIRTUAL_IP"
|
||||
for part in "${IP_PARTS[@]}"; do
|
||||
if [ "$part" -gt 255 ] 2>/dev/null; then
|
||||
log_error "虚拟 IP 数值超出范围(0-255): $VIRTUAL_IP"
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
# 确认信息
|
||||
echo ""
|
||||
echo -e "${CYAN}==========================================${NC}"
|
||||
if [ "$ROLE" = "server" ]; then
|
||||
echo -e " 部署模式: ${GREEN}服务端${NC}"
|
||||
echo " 节点名称: $HOSTNAME"
|
||||
echo " 虚拟 IP: $VIRTUAL_IP"
|
||||
else
|
||||
echo -e " 部署模式: ${YELLOW}客户端${NC}"
|
||||
echo " 节点名称: $HOSTNAME"
|
||||
echo " 虚拟 IP: DHCP 自动分配"
|
||||
echo " 服务器 IP: $SERVER_PUBLIC_IP"
|
||||
echo " 服务端 VIP: $SERVER_VIRTUAL_IP"
|
||||
fi
|
||||
echo " 网络名称: $NETWORK_NAME"
|
||||
echo -e "${CYAN}==========================================${NC}"
|
||||
read -p "确认以上信息?[Y/n]: " CONFIRM
|
||||
CONFIRM="${CONFIRM:-Y}"
|
||||
if [[ ! "$CONFIRM" =~ ^[Yy]$ ]]; then
|
||||
exec bash "$0"
|
||||
fi
|
||||
|
||||
# ============================================
|
||||
# 3. 处理 RPC 白名单(仅服务端)
|
||||
# ============================================
|
||||
if [ "$ROLE" = "server" ]; then
|
||||
NETWORK_PREFIX=$(echo "$VIRTUAL_IP" | cut -d. -f1-3)
|
||||
RPC_WHITELIST="127.0.0.1,${NETWORK_PREFIX}.0/24"
|
||||
log_info "RPC 白名单网段: ${NETWORK_PREFIX}.0/24"
|
||||
fi
|
||||
|
||||
# ============================================
|
||||
# 4. Easytier 启动参数
|
||||
# ============================================
|
||||
if [ "$ROLE" = "server" ]; then
|
||||
START_ARGS=(-i "$VIRTUAL_IP"
|
||||
--network-name "$NETWORK_NAME"
|
||||
--network-secret "$SECRET"
|
||||
--hostname "$HOSTNAME"
|
||||
-l "0.0.0.0:11010"
|
||||
--enable-exit-node
|
||||
-r "0.0.0.0:15888"
|
||||
--rpc-portal-whitelist "$RPC_WHITELIST")
|
||||
else
|
||||
START_ARGS=(--network-name "$NETWORK_NAME"
|
||||
--network-secret "$SECRET"
|
||||
--hostname "$HOSTNAME"
|
||||
-p "tcp://$SERVER_PUBLIC_IP:11010"
|
||||
--exit-nodes "$SERVER_VIRTUAL_IP")
|
||||
fi
|
||||
|
||||
# ============================================
|
||||
# 5. 安装必要工具(wget、unzip)
|
||||
# ============================================
|
||||
log_info "检查并安装必要工具..."
|
||||
install_pkg() {
|
||||
local pkg="$1"
|
||||
if command -v apt-get &>/dev/null; then
|
||||
apt-get update -qq && apt-get install -y -qq "$pkg"
|
||||
elif command -v yum &>/dev/null; then
|
||||
yum install -y "$pkg"
|
||||
elif command -v dnf &>/dev/null; then
|
||||
dnf install -y "$pkg"
|
||||
else
|
||||
log_error "无法识别包管理器,请手动安装: $pkg"
|
||||
fi
|
||||
}
|
||||
command -v wget &>/dev/null || { log_info "正在安装 wget..."; install_pkg wget; }
|
||||
command -v unzip &>/dev/null || { log_info "正在安装 unzip..."; install_pkg unzip; }
|
||||
|
||||
# ============================================
|
||||
# 6. 下载 Easytier 安装包
|
||||
# ============================================
|
||||
if [ ! -f "$ZIP_FILE" ]; then
|
||||
log_info "正在下载 Easytier ${VERSION}(架构: ${ARCH})..."
|
||||
if command -v wget &>/dev/null; then
|
||||
wget -q --show-progress -O "$ZIP_FILE" "$DOWNLOAD_URL"
|
||||
else
|
||||
curl -fSL -o "$ZIP_FILE" "$DOWNLOAD_URL"
|
||||
fi
|
||||
log_info "下载完成"
|
||||
else
|
||||
log_warn "$ZIP_FILE 已存在,跳过下载"
|
||||
fi
|
||||
|
||||
# ============================================
|
||||
# 7. 解压到安装目录
|
||||
# ============================================
|
||||
log_info "正在解压 $ZIP_FILE 到 $EASYTIER_DIR..."
|
||||
# 防止空变量导致危险删除
|
||||
[ -z "$EASYTIER_DIR" ] && log_error "安装目录变量为空"
|
||||
rm -rf "$EASYTIER_DIR"
|
||||
mkdir -p "$EASYTIER_DIR"
|
||||
unzip -q -o "$ZIP_FILE" -d "$EASYTIER_DIR"
|
||||
|
||||
if [ -d "$EASYTIER_DIR/$EXTRACT_DIR" ]; then
|
||||
log_info "正在调整目录结构..."
|
||||
mv "$EASYTIER_DIR/$EXTRACT_DIR"/* "$EASYTIER_DIR/"
|
||||
rmdir "$EASYTIER_DIR/$EXTRACT_DIR"
|
||||
fi
|
||||
chmod +x "$EASYTIER_DIR"/easytier-*
|
||||
|
||||
# ============================================
|
||||
# 8. 创建 systemd 服务
|
||||
# ============================================
|
||||
log_info "创建 systemd 服务..."
|
||||
|
||||
if [ "$ROLE" = "server" ]; then
|
||||
SERVICE_DESC="Easytier VPN Server"
|
||||
else
|
||||
SERVICE_DESC="Easytier VPN Client"
|
||||
fi
|
||||
|
||||
cat > /etc/systemd/system/easytier.service << EOF
|
||||
[Unit]
|
||||
Description=$SERVICE_DESC
|
||||
After=network-online.target
|
||||
Wants=network-online.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
WorkingDirectory=$EASYTIER_DIR
|
||||
ExecStart=$EASYTIER_DIR/easytier-core ${START_ARGS[*]}
|
||||
ExecStop=/bin/kill -SIGTERM \$MAINPID
|
||||
Restart=on-failure
|
||||
RestartSec=10
|
||||
StandardOutput=journal
|
||||
StandardError=journal
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
|
||||
# ============================================
|
||||
# 9. 启用并启动服务
|
||||
# ============================================
|
||||
log_info "启动 Easytier 服务..."
|
||||
systemctl daemon-reload
|
||||
systemctl enable easytier
|
||||
# 先停止可能残留的旧进程,再启动
|
||||
systemctl stop easytier 2>/dev/null || true
|
||||
systemctl start easytier
|
||||
|
||||
# ============================================
|
||||
# 10. 检查服务状态并输出结果
|
||||
# ============================================
|
||||
sleep 2
|
||||
if systemctl is-active --quiet easytier; then
|
||||
if [ "$ROLE" = "server" ]; then
|
||||
log_info "✅ Easytier 服务端已成功启动!"
|
||||
else
|
||||
log_info "✅ Easytier 客户端已成功启动!"
|
||||
fi
|
||||
echo ""
|
||||
echo -e "${CYAN}==========================================${NC}"
|
||||
echo " 服务信息"
|
||||
echo -e "${CYAN}==========================================${NC}"
|
||||
echo " 安装目录: $EASYTIER_DIR"
|
||||
if [ "$ROLE" = "server" ]; then
|
||||
echo " 虚拟 IP: $VIRTUAL_IP"
|
||||
echo " 端口: 11010 (TCP/UDP), 15888 (RPC)"
|
||||
else
|
||||
echo " 虚拟 IP: DHCP 自动分配"
|
||||
echo " 服务器: $SERVER_PUBLIC_IP:11010"
|
||||
echo " 出口节点: $SERVER_VIRTUAL_IP"
|
||||
fi
|
||||
echo " 网络名: $NETWORK_NAME"
|
||||
echo " 节点名: $HOSTNAME"
|
||||
echo -e "${CYAN}==========================================${NC}"
|
||||
echo ""
|
||||
echo "========== 常用命令 =========="
|
||||
echo " 查看日志: journalctl -u easytier -f"
|
||||
echo " 重启服务: systemctl restart easytier"
|
||||
echo " 停止服务: systemctl stop easytier"
|
||||
echo " 查看状态: systemctl status easytier"
|
||||
echo "=============================="
|
||||
echo ""
|
||||
else
|
||||
log_error "服务启动失败,请查看日志: journalctl -u easytier -n 50 --no-pager"
|
||||
fi
|
||||
Reference in New Issue
Block a user