diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..f6906f2 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,10 @@ +# 默认忽略的文件 +/shelf/ +/workspace.xml +# 基于编辑器的 HTTP 客户端请求 +/httpRequests/ +# 已忽略包含查询文件的默认文件夹 +/queries/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/easytier_deploy.iml b/.idea/easytier_deploy.iml new file mode 100644 index 0000000..d6ebd48 --- /dev/null +++ b/.idea/easytier_deploy.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..4eb4f51 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..07ef839 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/README.md b/README.md index f69812b..9d2a919 100644 --- a/README.md +++ b/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='' + +# VPN 网络名称(所有节点必须一致) +NETWORK_NAME="" + +# 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) 开源。 diff --git a/main.sh b/main.sh new file mode 100644 index 0000000..6202a0b --- /dev/null +++ b/main.sh @@ -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='' + +# VPN 网络名称(所有节点必须一致) +NETWORK_NAME="" + +# 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