From 6d2511221011e692a0e5e797841c9e1e62bc4456 Mon Sep 17 00:00:00 2001
From: nfgj <3496310652@qq.com>
Date: Mon, 10 Aug 2026 20:21:22 +0000
Subject: [PATCH] =?UTF-8?q?=E9=A6=96=E6=AC=A1=E6=8F=90=E4=BA=A4/=E4=BB=93?=
=?UTF-8?q?=E5=BA=93=E5=88=9D=E5=A7=8B=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.idea/.gitignore | 10 ++
.idea/easytier_deploy.iml | 9 +
.idea/misc.xml | 6 +
.idea/modules.xml | 8 +
README.md | 132 ++++++++++++++-
main.sh | 344 ++++++++++++++++++++++++++++++++++++++
6 files changed, 508 insertions(+), 1 deletion(-)
create mode 100644 .idea/.gitignore
create mode 100644 .idea/easytier_deploy.iml
create mode 100644 .idea/misc.xml
create mode 100644 .idea/modules.xml
create mode 100644 main.sh
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