From f6f6be1555380f66c8ffbb211d37a4f52d6a5ea5 Mon Sep 17 00:00:00 2001 From: sindricn Date: Thu, 7 Aug 2025 17:58:43 +0800 Subject: [PATCH] update --- .claude/settings.local.json | 8 + CHANGELOG.md | 157 ---- DEPLOYMENT_GUIDE.md | 382 -------- FEATURES.md | 298 ------ PROJECT_OVERVIEW.md | 243 ----- README.md | 42 +- UNINSTALL_GUIDE.md | 333 ------- USAGE.md | 307 ------- demo.sh | 529 ----------- hy2-manager.sh | 338 ++++++- scripts/advanced.sh | 626 ------------- scripts/troubleshoot.sh | 1540 -------------------------------- templates/advanced-config.yaml | 126 --- 13 files changed, 344 insertions(+), 4585 deletions(-) create mode 100644 .claude/settings.local.json delete mode 100644 CHANGELOG.md delete mode 100644 DEPLOYMENT_GUIDE.md delete mode 100644 FEATURES.md delete mode 100644 PROJECT_OVERVIEW.md delete mode 100644 UNINSTALL_GUIDE.md delete mode 100644 USAGE.md delete mode 100644 demo.sh delete mode 100644 scripts/advanced.sh delete mode 100644 scripts/troubleshoot.sh delete mode 100644 templates/advanced-config.yaml diff --git a/.claude/settings.local.json b/.claude/settings.local.json new file mode 100644 index 0000000..55f2f22 --- /dev/null +++ b/.claude/settings.local.json @@ -0,0 +1,8 @@ +{ + "permissions": { + "allow": [ + "Bash(rm:*)" + ], + "deny": [] + } +} \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index 09e49d0..0000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,157 +0,0 @@ -# 更新日志 - -## v1.1.0 - 2024-08-05 - -### 🆕 新增功能 - -#### 改进的卸载系统 -- **双重卸载选项**: 提供"仅卸载程序"和"完全卸载"两种方式 -- **智能保留机制**: 仅卸载程序时保留配置文件、证书和用户账户 -- **安全确认机制**: 完全卸载需要输入 "YES" 确认,防止误操作 -- **详细清理提示**: 提供手动清理命令,用户可按需执行 - -#### 卸载功能特性 -- ✅ 遵循官方卸载行为,仅删除程序文件 -- ✅ 保留配置文件和证书,便于重新安装 -- ✅ 提供完整清理选项,满足彻底卸载需求 -- ✅ 自动清理端口跳跃 iptables 规则 -- ✅ 详细的卸载验证指导 - -### 📚 文档更新 - -#### 新增文档 -- **UNINSTALL_GUIDE.md**: 详细的卸载指南 -- **CHANGELOG.md**: 版本更新记录 - -#### 更新文档 -- **README.md**: 更新卸载功能说明 -- **USAGE.md**: 添加详细卸载说明 -- **DEPLOYMENT_GUIDE.md**: 完善卸载部分 -- **demo.sh**: 添加卸载方式演示 - -### 🔧 技术改进 - -#### 代码优化 -- 模块化卸载函数设计 -- 改进错误处理和用户提示 -- 增强安全性检查 - -#### 用户体验 -- 清晰的卸载选项说明 -- 详细的操作步骤指导 -- 完善的验证方法 - ---- - -## v1.0.0 - 2024-08-05 - -### 🎉 首次发布 - -#### 核心功能 -- **一键安装**: 自动检测系统环境,安装 Hysteria2 和依赖 -- **智能配置**: 支持 ACME 自动证书和自签名证书两种模式 -- **域名优化**: 自动测试延迟,选择最优伪装域名 -- **服务管理**: 完整的服务启停、状态监控、日志查看 -- **进阶配置**: 端口修改、混淆配置、端口跳跃等高级功能 - -#### 项目结构 -``` -hy2-manager/ -├── hy2-manager.sh # 主控制脚本 -├── install.sh # 一键安装脚本 -├── demo.sh # 功能演示脚本 -├── scripts/ # 功能模块 -│ ├── install.sh # 安装模块 -│ ├── config.sh # 配置生成 -│ ├── service.sh # 服务管理 -│ ├── domain-test.sh # 域名测试 -│ └── advanced.sh # 进阶配置 -├── templates/ # 配置模板 -│ ├── acme-config.yaml # ACME 配置 -│ ├── self-cert-config.yaml # 自签名配置 -│ ├── advanced-config.yaml # 高级配置 -│ └── client-config.yaml # 客户端示例 -└── docs/ # 文档 - ├── README.md # 项目说明 - ├── USAGE.md # 使用说明 - ├── PROJECT_OVERVIEW.md # 项目总览 - └── DEPLOYMENT_GUIDE.md # 部署指南 -``` - -#### 特色功能 -- **模块化设计**: 清晰的代码结构,易于维护和扩展 -- **交互式界面**: 友好的菜单系统,无需记忆复杂命令 -- **智能域名选择**: 自动测试 30+ 优质域名,选择延迟最低的 -- **配置模板丰富**: 提供多种场景的配置模板 -- **安全性考虑**: 自动生成强密码,配置文件权限控制 -- **用户友好**: 彩色界面,详细提示,错误处理完善 - -#### 支持的系统 -- Ubuntu 18.04+ -- Debian 9+ -- CentOS 7+ -- RHEL 7+ -- Fedora 30+ - -#### 文档体系 -- **README.md**: 项目介绍和快速开始 -- **USAGE.md**: 详细使用说明 -- **PROJECT_OVERVIEW.md**: 项目架构和设计理念 -- **DEPLOYMENT_GUIDE.md**: 完整部署指南 - ---- - -## 开发计划 - -### v1.2.0 (计划中) -- [ ] Web 管理界面 -- [ ] 多服务器管理 -- [ ] 流量统计功能 -- [ ] 自动更新机制 - -### v1.3.0 (计划中) -- [ ] 用户管理系统 -- [ ] 监控告警功能 -- [ ] 负载均衡支持 -- [ ] API 接口 - -### 长期规划 -- [ ] 客户端配置生成器 -- [ ] 社区插件市场 -- [ ] 多语言支持 -- [ ] 移动端管理应用 - ---- - -## 贡献指南 - -欢迎社区贡献代码和建议: - -1. Fork 项目仓库 -2. 创建功能分支 -3. 提交代码更改 -4. 发起 Pull Request - -### 代码规范 -- 使用 Bash 最佳实践 -- 添加详细注释 -- 遵循项目结构 -- 编写测试用例 - -### 文档要求 -- 更新相关文档 -- 添加使用示例 -- 翻译多语言版本 - ---- - -## 许可证 - -本项目采用 MIT 许可证,详见 LICENSE 文件。 - ---- - -## 致谢 - -感谢 Hysteria2 项目团队提供优秀的网络工具。 -感谢所有贡献者和用户的支持与反馈。 diff --git a/DEPLOYMENT_GUIDE.md b/DEPLOYMENT_GUIDE.md deleted file mode 100644 index 91be28f..0000000 --- a/DEPLOYMENT_GUIDE.md +++ /dev/null @@ -1,382 +0,0 @@ -# Hysteria2 配置管理脚本部署指南 - -## 快速部署 - -### 方法一:一键安装(推荐) - -```bash -# 一键安装到服务器 -curl -fsSL https://raw.githubusercontent.com/sindricn/s-hy2/main/quick-install.sh | sudo bash - -# 运行脚本 -sudo s-hy2 -``` - -### 方法二:GitHub 克隆安装 - -```bash -# 克隆仓库 -git clone https://github.com/sindricn/s-hy2.git -cd s-hy2 - -# 运行安装脚本 -sudo ./install.sh - -# 或直接运行主脚本 -sudo ./hy2-manager.sh -``` - -### 方法二:手动部署 - -```bash -# 1. 克隆仓库 -git clone https://github.com/your-repo/hy2-manager.git -cd hy2-manager - -# 2. 设置权限 -chmod +x hy2-manager.sh -chmod +x scripts/*.sh - -# 3. 创建符号链接(可选) -sudo ln -sf $(pwd)/hy2-manager.sh /usr/local/bin/hy2-manager - -# 4. 运行脚本 -sudo ./hy2-manager.sh -``` - -## 使用流程 - -### 新手推荐流程(一键快速配置) - -1. **运行管理脚本** - ```bash - sudo s-hy2 - ``` - -2. **安装 Hysteria2** - - 选择菜单选项 `1. 安装 Hysteria2` - - 脚本会自动检测系统环境并安装 - -3. **一键快速配置** - - 选择菜单选项 `2. 一键快速配置` - - 脚本会自动完成所有配置并启动服务 - -4. **查看节点信息** - - 选择菜单选项 `8. 节点信息` - - 获取节点链接和客户端配置 - -### 高级用户流程(手动配置) - -1. **运行管理脚本** - ```bash - sudo s-hy2 - ``` - -2. **安装 Hysteria2** - - 选择菜单选项 `1. 安装 Hysteria2` - -3. **手动配置** - - 选择菜单选项 `3. 手动配置` - - 选择配置模式(ACME 或自签名证书) - - 按提示输入相关信息 - -4. **启动服务** - - 选择菜单选项 `4. 管理服务` - - 选择 `1. 启动服务` - - 选择 `4. 启用开机自启` - -### 配置模式选择 - -#### ACME 自动证书模式(推荐生产环境) - -**优点:** -- 自动申请和续期 SSL 证书 -- 高安全性,证书被广泛信任 -- 无需手动管理证书 - -**要求:** -- 拥有有效域名 -- 域名已解析到服务器 IP -- 服务器可访问互联网 -- 有效的邮箱地址 - -**配置步骤:** -1. 确保域名解析正确 -2. 输入域名(如:example.com) -3. 输入邮箱地址 -4. 设置认证密码 -5. 选择伪装网站 - -#### 自签名证书模式(适合测试环境) - -**优点:** -- 无需域名,快速部署 -- 适合内网或测试环境 -- 配置简单 - -**缺点:** -- 证书不被信任 -- 客户端需要忽略证书错误 - -**配置步骤:** -1. 选择伪装域名 -2. 设置认证密码 -3. 自动生成证书 - -## 进阶配置 - -### 域名优化 - -使用脚本的域名测试功能选择最优伪装域名: - -1. 选择菜单选项 `5. 测试伪装域名` -2. 选择 `2. 交互式选择域名` -3. 等待测试完成,选择延迟最低的域名 - -### 端口配置 - -如果默认 443 端口被占用: - -1. 选择菜单选项 `6. 进阶配置` -2. 选择 `1. 修改监听端口` -3. 输入新端口号 -4. 确保防火墙允许新端口 - -### 混淆配置 - -在网络环境较差时启用混淆: - -1. 选择菜单选项 `6. 进阶配置` -2. 选择 `2. 添加混淆配置` -3. 设置混淆密码 -4. 客户端需要配置相同密码 - -### 端口跳跃 - -提高连接稳定性: - -1. 选择菜单选项 `6. 进阶配置` -2. 选择 `4. 配置端口跳跃` -3. 选择网络接口 -4. 设置端口范围 - -## 客户端配置 - -### 基本配置 - -```yaml -server: your.server.com:443 -auth: your_password -tls: - sni: your.server.com - insecure: false # ACME 证书设为 false,自签名设为 true -socks5: - listen: 127.0.0.1:1080 -http: - listen: 127.0.0.1:8080 -``` - -### 混淆配置(如果服务器启用) - -```yaml -obfs: - type: salamander - salamander: - password: your_obfs_password -``` - -## 防火墙配置 - -### Ubuntu/Debian (UFW) - -```bash -# 允许 Hysteria2 端口 -sudo ufw allow 443/udp - -# 如果使用自定义端口 -sudo ufw allow YOUR_PORT/udp - -# 启用防火墙 -sudo ufw enable -``` - -### CentOS/RHEL (firewalld) - -```bash -# 允许 Hysteria2 端口 -sudo firewall-cmd --permanent --add-port=443/udp - -# 如果使用自定义端口 -sudo firewall-cmd --permanent --add-port=YOUR_PORT/udp - -# 重载配置 -sudo firewall-cmd --reload -``` - -## 监控和维护 - -### 查看服务状态 - -```bash -# 使用脚本查看 -sudo hy2-manager -# 选择 "3. 管理服务" - -# 或直接使用系统命令 -sudo systemctl status hysteria-server -``` - -### 查看日志 - -```bash -# 实时日志 -sudo journalctl -f -u hysteria-server - -# 历史日志 -sudo journalctl -u hysteria-server --since "1 hour ago" -``` - -### 配置备份 - -脚本会自动备份配置文件,手动备份: - -```bash -sudo cp /etc/hysteria/config.yaml /etc/hysteria/config.yaml.backup.$(date +%Y%m%d_%H%M%S) -``` - -## 故障排除 - -### 常见问题 - -1. **服务启动失败** - ```bash - # 检查配置文件 - sudo hysteria server --config /etc/hysteria/config.yaml --check - - # 查看详细日志 - sudo journalctl -u hysteria-server -n 50 - ``` - -2. **证书申请失败** - - 检查域名解析:`nslookup your.domain.com` - - 检查端口开放:`sudo netstat -tulnp | grep :80` - - 检查防火墙设置 - -3. **连接失败** - - 检查服务状态:`sudo systemctl status hysteria-server` - - 检查端口监听:`sudo netstat -tulnp | grep :443` - - 验证客户端配置 - -### 重新配置 - -如果需要重新配置: - -1. 停止服务:选择 "管理服务" -> "停止服务" -2. 重新生成配置:选择 "生成配置文件" -3. 启动服务:选择 "管理服务" -> "启动服务" - -## 卸载 - -### 卸载 Hysteria2 - -脚本提供两种卸载方式,根据需要选择: - -#### 方式一:仅卸载程序 (推荐) - -适用于: -- 临时卸载,可能重新安装 -- 保留配置以备后用 -- 升级或重装系统前备份 - -操作步骤: -1. 运行 `sudo hy2-manager` -2. 选择 `7. 卸载服务` -3. 选择 `1. 仅卸载程序 (保留配置文件和证书)` -4. 确认卸载 - -**保留内容:** -- 配置文件:`/etc/hysteria/config.yaml` -- SSL 证书文件 -- hysteria 用户账户 -- 自定义配置和备份 - -**手动清理命令:** -```bash -# 如需完全清理,可执行以下命令 -sudo rm -rf /etc/hysteria -sudo userdel -r hysteria -sudo rm -f /etc/systemd/system/multi-user.target.wants/hysteria-server.service -sudo rm -f /etc/systemd/system/multi-user.target.wants/hysteria-server@*.service -sudo systemctl daemon-reload -``` - -#### 方式二:完全卸载 - -适用于: -- 不再使用 Hysteria2 -- 彻底清理系统 -- 重新开始配置 - -操作步骤: -1. 运行 `sudo hy2-manager` -2. 选择 `7. 卸载服务` -3. 选择 `2. 完全卸载 (删除所有文件)` -4. 输入 `YES` 确认 - -**删除内容:** -- Hysteria2 程序文件 -- 所有配置文件和证书 -- hysteria 用户账户 -- systemd 服务文件 -- 端口跳跃 iptables 规则 - -### 卸载管理脚本 - -```bash -# 如果使用安装脚本安装 -sudo /opt/hy2-manager/install.sh --uninstall - -# 或手动删除 -sudo rm -rf /opt/hy2-manager -sudo rm -f /usr/local/bin/hy2-manager -``` - -### 卸载后验证 - -```bash -# 检查程序是否已删除 -which hysteria - -# 检查服务是否已停止 -sudo systemctl status hysteria-server - -# 检查配置目录 (仅程序卸载时可能存在) -ls -la /etc/hysteria - -# 检查用户是否存在 (仅程序卸载时可能存在) -id hysteria -``` - -## 安全建议 - -1. **使用强密码**:认证密码和混淆密码都应使用强密码 -2. **定期更新**:定期更新 Hysteria2 到最新版本 -3. **监控日志**:定期检查服务日志,发现异常及时处理 -4. **防火墙配置**:只开放必要的端口 -5. **证书管理**:ACME 证书会自动续期,自签名证书需要定期更新 - -## 性能优化 - -1. **选择最优伪装域名**:使用脚本的域名测试功能 -2. **合理设置带宽**:根据服务器带宽设置合理限制 -3. **启用混淆**:在网络环境较差时启用混淆 -4. **端口跳跃**:在需要时配置端口跳跃提高稳定性 - -## 技术支持 - -如遇到问题,请: - -1. 查看日志文件 -2. 检查配置文件 -3. 参考故障排除指南 -4. 提交 Issue 到项目仓库 diff --git a/FEATURES.md b/FEATURES.md deleted file mode 100644 index 2ad1a6f..0000000 --- a/FEATURES.md +++ /dev/null @@ -1,298 +0,0 @@ -# S-Hy2 功能特性详解 - -## 🚀 一键安装部署 - -### GitHub 一键安装 -```bash -curl -fsSL https://raw.githubusercontent.com/sindricn/s-hy2/main/quick-install.sh | sudo bash -``` - -**特性:** -- 自动检测系统环境 (Ubuntu/Debian/CentOS/RHEL/Fedora) -- 自动安装必要依赖 (curl, wget, git, openssl, net-tools, iptables) -- 从 GitHub 下载最新版本脚本 -- 创建快捷命令 `s-hy2` 和 `hy2-manager` -- 设置正确的文件权限 -- 创建桌面快捷方式 (可选) - -## 🎯 快捷命令 - -安装完成后,可以使用以下命令快速启动: - -```bash -# 推荐使用 (简短易记) -sudo s-hy2 - -# 或者使用完整命令 -sudo hy2-manager -``` - -## 📋 主菜单功能 - -### 1. 安装 Hysteria2 -- 自动检测系统环境 -- 预安装检查 (网络、端口、防火墙) -- 更新系统包和安装依赖 -- 下载并安装 Hysteria2 官方程序 -- 创建配置目录和设置权限 - -### 2. 一键快速配置 ⭐ (新功能) -**完全自动化配置,无需任何手动输入** - -**自动执行步骤:** -1. **服务器信息获取** - - 自动获取公网IP地址 - - 自动检测网络接口 (通过 `ip route` 和 `ip link`) - -2. **智能伪装域名选择** - - 测试 30+ 优质域名延迟 - - 自动选择延迟最低的域名 - - 包含 Cloudflare、Google、Microsoft、Apple 等知名服务 - -3. **安全密码生成** - - 认证密码:16位随机强密码 - - 混淆密码:16位随机强密码 - - 使用 OpenSSL 生成,确保安全性 - -4. **自签名证书生成** - - 使用 ECC P-256 算法 - - 10年有效期 - - 自动设置正确权限 - -5. **端口跳跃配置** - - 默认范围:20000-50000 - - 目标端口:443 - - 自动生成 iptables 规则 - - 保存配置以便管理 - -6. **服务启动** - - 自动启动 Hysteria2 服务 - - 设置开机自启 - - 验证服务状态 - -**配置结果:** -- 证书类型:自签名 (无需域名) -- 混淆:Salamander 算法 -- 端口跳跃:已启用 -- 伪装域名:自动选择最优 -- 服务状态:运行中 - -### 3. 手动配置 -传统的交互式配置方式,支持: - -#### ACME 自动证书模式 -- 域名验证和邮箱验证 -- 自动申请 Let's Encrypt 证书 -- 自动续期 -- 适合生产环境 - -#### 自签名证书模式 -- 自定义伪装域名 -- 手动生成证书 -- 快速部署 -- 适合测试环境 - -### 4. 管理服务 -**完整的服务生命周期管理** - -#### 服务操作 -- 启动/停止/重启服务 -- 启用/禁用开机自启 -- 详细的服务状态显示 - -#### 状态监控 -- 实时服务状态 -- 端口监听状态 -- 进程信息 (PID、内存、CPU) -- 配置文件状态 - -#### 配置管理 -- 查看配置文件 -- 编辑配置文件 (nano) -- 备份和恢复配置 -- 配置文件语法验证 - -### 5. 查看日志 -- 实时日志查看 (`journalctl -f`) -- 历史日志查询 (50/100/500行,今天,自定义) -- 日志过滤和搜索 - -### 6. 测试伪装域名 -**智能域名选择系统** - -#### 预设域名测试 -- 30+ 优质域名列表 -- 并发延迟测试 -- 按延迟排序显示结果 - -#### 交互式选择 -- 显示测试结果排行榜 -- 一键选择并更新配置 -- 自动重启服务应用更改 - -#### 自定义域名测试 -- 支持测试用户输入的域名 -- 批量测试多个域名 -- 显示详细测试结果 - -### 7. 进阶配置 -**高级网络配置选项** - -#### 端口修改 -- 修改默认 443 端口 -- 端口占用检测 -- 防火墙配置提醒 - -#### 混淆配置 -- 添加/移除 Salamander 混淆 -- 自动生成混淆密码 -- 客户端配置提醒 - -#### 端口跳跃 -- 自动检测网络接口 -- 自定义端口范围 -- iptables 规则管理 -- 规则持久化保存 - -### 8. 节点信息 ⭐ (新功能) -**完整的节点信息展示和管理** - -#### 基本信息显示 -- 服务器地址和端口 -- 认证密码和混淆密码 -- SNI域名和证书类型 -- 端口跳跃配置 - -#### 节点链接生成 -- 标准 Hysteria2:// 协议链接 -- 包含所有必要参数 -- 支持复制到剪贴板 - -#### 订阅链接生成 -- Base64 编码的订阅链接 -- 兼容主流客户端 -- 支持批量导入 - -#### 客户端配置生成 -- 完整的 YAML 配置文件 -- 包含所有连接参数 -- 可直接复制使用 - -#### 二维码生成 -- 支持 qrencode 生成二维码 -- 方便移动设备扫码导入 -- 自动安装提示 - -#### 信息保存 -- 保存到 `/etc/hysteria/node-info.txt` -- 包含所有连接信息 -- 便于备份和分享 - -### 9. 卸载服务 -**灵活的卸载选项** - -#### 仅卸载程序 (推荐) -- 删除 Hysteria2 程序文件 -- 保留配置文件和证书 -- 保留用户账户 -- 适合临时卸载或升级 - -#### 完全卸载 -- 删除所有相关文件 -- 清理用户账户 -- 清理 systemd 服务 -- 清理 iptables 规则 -- 需要输入 "YES" 确认 - -### 10. 关于脚本 -- 版本信息 -- 功能特性介绍 -- 使用说明 - -## 🔧 技术特性 - -### 自动化程度 -- **一键快速配置**:零手动输入,3分钟完成部署 -- **智能检测**:自动识别系统环境和网络配置 -- **错误处理**:完善的错误检测和恢复机制 - -### 安全性 -- **强密码生成**:使用 OpenSSL 生成随机密码 -- **权限控制**:配置文件 600 权限,证书文件专用用户 -- **混淆加密**:默认启用 Salamander 混淆 -- **端口跳跃**:增强连接稳定性和安全性 - -### 兼容性 -- **多系统支持**:Ubuntu/Debian/CentOS/RHEL/Fedora -- **版本兼容**:支持各主要版本 -- **架构支持**:x86_64/ARM64 等主流架构 - -### 用户体验 -- **彩色界面**:清晰的颜色标识和提示 -- **详细反馈**:每步操作都有明确的状态反馈 -- **错误提示**:友好的错误信息和解决建议 -- **快捷命令**:简短易记的 `s-hy2` 命令 - -### 可维护性 -- **模块化设计**:功能模块独立,易于维护 -- **配置备份**:自动备份配置文件 -- **日志记录**:详细的操作和错误日志 -- **版本控制**:支持在线更新和回滚 - -## 🎯 使用场景 - -### 新手用户 -- 使用 "一键快速配置" 功能 -- 零技术门槛,3分钟完成部署 -- 自动优化所有配置参数 - -### 高级用户 -- 使用 "手动配置" 功能 -- 自定义所有配置参数 -- 使用进阶配置功能 - -### 生产环境 -- 使用 ACME 自动证书 -- 配置域名和邮箱 -- 启用监控和日志 - -### 测试环境 -- 使用自签名证书 -- 快速部署和测试 -- 方便重置和重新配置 - -## 📊 性能优化 - -### 域名选择优化 -- 自动测试 30+ 优质域名 -- 选择延迟最低的域名 -- 减少连接建立时间 - -### 网络优化 -- 端口跳跃提高稳定性 -- 混淆加密绕过检测 -- 自动检测最优网络接口 - -### 系统优化 -- 合理的默认配置参数 -- 自动设置文件权限 -- 优化的服务启动配置 - -## 🔄 更新和维护 - -### 在线更新 -- 支持从 GitHub 获取最新版本 -- 保留用户配置和数据 -- 自动备份重要文件 - -### 配置管理 -- 自动配置备份机制 -- 支持配置版本控制 -- 快速恢复和回滚 - -### 监控告警 -- 服务状态监控 -- 日志异常检测 -- 性能指标收集 - -这个 S-Hy2 脚本项目提供了从安装到配置、从管理到监控的完整解决方案,特别是新增的"一键快速配置"功能,让 Hysteria2 的部署变得前所未有的简单! diff --git a/PROJECT_OVERVIEW.md b/PROJECT_OVERVIEW.md deleted file mode 100644 index 3e8ffac..0000000 --- a/PROJECT_OVERVIEW.md +++ /dev/null @@ -1,243 +0,0 @@ -# Hysteria2 配置管理脚本项目总览 - -## 项目简介 - -这是一个用于简化 Hysteria2 服务器配置和管理的交互式脚本工具。通过友好的菜单界面,用户可以轻松完成 Hysteria2 的安装、配置、管理等操作,无需记忆复杂的命令行参数。 - -## 项目特色 - -### 🚀 一键操作 -- 自动安装/卸载 Hysteria2 -- 智能检测系统环境 -- 自动处理依赖关系 - -### ⚙️ 智能配置 -- 交互式配置生成器 -- 支持 ACME 和自签名两种证书模式 -- 自动生成安全密码 -- 配置文件语法验证 - -### 🌐 域名优化 -- 自动测试多个优质域名 -- 按延迟排序选择最优伪装域名 -- 支持自定义域名测试 -- 实时延迟监控 - -### 🔧 进阶功能 -- 端口修改和冲突检测 -- 混淆配置管理 -- 端口跳跃设置 -- iptables 规则自动化 - -### 📊 服务管理 -- 实时服务状态监控 -- 详细的日志查看功能 -- 配置文件备份和恢复 -- 性能监控 - -## 技术架构 - -### 模块化设计 -``` -hy2-manager/ -├── hy2-manager.sh # 主控制脚本 -├── scripts/ # 功能模块 -│ ├── install.sh # 安装模块 -│ ├── config.sh # 配置生成模块 -│ ├── service.sh # 服务管理模块 -│ ├── domain-test.sh # 域名测试模块 -│ └── advanced.sh # 进阶配置模块 -├── templates/ # 配置模板 -│ ├── acme-config.yaml # ACME 配置模板 -│ ├── self-cert-config.yaml # 自签名配置模板 -│ ├── advanced-config.yaml # 高级配置模板 -│ └── client-config.yaml # 客户端配置示例 -└── docs/ # 文档目录 - ├── README.md # 项目说明 - ├── USAGE.md # 使用说明 - └── PROJECT_OVERVIEW.md # 项目总览 -``` - -### 核心功能模块 - -#### 1. 安装模块 (install.sh) -- 系统环境检测 -- 依赖包安装 -- Hysteria2 下载和安装 -- 预安装检查 -- 端口占用检测 - -#### 2. 配置生成模块 (config.sh) -- ACME 自动证书配置 -- 自签名证书生成 -- 密码生成和验证 -- 域名和邮箱验证 -- 配置文件生成 - -#### 3. 域名测试模块 (domain-test.sh) -- 批量域名延迟测试 -- 结果排序和展示 -- 交互式域名选择 -- 自定义域名测试 -- 配置文件更新 - -#### 4. 服务管理模块 (service.sh) -- 服务状态监控 -- 启动/停止/重启操作 -- 开机自启管理 -- 实时和历史日志查看 -- 配置文件操作 - -#### 5. 进阶配置模块 (advanced.sh) -- 端口修改 -- 混淆配置管理 -- 端口跳跃设置 -- iptables 规则管理 -- 配置状态查看 - -## 安全特性 - -### 密码安全 -- 自动生成强密码 -- 支持自定义密码 -- 密码强度验证 - -### 证书管理 -- ACME 自动续期 -- 自签名证书生成 -- 证书权限管理 - -### 配置安全 -- 配置文件权限控制 -- 自动备份机制 -- 语法验证 - -### 网络安全 -- 防火墙配置提醒 -- 端口占用检测 -- iptables 规则管理 - -## 兼容性 - -### 支持的操作系统 -- Ubuntu 18.04+ -- Debian 9+ -- CentOS 7+ -- RHEL 7+ -- Fedora 30+ - -### 系统要求 -- Linux 内核 3.10+ -- Root 权限 -- 网络连接 -- 至少 100MB 可用空间 - -## 使用场景 - -### 个人用户 -- 快速搭建个人代理服务器 -- 学习和测试 Hysteria2 -- 家庭网络优化 - -### 企业用户 -- 内网穿透 -- 分支机构连接 -- 网络加速 - -### 开发者 -- 开发环境搭建 -- 网络调试 -- 性能测试 - -## 性能优化 - -### 域名选择优化 -- 自动测试延迟 -- 智能选择最优域名 -- 减少连接时间 - -### 配置优化 -- 合理的默认参数 -- 带宽限制设置 -- 混淆配置优化 - -### 系统优化 -- 内核参数调优建议 -- 防火墙规则优化 -- 日志轮转配置 - -## 扩展性 - -### 模块化架构 -- 易于添加新功能 -- 独立的功能模块 -- 清晰的接口定义 - -### 配置模板 -- 支持多种配置模式 -- 易于扩展新模板 -- 参数化配置 - -### 插件机制 -- 支持自定义脚本 -- 钩子函数支持 -- 第三方集成 - -## 维护和支持 - -### 日志系统 -- 详细的操作日志 -- 错误信息记录 -- 性能监控数据 - -### 备份机制 -- 自动配置备份 -- 版本控制 -- 快速恢复 - -### 更新机制 -- 在线更新检查 -- 增量更新支持 -- 回滚机制 - -## 未来规划 - -### 功能增强 -- Web 管理界面 -- 多服务器管理 -- 流量统计分析 -- 用户管理系统 - -### 性能优化 -- 更智能的域名选择 -- 自动性能调优 -- 负载均衡支持 - -### 生态建设 -- 客户端配置生成器 -- 监控告警系统 -- 社区插件市场 - -## 贡献指南 - -欢迎社区贡献代码和建议: - -1. Fork 项目仓库 -2. 创建功能分支 -3. 提交代码更改 -4. 发起 Pull Request - -### 代码规范 -- 使用 Bash 最佳实践 -- 添加详细注释 -- 遵循项目结构 -- 编写测试用例 - -### 文档要求 -- 更新相关文档 -- 添加使用示例 -- 翻译多语言版本 - -## 许可证 - -本项目采用 MIT 许可证,详见 LICENSE 文件。 diff --git a/README.md b/README.md index a69a83c..1ae7814 100644 --- a/README.md +++ b/README.md @@ -5,12 +5,12 @@ ## 功能特性 - 🚀 **一键安装/卸载** Hysteria2 服务器 -- ⚙️ **智能配置生成** 支持 ACME 自动证书和自签名证书,智能域名配置 +- ⚙️ **智能配置生成** 支持 ACME 自动证书和自签名证书 - 🌐 **服务器域名管理** 配置和验证服务器域名解析 - 🔧 **智能端口跳跃** 配置后自动检测和管理端口跳跃状态 - 📊 **智能服务管理** 配置后询问是否立即重启服务 - 📱 **多客户端支持** 生成适配不同客户端的订阅链接 -- 📝 **配置模板** 预设多种常用配置模板 +- 🛠️ **配置管理** 图形化修改配置参数或直接编辑配置文件 ## 快速开始 @@ -47,11 +47,10 @@ sudo ./hy2-manager.sh 4. **管理服务** - 启动/停止/重启/查看状态 5. **查看日志** - 查看服务运行日志 6. **测试伪装域名** - 测试并选择最优伪装域名 -7. **进阶配置** - 端口跳跃、混淆等高级设置 -8. **节点信息** - 显示节点链接、订阅链接和客户端配置 -9. **卸载服务** - 提供两种卸载方式: - - 仅卸载程序 (保留配置文件和证书) - - 完全卸载 (删除所有文件) +7. **服务器域名配置** - 设置和验证服务器域名 +8. **配置管理** - 修改配置参数或编辑配置文件 +9. **节点信息** - 显示节点链接、订阅链接和客户端配置 +10. **卸载服务** - 提供多种卸载选项 ## 配置模式 @@ -61,7 +60,6 @@ sudo ./hy2-manager.sh - **伪装域名**: 自动测试选择延迟最低的域名 - **安全特性**: 自动生成认证密码和混淆密码 - **网络优化**: 自动配置端口跳跃 (20000-50000) -- **网卡检测**: 自动识别网络接口 - **适用场景**: 快速部署、测试环境、新手用户 ### ACME 自动证书模式 @@ -74,23 +72,34 @@ sudo ./hy2-manager.sh - 无需域名,快速部署 - 适合测试环境 +## 配置管理功能 + +新增的配置管理功能允许您: + +- **查看当前配置** - 显示完整配置文件内容 +- **修改认证密码** - 更改或生成新的认证密码 +- **修改端口设置** - 更改服务监听端口 +- **修改混淆设置** - 启用/禁用/修改混淆配置 +- **打开配置文件编辑** - 使用文本编辑器直接修改配置 + +所有配置修改都会自动备份原配置文件,并可选择立即重启服务应用更改。 + ## 目录结构 ``` s-hy2/ ├── hy2-manager.sh # 主脚本 ├── quick-install.sh # 一键安装脚本 +├── install.sh # 独立安装脚本 ├── scripts/ # 功能脚本目录 │ ├── install.sh # 安装脚本 │ ├── config.sh # 配置生成脚本 (含一键快速配置) │ ├── service.sh # 服务管理脚本 │ ├── domain-test.sh # 域名测试脚本 -│ ├── advanced.sh # 进阶配置脚本 │ └── node-info.sh # 节点信息脚本 ├── templates/ # 配置模板目录 │ ├── acme-config.yaml # ACME 配置模板 │ ├── self-cert-config.yaml # 自签名配置模板 -│ ├── advanced-config.yaml # 高级配置模板 │ └── client-config.yaml # 客户端配置示例 └── README.md # 说明文档 ``` @@ -119,7 +128,7 @@ sudo hy2-manager ### 完整部署流程 ```bash # 1. 一键安装 -curl -fsSL https://raw.githubusercontent.com/your-repo/s-hy2/main/quick-install.sh | sudo bash +curl -fsSL https://raw.githubusercontent.com/sindricn/s-hy2/main/quick-install.sh | sudo bash # 2. 启动脚本 sudo s-hy2 @@ -127,7 +136,7 @@ sudo s-hy2 # 3. 按菜单操作 # 选择 1 -> 安装 Hysteria2 # 选择 2 -> 一键快速配置 -# 选择 8 -> 查看节点信息 +# 选择 9 -> 查看节点信息 ``` ### 预期输出 @@ -163,18 +172,21 @@ sudo s-hy2 ## 常见问题 +### Q: 如何修改配置参数? +A: 运行 `sudo s-hy2`,选择菜单 "8. 配置管理",可以图形化修改密码、端口、混淆等设置,或直接编辑配置文件。 + ### Q: 一键快速配置包含哪些功能? A: 自动获取服务器IP、测试最优伪装域名、生成随机密码、创建自签名证书、配置混淆和端口跳跃、启动服务。 ### Q: 如何获取节点连接信息? -A: 运行 `sudo s-hy2`,选择菜单 "8. 节点信息",可查看节点链接、订阅链接和客户端配置。 +A: 运行 `sudo s-hy2`,选择菜单 "9. 节点信息",可查看节点链接、订阅链接和客户端配置。 ### Q: 支持哪些操作系统? A: Ubuntu 18.04+、Debian 9+、CentOS 7+、RHEL 7+、Fedora 30+。 ### Q: 如何卸载? -A: 运行脚本选择 "9. 卸载服务",提供"仅卸载程序"和"完全卸载"两种方式。 +A: 运行脚本选择 "10. 卸载服务",提供多种卸载方式选择。 ## 许可证 -MIT License +MIT License \ No newline at end of file diff --git a/UNINSTALL_GUIDE.md b/UNINSTALL_GUIDE.md deleted file mode 100644 index 9bf2653..0000000 --- a/UNINSTALL_GUIDE.md +++ /dev/null @@ -1,333 +0,0 @@ -# Hysteria2 卸载指南 - -本指南详细说明如何正确卸载 Hysteria2 服务器和配置管理脚本。 - -## 卸载方式对比 - -| 卸载方式 | 程序文件 | 配置文件 | 证书文件 | 用户账户 | 管理脚本 | 适用场景 | -|---------|---------|---------|---------|---------|---------|---------| -| 方式1: 仅卸载服务器 | ✅ 删除 | ❌ 保留 | ❌ 保留 | ❌ 保留 | ❌ 保留 | 临时卸载、升级、重装 | -| 方式2: 卸载服务器及配置 | ✅ 删除 | ✅ 删除 | ✅ 删除 | ✅ 删除 | ❌ 保留 | 清理配置,保留脚本 | -| 方式3: 卸载所有内容 | ✅ 删除 | ✅ 删除 | ✅ 删除 | ✅ 删除 | ✅ 删除 | 彻底清理、不再使用 | - -## 方式一:仅卸载 Hysteria2 服务器 - -### 适用场景 -- 临时卸载,计划重新安装 -- 系统升级或重装前的准备 -- 保留配置以备后用 -- 测试不同版本 - -### 操作步骤 - -1. **运行管理脚本** - ```bash - sudo s-hy2 - ``` - -2. **选择卸载选项** - - 选择 `9. 卸载服务` - - 选择 `1. 仅卸载 Hysteria2 服务器 (保留配置文件)` - -3. **确认卸载** - - 输入 `y` 确认 - -### 卸载结果 - -**删除的内容:** -- `/usr/local/bin/hysteria` - 主程序文件 -- `/etc/systemd/system/hysteria-server.service` - 系统服务文件 -- `/etc/systemd/system/hysteria-server@.service` - 系统服务模板 - -**保留的内容:** -- `/etc/hysteria/config.yaml` - 配置文件 -- `/etc/hysteria/server.crt` - SSL 证书 (如果存在) -- `/etc/hysteria/server.key` - SSL 私钥 (如果存在) -- `/etc/hysteria/*.backup.*` - 配置备份文件 -- `hysteria` 用户账户 - -### 手动清理 (可选) - -如果后续不再需要这些文件,可以手动清理: - -```bash -# 删除配置目录 -sudo rm -rf /etc/hysteria - -# 删除用户账户 -sudo userdel -r hysteria - -# 清理 systemd 服务残留 -sudo rm -f /etc/systemd/system/multi-user.target.wants/hysteria-server.service -sudo rm -f /etc/systemd/system/multi-user.target.wants/hysteria-server@*.service -sudo systemctl daemon-reload -``` - -## 方式二:卸载 Hysteria2 服务器及配置文件 - -### 适用场景 -- 清理所有配置,但保留管理脚本 -- 重新开始全新配置 -- 清理测试环境 -- 保留脚本便于重新部署 - -### 操作步骤 - -1. **运行管理脚本** - ```bash - sudo s-hy2 - ``` - -2. **选择卸载选项** - - 选择 `9. 卸载服务` - - 选择 `2. 卸载 Hysteria2 服务器及配置文件` - -3. **确认卸载** - - 输入 `y` 确认 - -### 卸载结果 - -**删除的内容:** -- Hysteria2 程序文件 -- 所有配置文件和证书 -- hysteria 用户账户 -- systemd 服务文件 -- 端口跳跃 iptables 规则 - -**保留的内容:** -- 管理脚本 (s-hy2) - -## 方式三:卸载脚本及 Hysteria2 服务器和所有文件 - -### 适用场景 -- 不再使用 Hysteria2 和管理脚本 -- 彻底清理系统 -- 服务器用途完全改变 -- 完全移除所有相关文件 - -### 操作步骤 - -1. **运行管理脚本** - ```bash - sudo s-hy2 - ``` - -2. **选择完全卸载** - - 选择 `9. 卸载服务` - - 选择 `3. 卸载脚本及 Hysteria2 服务器和所有文件` - -3. **确认卸载** - - 输入 `YES` (必须大写) 确认 - -### 卸载过程 - -脚本会按以下步骤执行: - -1. **清理端口跳跃配置** - 删除 iptables 规则 -2. **卸载程序** - 使用官方卸载脚本 -3. **删除配置** - 删除 `/etc/hysteria` 目录 -4. **删除用户** - 删除 `hysteria` 用户账户 -5. **清理服务** - 清理 systemd 服务残留 -6. **清理规则残留** - 删除可能的 iptables 规则残留 -7. **删除快捷方式** - 删除 s-hy2 和 hy2-manager 命令 -8. **删除脚本目录** - 删除 `/opt/s-hy2` 目录 - -### 卸载结果 - -**完全删除的内容:** -- 所有程序文件 -- 所有配置文件和备份 -- 所有 SSL 证书 -- hysteria 用户账户 -- systemd 服务文件 -- 端口跳跃配置和规则 -- 管理脚本和快捷命令 -- 桌面快捷方式 - -## 卸载验证 - -### 检查程序是否已删除 -```bash -# 检查程序文件 -which hysteria -# 应该显示: hysteria not found - -# 检查命令是否可用 -hysteria --version -# 应该显示: command not found -``` - -### 检查服务状态 -```bash -# 检查服务状态 -sudo systemctl status hysteria-server -# 应该显示: Unit hysteria-server.service could not be found - -# 检查服务文件 -ls -la /etc/systemd/system/hysteria-server* -# 应该显示: No such file or directory -``` - -### 检查配置文件 (仅程序卸载时) -```bash -# 检查配置目录 -ls -la /etc/hysteria/ -# 仅程序卸载: 显示配置文件 -# 完全卸载: No such file or directory -``` - -### 检查用户账户 (仅程序卸载时) -```bash -# 检查用户是否存在 -id hysteria -# 仅程序卸载: 显示用户信息 -# 完全卸载: no such user -``` - -### 检查端口监听 -```bash -# 检查端口是否还在监听 -sudo netstat -tulnp | grep :443 -# 应该没有 hysteria 相关的监听 -``` - -## 重新安装 - -### 从方式1卸载后重新安装 - -由于配置文件保留,重新安装后可以直接使用: - -```bash -# 重新安装 -sudo s-hy2 -# 选择 "1. 安装 Hysteria2" - -# 启动服务 -sudo s-hy2 -# 选择 "4. 管理服务" -> "1. 启动服务" -``` - -### 从方式2卸载后重新安装 - -需要重新配置: - -```bash -# 安装程序 -sudo s-hy2 -# 选择 "1. 安装 Hysteria2" - -# 一键快速配置 -sudo s-hy2 -# 选择 "2. 一键快速配置" -``` - -### 从方式3卸载后重新安装 - -需要重新安装脚本和配置: - -```bash -# 重新安装脚本 -curl -fsSL https://raw.githubusercontent.com/sindricn/s-hy2/main/quick-install.sh | sudo bash - -# 运行脚本 -sudo s-hy2 - -# 安装 Hysteria2 -# 选择 "1. 安装 Hysteria2" - -# 一键快速配置 -# 选择 "2. 一键快速配置" -``` - -## 卸载管理脚本 - -如果不再需要配置管理脚本: - -```bash -# 方法1: 使用脚本内置卸载功能 (推荐) -sudo s-hy2 -# 选择 "9. 卸载服务" -> "3. 卸载脚本及 Hysteria2 服务器和所有文件" - -# 方法2: 使用安装脚本卸载 -sudo /opt/s-hy2/install.sh --uninstall - -# 方法3: 手动删除 -sudo rm -rf /opt/s-hy2 -sudo rm -f /usr/local/bin/hy2-manager -sudo rm -f /usr/local/bin/s-hy2 -sudo rm -f ~/Desktop/S-Hy2-Manager.desktop # 如果创建了桌面快捷方式 -``` - -## 故障排除 - -### 卸载失败 - -如果卸载过程中出现错误: - -1. **检查网络连接** - ```bash - curl -I https://get.hy2.sh/ - ``` - -2. **手动停止服务** - ```bash - sudo systemctl stop hysteria-server - sudo systemctl disable hysteria-server - ``` - -3. **手动删除文件** - ```bash - sudo rm -f /usr/local/bin/hysteria - sudo rm -f /etc/systemd/system/hysteria-server* - sudo systemctl daemon-reload - ``` - -### 残留文件清理 - -如果发现有残留文件: - -```bash -# 查找所有相关文件 -sudo find / -name "*hysteria*" 2>/dev/null - -# 查找相关进程 -ps aux | grep hysteria - -# 查找相关端口 -sudo netstat -tulnp | grep hysteria -``` - -### 权限问题 - -如果遇到权限问题: - -```bash -# 确保以 root 权限运行 -sudo su - - -# 强制删除文件 -sudo rm -rf /etc/hysteria -sudo userdel -f hysteria 2>/dev/null -``` - -## 注意事项 - -1. **备份重要数据** - 卸载前备份重要的配置文件 -2. **确认卸载方式** - 根据实际需求选择合适的卸载方式 -3. **检查依赖服务** - 确保没有其他服务依赖 Hysteria2 -4. **防火墙规则** - 卸载后可能需要手动清理防火墙规则 -5. **客户端配置** - 卸载后记得更新客户端配置 - -## 常见问题 - -**Q: 卸载后还能恢复配置吗?** -A: 如果选择"仅卸载程序",配置文件会保留,重新安装后可以直接使用。 - -**Q: 完全卸载后如何恢复?** -A: 完全卸载后无法自动恢复,需要重新配置。建议卸载前备份配置文件。 - -**Q: 卸载会影响其他服务吗?** -A: 正常情况下不会,但如果有自定义的 iptables 规则可能需要手动清理。 - -**Q: 如何确认卸载是否成功?** -A: 按照"卸载验证"部分的步骤检查各项内容是否已删除。 diff --git a/USAGE.md b/USAGE.md deleted file mode 100644 index beecd5e..0000000 --- a/USAGE.md +++ /dev/null @@ -1,307 +0,0 @@ -# Hysteria2 配置管理脚本使用说明 - -## 快速开始 - -### 方法一:一键安装(推荐) - -```bash -# 一键安装到服务器 -curl -fsSL https://raw.githubusercontent.com/sindricn/s-hy2/main/quick-install.sh | sudo bash - -# 运行脚本 -sudo s-hy2 -``` - -### 方法二:手动安装 - -```bash -# 下载脚本 -wget https://raw.githubusercontent.com/sindricn/s-hy2/main/hy2-manager.sh - -# 添加执行权限 -chmod +x hy2-manager.sh - -# 运行脚本 -sudo ./hy2-manager.sh -``` - -## 使用流程 - -### 新手推荐流程 (一键快速配置) - -1. **运行管理脚本** - ```bash - sudo s-hy2 - ``` - -2. **安装 Hysteria2** - - 选择菜单选项 `1. 安装 Hysteria2` - - 脚本会自动检测系统环境并安装 - -3. **一键快速配置** - - 选择菜单选项 `2. 一键快速配置` - - 脚本会自动执行以下步骤: - - 获取服务器公网IP和网络接口 - - 测试并选择最优伪装域名 - - 生成随机认证密码和混淆密码 - - 生成自签名证书 - - 配置端口跳跃 (20000-50000) - - 启动服务并设置开机自启 - -4. **查看节点信息** - - 选择菜单选项 `8. 节点信息` - - 获取节点链接、订阅链接和客户端配置 - -### 高级用户流程 (手动配置) - -1. **安装 Hysteria2** - 选择菜单选项 `1. 安装 Hysteria2` -2. **手动配置** - 选择菜单选项 `3. 手动配置` -3. **管理服务** - 选择菜单选项 `4. 管理服务` - -## 详细功能说明 - -### 安装功能 - -脚本会自动: -- 检查系统环境 -- 更新系统包 -- 安装必要依赖 -- 下载并安装 Hysteria2 -- 创建配置目录 - -### 配置生成 - -支持两种配置模式: - -#### ACME 自动证书模式 (推荐) -- **优点**: 自动申请和续期证书,安全性高 -- **要求**: 需要有效域名,域名需解析到服务器 -- **适用**: 生产环境 - -配置步骤: -1. 输入域名 (如: example.com) -2. 输入邮箱地址 -3. 设置认证密码 -4. 选择伪装网站 - -#### 自签名证书模式 -- **优点**: 无需域名,快速部署 -- **缺点**: 证书不被信任,需要客户端忽略证书错误 -- **适用**: 测试环境 - -配置步骤: -1. 选择伪装域名 -2. 设置认证密码 -3. 自动生成自签名证书 - -### 伪装域名优化 - -脚本提供智能域名选择功能: - -1. **自动测试**: 测试预设的优质域名列表 -2. **延迟排序**: 按延迟从低到高排序 -3. **交互选择**: 可手动选择最优域名 -4. **自定义测试**: 支持测试自定义域名 - -预设域名包括: -- Cloudflare CDN -- Google 服务 -- Microsoft 服务 -- Apple 服务 -- AWS 服务 -- 其他知名 CDN - -### 服务管理 - -提供完整的服务管理功能: - -#### 服务操作 -- **启动服务**: `systemctl start hysteria-server` -- **停止服务**: `systemctl stop hysteria-server` -- **重启服务**: `systemctl restart hysteria-server` -- **开机自启**: `systemctl enable hysteria-server` - -#### 状态查看 -- 服务运行状态 -- 端口监听状态 -- 进程信息 -- 配置文件状态 - -#### 日志管理 -- 实时日志查看 -- 历史日志查询 -- 按时间筛选 -- 按行数限制 - -### 进阶配置 - -#### 端口修改 -- 修改默认 443 端口 -- 检查端口占用 -- 自动更新配置 -- 防火墙提醒 - -#### 混淆配置 -- 添加 Salamander 混淆 -- 自动生成混淆密码 -- 移除混淆配置 -- 客户端配置提醒 - -#### 端口跳跃 -- 自动检测网卡 -- 配置端口范围 -- 生成 iptables 规则 -- 规则持久化 - -## 配置文件说明 - -### 基本配置项 - -```yaml -# 监听端口 -listen: :443 - -# 认证配置 -auth: - type: password - password: your_password - -# 伪装配置 -masquerade: - type: proxy - proxy: - url: https://example.com/ - rewriteHost: true -``` - -### 高级配置项 - -```yaml -# 混淆配置 -obfs: - type: salamander - salamander: - password: obfs_password - -# 带宽限制 -bandwidth: - up: 1 gbps - down: 1 gbps - -# ACL 访问控制 -acl: /etc/hysteria/acl.txt -``` - -## 卸载说明 - -脚本提供两种卸载方式: - -### 方式一:仅卸载程序 (推荐) - -这种方式只删除 Hysteria2 程序文件,保留配置文件和证书: - -1. 选择菜单选项 `7. 卸载服务` -2. 选择 `1. 仅卸载程序 (保留配置文件和证书)` -3. 确认卸载 - -**保留的文件:** -- 配置文件:`/etc/hysteria/config.yaml` -- SSL 证书:`/etc/hysteria/server.crt` 和 `/etc/hysteria/server.key` -- 用户账户:`hysteria` - -**如需完全清理,可手动执行:** -```bash -# 删除配置文件和证书 -sudo rm -rf /etc/hysteria - -# 删除用户账户 -sudo userdel -r hysteria - -# 清理 systemd 服务残留 -sudo rm -f /etc/systemd/system/multi-user.target.wants/hysteria-server.service -sudo rm -f /etc/systemd/system/multi-user.target.wants/hysteria-server@*.service -sudo systemctl daemon-reload -``` - -### 方式二:完全卸载 - -这种方式删除所有 Hysteria2 相关文件: - -1. 选择菜单选项 `7. 卸载服务` -2. 选择 `2. 完全卸载 (删除所有文件)` -3. 输入 `YES` 确认 - -**删除的内容:** -- Hysteria2 程序文件 -- 所有配置文件和证书 -- hysteria 用户账户 -- systemd 服务文件 -- 端口跳跃 iptables 规则 - -## 故障排除 - -### 常见问题 - -1. **服务启动失败** - - 检查配置文件语法 - - 查看服务日志 - - 确认端口未被占用 - -2. **证书申请失败** - - 确认域名解析正确 - - 检查防火墙设置 - - 验证邮箱地址 - -3. **连接失败** - - 检查防火墙规则 - - 确认端口开放 - - 验证客户端配置 - -### 日志查看 - -```bash -# 查看服务状态 -systemctl status hysteria-server - -# 查看实时日志 -journalctl -f -u hysteria-server - -# 查看历史日志 -journalctl -u hysteria-server --since "1 hour ago" -``` - -### 配置验证 - -```bash -# 验证配置文件语法 -hysteria server --config /etc/hysteria/config.yaml --check - -# 测试配置文件 -hysteria server --config /etc/hysteria/config.yaml --test -``` - -## 安全建议 - -1. **使用强密码**: 认证密码和混淆密码都应使用强密码 -2. **定期更新**: 定期更新 Hysteria2 到最新版本 -3. **监控日志**: 定期检查服务日志,发现异常及时处理 -4. **防火墙配置**: 只开放必要的端口 -5. **证书管理**: ACME 证书会自动续期,自签名证书需要定期更新 - -## 性能优化 - -1. **选择最优伪装域名**: 使用脚本的域名测试功能 -2. **合理设置带宽**: 根据服务器带宽设置合理限制 -3. **启用混淆**: 在网络环境较差时启用混淆 -4. **端口跳跃**: 在需要时配置端口跳跃提高稳定性 - -## 客户端配置 - -服务器配置完成后,需要在客户端配置相应参数: - -- 服务器地址和端口 -- 认证密码 -- 混淆密码 (如果启用) -- 忽略证书错误 (自签名证书模式) - -具体客户端配置请参考 Hysteria2 官方文档。 diff --git a/demo.sh b/demo.sh deleted file mode 100644 index 444adb1..0000000 --- a/demo.sh +++ /dev/null @@ -1,529 +0,0 @@ -#!/bin/bash - -# Hysteria2 配置管理脚本演示程序 -# 此脚本用于演示项目功能,不会实际安装或修改系统 - -set -e - -# 颜色定义 -RED='\033[0;31m' -GREEN='\033[0;32m' -YELLOW='\033[1;33m' -BLUE='\033[0;34m' -PURPLE='\033[0;35m' -CYAN='\033[0;36m' -NC='\033[0m' - -# 演示标题 -print_demo_header() { - clear - echo -e "${CYAN}================================================${NC}" - echo -e "${CYAN} Hysteria2 配置管理脚本 - 功能演示${NC}" - echo -e "${CYAN}================================================${NC}" - echo "" - echo -e "${YELLOW}注意: 这是演示模式,不会实际修改系统${NC}" - echo "" -} - -# 演示菜单 -show_demo_menu() { - echo -e "${BLUE}演示功能列表:${NC}" - echo "" - echo -e "${GREEN}1.${NC} 项目结构展示" - echo -e "${GREEN}2.${NC} 配置模板预览" - echo -e "${GREEN}3.${NC} 域名测试演示" - echo -e "${GREEN}4.${NC} 一键快速配置演示" - echo -e "${GREEN}5.${NC} 脚本功能介绍" - echo -e "${GREEN}6.${NC} 安装流程演示" - echo -e "${GREEN}7.${NC} 卸载方式说明" - echo -e "${GREEN}8.${NC} 使用场景说明" - echo -e "${RED}0.${NC} 退出演示" - echo "" - echo -n -e "${BLUE}请选择演示内容 [0-8]: ${NC}" -} - -# 项目结构展示 -demo_project_structure() { - echo -e "${BLUE}项目结构展示${NC}" - echo "" - echo -e "${CYAN}hy2-manager/${NC}" - echo -e "├── ${GREEN}hy2-manager.sh${NC} # 主控制脚本" - echo -e "├── ${GREEN}install.sh${NC} # 一键安装脚本" - echo -e "├── ${BLUE}scripts/${NC} # 功能模块目录" - echo -e "│ ├── ${YELLOW}install.sh${NC} # 安装模块" - echo -e "│ ├── ${YELLOW}config.sh${NC} # 配置生成模块" - echo -e "│ ├── ${YELLOW}service.sh${NC} # 服务管理模块" - echo -e "│ ├── ${YELLOW}domain-test.sh${NC} # 域名测试模块" - echo -e "│ └── ${YELLOW}advanced.sh${NC} # 进阶配置模块" - echo -e "├── ${BLUE}templates/${NC} # 配置模板目录" - echo -e "│ ├── ${PURPLE}acme-config.yaml${NC} # ACME 配置模板" - echo -e "│ ├── ${PURPLE}self-cert-config.yaml${NC} # 自签名配置模板" - echo -e "│ ├── ${PURPLE}advanced-config.yaml${NC} # 高级配置模板" - echo -e "│ └── ${PURPLE}client-config.yaml${NC} # 客户端配置示例" - echo -e "├── ${GREEN}README.md${NC} # 项目说明" - echo -e "├── ${GREEN}USAGE.md${NC} # 使用说明" - echo -e "└── ${GREEN}PROJECT_OVERVIEW.md${NC} # 项目总览" - echo "" - echo -e "${YELLOW}核心特性:${NC}" - echo "✓ 模块化设计,易于维护和扩展" - echo "✓ 丰富的配置模板,适应不同场景" - echo "✓ 完整的文档体系,便于学习使用" - echo "" -} - -# 配置模板预览 -demo_config_templates() { - echo -e "${BLUE}配置模板预览${NC}" - echo "" - - echo -e "${CYAN}1. ACME 自动证书模式${NC}" - echo -e "${YELLOW}特点: 自动申请和续期证书,适合生产环境${NC}" - echo "listen: :443" - echo "acme:" - echo " domains: [your.domain.net]" - echo " email: your@email.com" - echo "auth:" - echo " type: password" - echo " password: ********" - echo "" - - echo -e "${CYAN}2. 自签名证书模式${NC}" - echo -e "${YELLOW}特点: 无需域名,快速部署,适合测试环境${NC}" - echo "listen: :443" - echo "tls:" - echo " cert: /etc/hysteria/server.crt" - echo " key: /etc/hysteria/server.key" - echo "auth:" - echo " type: password" - echo " password: ********" - echo "" - - echo -e "${CYAN}3. 进阶配置选项${NC}" - echo -e "${YELLOW}包含: 混淆、带宽限制、ACL 等高级功能${NC}" - echo "obfs:" - echo " type: salamander" - echo " salamander:" - echo " password: ********" - echo "bandwidth:" - echo " up: 1 gbps" - echo " down: 1 gbps" - echo "" -} - -# 域名测试演示 -demo_domain_test() { - echo -e "${BLUE}域名测试功能演示${NC}" - echo "" - - echo -e "${YELLOW}预设优质域名列表:${NC}" - local domains=( - "www.cloudflare.com" - "www.apple.com" - "www.microsoft.com" - "cdn.jsdelivr.net" - "fonts.googleapis.com" - ) - - echo -e "${CYAN}正在模拟测试域名延迟...${NC}" - echo "" - printf "%-5s %-30s %s\n" "排名" "域名" "延迟(ms)" - echo "----------------------------------------" - - for i in "${!domains[@]}"; do - local latency=$((RANDOM % 200 + 50)) - printf "%-5d %-30s %d ms\n" "$((i+1))" "${domains[$i]}" "$latency" - sleep 0.5 - done - - echo "" - echo -e "${GREEN}✓ 推荐使用: ${domains[0]} (延迟最低)${NC}" - echo "" - echo -e "${YELLOW}功能特点:${NC}" - echo "• 自动测试多个优质域名" - echo "• 按延迟排序选择最优" - echo "• 支持自定义域名测试" - echo "• 一键更新配置文件" - echo "" -} - -# 一键快速配置演示 -demo_quick_setup() { - echo -e "${BLUE}一键快速配置功能演示${NC}" - echo "" - - echo -e "${CYAN}🚀 一键快速配置特性${NC}" - echo "" - echo -e "${YELLOW}完全自动化:${NC}" - echo "• 无需手动输入任何参数" - echo "• 自动检测服务器环境" - echo "• 智能选择最优配置" - echo "" - - echo -e "${YELLOW}配置内容:${NC}" - echo "• 证书方案: 自签名证书 (无需域名)" - echo "• 伪装域名: 自动测试选择延迟最低" - echo "• 认证密码: 随机生成 16 位强密码" - echo "• 混淆密码: 随机生成 16 位强密码" - echo "• 端口跳跃: 20000-50000 -> 443" - echo "• 网卡检测: 自动识别默认网络接口" - echo "" - - echo -e "${CYAN}🔄 配置流程模拟${NC}" - echo "" - - # 模拟配置过程 - echo -e "${BLUE}步骤 1/7: 获取服务器信息...${NC}" - sleep 1 - echo "服务器IP: 192.168.1.100" - echo "网络接口: eth0" - echo "" - - echo -e "${BLUE}步骤 2/7: 测试最优伪装域名...${NC}" - sleep 1 - local domains=("www.cloudflare.com" "cdn.jsdelivr.net" "www.apple.com") - for domain in "${domains[@]}"; do - local latency=$((RANDOM % 100 + 50)) - echo "测试 $domain ... ${latency}ms" - sleep 0.3 - done - echo -e "${GREEN}最优伪装域名: cdn.jsdelivr.net (52ms)${NC}" - echo "" - - echo -e "${BLUE}步骤 3/7: 生成随机密码...${NC}" - sleep 1 - echo "认证密码: Kx9mP2nQ8vR5wE7t" - echo "混淆密码: Hy6bN4jM1sL3xC9z" - echo "" - - echo -e "${BLUE}步骤 4/7: 生成自签名证书...${NC}" - sleep 1 - echo "证书生成完成" - echo "" - - echo -e "${BLUE}步骤 5/7: 生成配置文件...${NC}" - sleep 1 - echo "配置文件生成完成" - echo "" - - echo -e "${BLUE}步骤 6/7: 配置端口跳跃...${NC}" - sleep 1 - echo "端口跳跃配置成功 (20000-50000 -> 443)" - echo "" - - echo -e "${BLUE}步骤 7/7: 启动服务...${NC}" - sleep 1 - echo -e "${GREEN}服务启动成功!${NC}" - echo "" - - echo -e "${CYAN}📋 配置完成信息${NC}" - echo "" - echo -e "${YELLOW}服务器信息:${NC}" - echo "服务器地址: 192.168.1.100:443" - echo "认证密码: Kx9mP2nQ8vR5wE7t" - echo "混淆密码: Hy6bN4jM1sL3xC9z" - echo "伪装域名: cdn.jsdelivr.net" - echo "端口跳跃: 20000-50000" - echo "" - - echo -e "${YELLOW}节点链接:${NC}" - echo "hysteria2://Kx9mP2nQ8vR5wE7t@192.168.1.100:443?sni=cdn.jsdelivr.net&insecure=1&obfs=salamander&obfs-password=Hy6bN4jM1sL3xC9z#Hysteria2-QuickSetup" - echo "" - - echo -e "${YELLOW}客户端配置:${NC}" - cat << EOF -server: 192.168.1.100:443 -auth: Kx9mP2nQ8vR5wE7t -tls: - sni: cdn.jsdelivr.net - insecure: true -obfs: - type: salamander - salamander: - password: Hy6bN4jM1sL3xC9z -socks5: - listen: 127.0.0.1:1080 -http: - listen: 127.0.0.1:8080 -EOF - echo "" - - echo -e "${GREEN}✅ 一键快速配置演示完成!${NC}" - echo "" - echo -e "${YELLOW}优势总结:${NC}" - echo "• 零配置: 无需任何手动输入" - echo "• 高安全: 随机密码 + 混淆 + 端口跳跃" - echo "• 智能化: 自动选择最优伪装域名" - echo "• 快速部署: 3分钟内完成全部配置" - echo "• 新手友好: 适合没有技术背景的用户" - echo "" -} - -# 脚本功能介绍 -demo_script_features() { - echo -e "${BLUE}脚本功能详细介绍${NC}" - echo "" - - echo -e "${CYAN}🚀 安装管理${NC}" - echo "• 一键安装 Hysteria2 服务器" - echo "• 自动检测系统环境和依赖" - echo "• 预安装检查和端口冲突检测" - echo "• 完整卸载功能" - echo "" - - echo -e "${CYAN}⚙️ 配置生成${NC}" - echo "• 交互式配置向导" - echo "• ACME 和自签名两种证书模式" - echo "• 自动生成安全密码" - echo "• 智能伪装域名选择" - echo "" - - echo -e "${CYAN}📊 服务管理${NC}" - echo "• 实时服务状态监控" - echo "• 启动/停止/重启操作" - echo "• 开机自启管理" - echo "• 详细日志查看" - echo "" - - echo -e "${CYAN}🔧 进阶配置${NC}" - echo "• 端口修改和冲突检测" - echo "• 混淆配置管理" - echo "• 端口跳跃设置" - echo "• iptables 规则自动化" - echo "" - - echo -e "${CYAN}🌐 域名优化${NC}" - echo "• 批量域名延迟测试" - echo "• 智能选择最优伪装域名" - echo "• 自定义域名测试" - echo "• 配置文件自动更新" - echo "" -} - -# 安装流程演示 -demo_installation_flow() { - echo -e "${BLUE}安装流程演示${NC}" - echo "" - - echo -e "${CYAN}步骤 1: 下载安装脚本${NC}" - echo "wget https://raw.githubusercontent.com/your-repo/hy2-manager/main/install.sh" - echo "chmod +x install.sh" - echo "" - - echo -e "${CYAN}步骤 2: 运行安装脚本${NC}" - echo "sudo ./install.sh" - echo "" - echo -e "${YELLOW}安装过程:${NC}" - echo "✓ 检测系统环境" - echo "✓ 安装必要依赖" - echo "✓ 下载脚本文件" - echo "✓ 创建命令快捷方式" - echo "✓ 设置执行权限" - echo "" - - echo -e "${CYAN}步骤 3: 运行管理脚本${NC}" - echo "sudo hy2-manager" - echo "" - echo -e "${YELLOW}使用流程:${NC}" - echo "1. 选择 '安装 Hysteria2'" - echo "2. 选择 '生成配置文件'" - echo "3. 选择 '管理服务' -> '启动服务'" - echo "4. 配置客户端连接" - echo "" -} - -# 卸载方式说明 -demo_uninstall_options() { - echo -e "${BLUE}卸载方式详细说明${NC}" - echo "" - - echo -e "${CYAN}📋 卸载方式对比${NC}" - echo "" - printf "%-20s %-8s %-8s %-8s %-8s %-8s %-15s\n" "卸载方式" "程序" "配置" "证书" "用户" "脚本" "适用场景" - echo "----------------------------------------------------------------------------------------" - printf "%-20s %-8s %-8s %-8s %-8s %-8s %-15s\n" "1.仅卸载服务器" "✅删除" "❌保留" "❌保留" "❌保留" "❌保留" "临时卸载、升级" - printf "%-20s %-8s %-8s %-8s %-8s %-8s %-15s\n" "2.卸载服务器及配置" "✅删除" "✅删除" "✅删除" "✅删除" "❌保留" "清理配置" - printf "%-20s %-8s %-8s %-8s %-8s %-8s %-15s\n" "3.卸载所有内容" "✅删除" "✅删除" "✅删除" "✅删除" "✅删除" "彻底清理" - echo "" - - echo -e "${CYAN}🔧 方式一:仅卸载 Hysteria2 服务器${NC}" - echo "" - echo -e "${YELLOW}适用场景:${NC}" - echo "• 临时卸载,计划重新安装" - echo "• 系统升级或重装前的准备" - echo "• 保留配置以备后用" - echo "• 测试不同版本" - echo "" - echo -e "${YELLOW}操作步骤:${NC}" - echo "1. sudo s-hy2" - echo "2. 选择 '9. 卸载服务'" - echo "3. 选择 '1. 仅卸载 Hysteria2 服务器'" - echo "4. 确认卸载" - echo "" - echo -e "${YELLOW}保留内容:${NC}" - echo "• /etc/hysteria/ - 配置文件和证书" - echo "• hysteria 用户账户" - echo "• s-hy2 管理脚本" - echo "" - - echo -e "${CYAN}🗑️ 方式二:卸载 Hysteria2 服务器及配置文件${NC}" - echo "" - echo -e "${YELLOW}适用场景:${NC}" - echo "• 清理所有配置,但保留管理脚本" - echo "• 重新开始全新配置" - echo "• 清理测试环境" - echo "" - echo -e "${YELLOW}操作步骤:${NC}" - echo "1. sudo s-hy2" - echo "2. 选择 '9. 卸载服务'" - echo "3. 选择 '2. 卸载 Hysteria2 服务器及配置文件'" - echo "4. 确认卸载" - echo "" - echo -e "${YELLOW}保留内容:${NC}" - echo "• s-hy2 管理脚本" - echo "" - - echo -e "${CYAN}💥 方式三:卸载脚本及 Hysteria2 服务器和所有文件${NC}" - echo "" - echo -e "${YELLOW}适用场景:${NC}" - echo "• 不再使用 Hysteria2 和管理脚本" - echo "• 彻底清理系统" - echo "• 服务器用途完全改变" - echo "" - echo -e "${YELLOW}操作步骤:${NC}" - echo "1. sudo s-hy2" - echo "2. 选择 '9. 卸载服务'" - echo "3. 选择 '3. 卸载脚本及 Hysteria2 服务器和所有文件'" - echo "4. 输入 'YES' 确认" - echo "" - echo -e "${YELLOW}删除内容:${NC}" - echo "• 所有程序文件和配置" - echo "• hysteria 用户账户" - echo "• s-hy2 管理脚本" - echo "• 所有快捷命令" - echo "" - - echo -e "${CYAN}🔍 卸载验证${NC}" - echo "" - echo -e "${YELLOW}检查命令:${NC}" - echo "# 检查程序是否删除" - echo "which hysteria" - echo "" - echo "# 检查服务状态" - echo "sudo systemctl status hysteria-server" - echo "" - echo "# 检查配置文件 (方式1可能存在)" - echo "ls -la /etc/hysteria/" - echo "" - echo "# 检查用户账户 (方式1可能存在)" - echo "id hysteria" - echo "" - echo "# 检查管理脚本 (方式1和2存在)" - echo "which s-hy2" - echo "" - echo -e "${YELLOW}重新安装:${NC}" - echo "curl -fsSL https://raw.githubusercontent.com/sindricn/s-hy2/main/quick-install.sh | sudo bash" - echo "" -} - -# 使用场景说明 -demo_use_cases() { - echo -e "${BLUE}使用场景说明${NC}" - echo "" - - echo -e "${CYAN}🏠 个人用户${NC}" - echo "• 搭建个人代理服务器" - echo "• 学习网络技术" - echo "• 家庭网络优化" - echo "• 游戏加速" - echo "" - - echo -e "${CYAN}🏢 企业用户${NC}" - echo "• 分支机构网络连接" - echo "• 内网穿透" - echo "• 远程办公支持" - echo "• 网络安全加固" - echo "" - - echo -e "${CYAN}👨‍💻 开发者${NC}" - echo "• 开发环境搭建" - echo "• 网络调试工具" - echo "• 性能测试" - echo "• API 接口测试" - echo "" - - echo -e "${CYAN}🎓 教育机构${NC}" - echo "• 网络技术教学" - echo "• 实验环境搭建" - echo "• 学生项目支持" - echo "• 研究用途" - echo "" -} - -# 主演示循环 -main_demo() { - while true; do - print_demo_header - show_demo_menu - - read -r choice - - case $choice in - 1) - echo "" - demo_project_structure - read -p "按回车键继续..." - ;; - 2) - echo "" - demo_config_templates - read -p "按回车键继续..." - ;; - 3) - echo "" - demo_domain_test - read -p "按回车键继续..." - ;; - 4) - echo "" - demo_quick_setup - read -p "按回车键继续..." - ;; - 5) - echo "" - demo_script_features - read -p "按回车键继续..." - ;; - 6) - echo "" - demo_installation_flow - read -p "按回车键继续..." - ;; - 7) - echo "" - demo_uninstall_options - read -p "按回车键继续..." - ;; - 8) - echo "" - demo_use_cases - read -p "按回车键继续..." - ;; - 0) - echo "" - echo -e "${GREEN}感谢观看 Hysteria2 配置管理脚本演示!${NC}" - echo "" - echo -e "${YELLOW}如需实际使用,请运行:${NC}" - echo "sudo ./hy2-manager.sh" - echo "" - exit 0 - ;; - *) - echo -e "${RED}无效选项,请重新选择${NC}" - sleep 2 - ;; - esac - done -} - -# 运行演示 -main_demo diff --git a/hy2-manager.sh b/hy2-manager.sh index eae69cc..a44b777 100644 --- a/hy2-manager.sh +++ b/hy2-manager.sh @@ -123,14 +123,13 @@ print_menu() { echo -e "${GREEN} 5.${NC} 查看日志" echo -e "${GREEN} 6.${NC} 测试伪装域名" echo -e "${GREEN} 7.${NC} 服务器域名配置" - echo -e "${GREEN} 8.${NC} 进阶配置" + echo -e "${GREEN} 8.${NC} 配置管理" echo -e "${GREEN} 9.${NC} 节点信息" - echo -e "${GREEN}10.${NC} 故障排除" - echo -e "${GREEN}11.${NC} 卸载服务" - echo -e "${GREEN}12.${NC} 关于脚本" + echo -e "${GREEN}10.${NC} 卸载服务" + echo -e "${GREEN}11.${NC} 关于脚本" echo -e "${RED} 0.${NC} 退出" echo "" - echo -n -e "${BLUE}请输入选项 [0-12]: ${NC}" + echo -n -e "${BLUE}请输入选项 [0-11]: ${NC}" } # 检查 Hysteria2 是否已安装 @@ -563,19 +562,46 @@ get_server_domain() { fi } -# 进阶配置 -advanced_config() { - log_info "准备进入进阶配置..." - - if ! check_hysteria_installed; then - log_error "Hysteria2 未安装,请先安装" - wait_for_user - return - fi - - if safe_source_script "$SCRIPTS_DIR/advanced.sh" "进阶配置脚本"; then - advanced_configuration - fi +# 配置管理 +config_management() { + while true; do + clear + echo -e "${CYAN}=== 配置管理 ===${NC}" + echo "" + + if [[ ! -f "$CONFIG_PATH" ]]; then + echo -e "${YELLOW}未找到配置文件${NC}" + echo "" + echo -e "${GREEN}1.${NC} 返回主菜单" + echo -n -e "${BLUE}请选择: ${NC}" + read -r choice + break + fi + + echo -e "${YELLOW}配置管理选项:${NC}" + echo -e "${GREEN}1.${NC} 查看当前配置" + echo -e "${GREEN}2.${NC} 修改认证密码" + echo -e "${GREEN}3.${NC} 修改端口设置" + echo -e "${GREEN}4.${NC} 修改混淆设置" + echo -e "${GREEN}5.${NC} 打开配置文件编辑" + echo -e "${RED}0.${NC} 返回主菜单" + echo "" + echo -n -e "${BLUE}请选择操作 [0-5]: ${NC}" + read -r choice + + case $choice in + 1) view_current_config ;; + 2) modify_auth_password ;; + 3) modify_port_settings ;; + 4) modify_obfs_settings ;; + 5) edit_config_file ;; + 0) break ;; + *) + log_error "无效选项" + sleep 1 + ;; + esac + done } # 节点信息 @@ -593,13 +619,268 @@ show_node_info() { fi } -# 故障排除 -troubleshoot() { - log_info "准备进入故障排除..." +# 查看当前配置 +view_current_config() { + echo "" + echo -e "${BLUE}当前配置文件内容:${NC}" + echo -e "${CYAN}================================${NC}" + cat "$CONFIG_PATH" + echo -e "${CYAN}================================${NC}" + wait_for_user +} + +# 修改认证密码 +modify_auth_password() { + echo "" + echo -e "${BLUE}修改认证密码${NC}" - if safe_source_script "$SCRIPTS_DIR/troubleshoot.sh" "故障排除脚本"; then - run_diagnostics + # 获取当前密码 + local current_password + current_password=$(grep -E "^\s*password:" "$CONFIG_PATH" | awk '{print $2}' | tr -d '"' || echo "未设置") + echo "当前密码: $current_password" + echo "" + + echo -n -e "${YELLOW}输入新密码 (回车生成随机密码): ${NC}" + read -r new_password + + if [[ -z "$new_password" ]]; then + new_password=$(openssl rand -base64 12 | tr -d "=+/") + echo "生成的随机密码: $new_password" fi + + # 备份配置文件 + cp "$CONFIG_PATH" "$CONFIG_PATH.bak" + + # 修改密码 + sed -i "s/password:.*/password: \"$new_password\"/" "$CONFIG_PATH" + + log_success "认证密码已更新" + echo "" + echo -n -e "${YELLOW}是否重启服务以应用更改? [Y/n]: ${NC}" + read -r restart + if [[ ! $restart =~ ^[Nn]$ ]]; then + systemctl restart "$SERVICE_NAME" + log_success "服务已重启" + fi + + wait_for_user +} + +# 修改端口设置 +modify_port_settings() { + echo "" + echo -e "${BLUE}修改端口设置${NC}" + + # 获取当前端口 + local current_port + current_port=$(grep -E "^\s*listen:" "$CONFIG_PATH" | awk -F':' '{print $3}' | tr -d ' ' || echo "443") + echo "当前端口: $current_port" + echo "" + + echo -n -e "${YELLOW}输入新端口 [1-65535]: ${NC}" + read -r new_port + + if [[ ! "$new_port" =~ ^[0-9]+$ ]] || [[ "$new_port" -lt 1 ]] || [[ "$new_port" -gt 65535 ]]; then + log_error "端口必须是 1-65535 之间的数字" + wait_for_user + return + fi + + # 检查端口是否被占用 + if ss -tuln | grep -q ":$new_port "; then + log_warn "端口 $new_port 似乎已被占用,请确认" + echo -n -e "${YELLOW}是否继续? [y/N]: ${NC}" + read -r continue + if [[ ! $continue =~ ^[Yy]$ ]]; then + return + fi + fi + + # 备份配置文件 + cp "$CONFIG_PATH" "$CONFIG_PATH.bak" + + # 修改端口 + sed -i "s/:$current_port/:$new_port/g" "$CONFIG_PATH" + + log_success "端口已更新为: $new_port" + echo "" + echo -n -e "${YELLOW}是否重启服务以应用更改? [Y/n]: ${NC}" + read -r restart + if [[ ! $restart =~ ^[Nn]$ ]]; then + systemctl restart "$SERVICE_NAME" + log_success "服务已重启" + fi + + wait_for_user +} + +# 修改混淆设置 +modify_obfs_settings() { + echo "" + echo -e "${BLUE}修改混淆设置${NC}" + + # 检查当前混淆配置 + local current_obfs + current_obfs=$(grep -E "^\s*type: salamander" "$CONFIG_PATH" && echo "启用" || echo "禁用") + echo "当前混淆状态: $current_obfs" + + if [[ "$current_obfs" == "启用" ]]; then + local current_obfs_password + current_obfs_password=$(grep -A1 "type: salamander" "$CONFIG_PATH" | grep "password:" | awk '{print $2}' | tr -d '"') + echo "当前混淆密码: $current_obfs_password" + fi + + echo "" + echo -e "${YELLOW}混淆选项:${NC}" + echo "1. 启用混淆" + echo "2. 禁用混淆" + echo "3. 修改混淆密码" + echo "0. 返回" + echo "" + echo -n -e "${BLUE}请选择: ${NC}" + read -r obfs_choice + + case $obfs_choice in + 1|2|3) + # 备份配置文件 + cp "$CONFIG_PATH" "$CONFIG_PATH.bak" + + case $obfs_choice in + 1) + echo -n -e "${YELLOW}输入混淆密码 (回车生成随机密码): ${NC}" + read -r obfs_password + if [[ -z "$obfs_password" ]]; then + obfs_password=$(openssl rand -base64 12 | tr -d "=+/") + echo "生成的随机密码: $obfs_password" + fi + + # 添加混淆配置 + if ! grep -q "obfs:" "$CONFIG_PATH"; then + sed -i "/listen:/a\\ +obfs:\\ + type: salamander\\ + password: \"$obfs_password\"" "$CONFIG_PATH" + else + sed -i "/obfs:/,+2c\\ +obfs:\\ + type: salamander\\ + password: \"$obfs_password\"" "$CONFIG_PATH" + fi + log_success "混淆已启用" + ;; + 2) + # 删除混淆配置 + sed -i '/obfs:/,+2d' "$CONFIG_PATH" + log_success "混淆已禁用" + ;; + 3) + if [[ "$current_obfs" == "禁用" ]]; then + log_error "当前未启用混淆" + wait_for_user + return + fi + + echo -n -e "${YELLOW}输入新的混淆密码: ${NC}" + read -r new_obfs_password + + if [[ -z "$new_obfs_password" ]]; then + log_error "混淆密码不能为空" + wait_for_user + return + fi + + # 修改混淆密码 + sed -i "/obfs:/,+2s/password:.*/password: \"$new_obfs_password\"/" "$CONFIG_PATH" + log_success "混淆密码已更新" + ;; + esac + + echo "" + echo -n -e "${YELLOW}是否重启服务以应用更改? [Y/n]: ${NC}" + read -r restart + if [[ ! $restart =~ ^[Nn]$ ]]; then + systemctl restart "$SERVICE_NAME" + log_success "服务已重启" + fi + ;; + 0) + return + ;; + *) + log_error "无效选择" + ;; + esac + + wait_for_user +} + +# 编辑配置文件 +edit_config_file() { + echo "" + echo -e "${BLUE}打开配置文件编辑${NC}" + echo "配置文件路径: $CONFIG_PATH" + echo "" + echo -e "${YELLOW}编辑器选项:${NC}" + echo "1. 使用 nano (推荐新手)" + echo "2. 使用 vim" + echo "3. 使用系统默认编辑器" + echo "0. 返回" + echo "" + echo -n -e "${BLUE}请选择编辑器: ${NC}" + read -r editor_choice + + # 备份配置文件 + cp "$CONFIG_PATH" "$CONFIG_PATH.bak" + log_info "已备份配置文件" + + case $editor_choice in + 1) + if command -v nano &> /dev/null; then + nano "$CONFIG_PATH" + else + log_error "nano 未安装,使用系统默认编辑器" + ${EDITOR:-vi} "$CONFIG_PATH" + fi + ;; + 2) + if command -v vim &> /dev/null; then + vim "$CONFIG_PATH" + else + log_error "vim 未安装,使用系统默认编辑器" + ${EDITOR:-vi} "$CONFIG_PATH" + fi + ;; + 3) + ${EDITOR:-vi} "$CONFIG_PATH" + ;; + 0) + return + ;; + *) + log_error "无效选择,使用系统默认编辑器" + ${EDITOR:-vi} "$CONFIG_PATH" + ;; + esac + + echo "" + echo -n -e "${YELLOW}配置已修改,是否重启服务以应用更改? [Y/n]: ${NC}" + read -r restart + if [[ ! $restart =~ ^[Nn]$ ]]; then + if systemctl restart "$SERVICE_NAME"; then + log_success "服务已重启" + else + log_error "服务重启失败,请检查配置文件语法" + echo -n -e "${YELLOW}是否恢复备份配置? [Y/n]: ${NC}" + read -r restore + if [[ ! $restore =~ ^[Nn]$ ]]; then + cp "$CONFIG_PATH.bak" "$CONFIG_PATH" + systemctl restart "$SERVICE_NAME" + log_info "已恢复备份配置" + fi + fi + fi + + wait_for_user } # 卸载服务 - 改进版本,增加更多选项和安全确认 @@ -973,8 +1254,8 @@ main() { read -r choice # 输入验证 - if ! validate_input "$choice" 0 12; then - log_error "请输入 0-12 之间的数字" + if ! validate_input "$choice" 0 11; then + log_error "请输入 0-11 之间的数字" sleep 2 continue fi @@ -987,11 +1268,10 @@ main() { 5) view_logs ;; 6) test_domains ;; 7) server_domain_config ;; - 8) advanced_config ;; + 8) config_management ;; 9) show_node_info ;; - 10) troubleshoot ;; - 11) uninstall_hysteria ;; - 12) about_script ;; + 10) uninstall_hysteria ;; + 11) about_script ;; 0) echo -e "${GREEN}感谢使用 Hysteria2 配置管理脚本!${NC}" exit 0 diff --git a/scripts/advanced.sh b/scripts/advanced.sh deleted file mode 100644 index 1f5eee1..0000000 --- a/scripts/advanced.sh +++ /dev/null @@ -1,626 +0,0 @@ -#!/bin/bash - -# Hysteria2 进阶配置脚本 - 修复版本 -# 修复配置文件路径和变量定义问题 - -# 颜色定义 -RED='\033[0;31m' -GREEN='\033[0;32m' -YELLOW='\033[1;33m' -BLUE='\033[0;34m' -CYAN='\033[0;36m' -NC='\033[0m' # No Color - -# 全局变量定义 -CONFIG_PATH="/etc/hysteria/hysteria.yaml" -SERVICE_NAME="hysteria-server" -CONFIG_DIR="/etc/hysteria" - -# 初始化函数 - 检查和设置基本环境 -init_environment() { - # 检查 root 权限 - if [[ $EUID -ne 0 ]]; then - echo -e "${RED}错误: 此脚本需要 root 权限运行${NC}" - exit 1 - fi - - # 检查配置目录 - if [[ ! -d "$CONFIG_DIR" ]]; then - echo -e "${BLUE}创建配置目录: $CONFIG_DIR${NC}" - mkdir -p "$CONFIG_DIR" - fi - - # 自动检测配置文件路径 - detect_config_file - - # 检查 Hysteria 是否已安装 - if ! command -v hysteria >/dev/null 2>&1; then - echo -e "${YELLOW}警告: 未检测到 Hysteria 命令${NC}" - echo "请确保 Hysteria 已正确安装" - fi -} - -# 自动检测配置文件 -detect_config_file() { - local possible_paths=( - "/etc/hysteria/hysteria.yaml" - "/etc/hysteria/config.yaml" - "/etc/hysteria/server.yaml" - "/opt/hysteria/hysteria.yaml" - "/usr/local/etc/hysteria/hysteria.yaml" - ) - - echo -e "${BLUE}检测配置文件...${NC}" - - for path in "${possible_paths[@]}"; do - if [[ -f "$path" ]]; then - CONFIG_PATH="$path" - echo -e "${GREEN}找到配置文件: $CONFIG_PATH${NC}" - return 0 - fi - done - - echo -e "${YELLOW}未找到配置文件,使用默认路径: $CONFIG_PATH${NC}" - return 1 -} - -# 创建默认配置文件 -create_default_config() { - echo -e "${BLUE}创建默认配置文件${NC}" - - cat > "$CONFIG_PATH" << EOF -# Hysteria2 服务器配置文件 -# 生成时间: $(date) - -listen: :443 - -# ACME 自动证书配置(推荐) -acme: - domains: - - your-domain.com - email: your-email@example.com - -# 认证配置 -auth: - type: password - password: $(openssl rand -base64 32) - -# 带宽限制(可选) -bandwidth: - up: 1 gbps - down: 1 gbps - -# 忽略客户端带宽(可选) -ignoreClientBandwidth: false -EOF - - chmod 600 "$CONFIG_PATH" - echo -e "${GREEN}默认配置文件已创建: $CONFIG_PATH${NC}" - echo -e "${YELLOW}请编辑配置文件并设置正确的域名和邮箱${NC}" -} - -# 安全检查函数 -security_check() { - if [[ $EUID -ne 0 ]]; then - echo -e "${RED}错误: 此脚本需要 root 权限运行${NC}" - return 1 - fi - - if [[ ! -f "$CONFIG_PATH" ]]; then - echo -e "${RED}配置文件不存在: $CONFIG_PATH${NC}" - echo -n -e "${BLUE}是否创建默认配置文件? [y/N]: ${NC}" - read -r create_config - if [[ $create_config =~ ^[Yy]$ ]]; then - create_default_config - return 0 - else - return 1 - fi - fi - - # 监听端口 - local port=$(grep -E "^listen:" "$CONFIG_PATH" | awk '{print $2}' | sed 's/://') - if [[ -z "$port" ]]; then - echo -e "${BLUE}监听端口:${NC} 443 (默认)" - else - echo -e "${BLUE}监听端口:${NC} $port" - - # 检查端口状态 - if netstat -tuln 2>/dev/null | grep -q ":$port "; then - echo -e " 状态: ${GREEN}正在监听${NC}" - else - echo -e " 状态: ${RED}未监听${NC}" - fi - fi - - # 混淆配置 - if grep -q "^obfs:" "$CONFIG_PATH"; then - echo -e "${BLUE}混淆配置:${NC} ${GREEN}已启用${NC}" - local obfs_type=$(grep -A 3 "^obfs:" "$CONFIG_PATH" | grep "type:" | awk '{print $2}') - local obfs_password=$(grep -A 5 "^obfs:" "$CONFIG_PATH" | grep "password:" | awk '{print $2}') - if [[ -n "$obfs_type" ]]; then - echo -e " 算法: $obfs_type" - fi - if [[ -n "$obfs_password" ]]; then - echo -e " 密码: $obfs_password" - fi - - # 检查混淆信息文件 - if [[ -f "$CONFIG_DIR/obfs-info.conf" ]]; then - echo -e " 配置文件: ${GREEN}存在${NC}" - fi - else - echo -e "${BLUE}混淆配置:${NC} ${RED}未启用${NC}" - fi - - # 端口跳跃 - if [[ -f "$CONFIG_DIR/port-hopping.conf" ]]; then - echo -e "${BLUE}端口跳跃:${NC} ${GREEN}已配置${NC}" - source "$CONFIG_DIR/port-hopping.conf" - echo -e " 跳跃范围: $START_PORT-$END_PORT" - echo -e " 网络接口: $INTERFACE" - echo -e " 端口数量: $((END_PORT - START_PORT + 1))" - - # 检查 iptables 规则是否存在 - if iptables -t nat -L PREROUTING -n 2>/dev/null | grep -q "$START_PORT:$END_PORT"; then - echo -e " 规则状态: ${GREEN}已生效${NC}" - else - echo -e " 规则状态: ${RED}未生效${NC}" - fi - else - echo -e "${BLUE}端口跳跃:${NC} ${RED}未配置${NC}" - fi - - # 配置文件信息 - echo "" - echo -e "${BLUE}配置文件信息:${NC}" - echo " 路径: $CONFIG_PATH" - echo " 大小: $(du -h "$CONFIG_PATH" | cut -f1)" - echo " 权限: $(stat -c %a "$CONFIG_PATH" 2>/dev/null || stat -f %Lp "$CONFIG_PATH" 2>/dev/null)" - echo " 修改: $(stat -c %y "$CONFIG_PATH" 2>/dev/null | cut -d. -f1 || stat -f %Sm "$CONFIG_PATH" 2>/dev/null)" - - # 备份文件统计 - local backup_count=$(ls "$CONFIG_PATH".backup.* 2>/dev/null | wc -l) - if [[ $backup_count -gt 0 ]]; then - echo -e " 备份: ${GREEN}$backup_count 个备份文件${NC}" - - # 显示最新备份 - local latest_backup=$(ls -t "$CONFIG_PATH".backup.* 2>/dev/null | head -1) - if [[ -n "$latest_backup" ]]; then - echo " 最新备份: $(basename "$latest_backup")" - fi - else - echo -e " 备份: ${YELLOW}无备份文件${NC}" - fi - - echo "" - return 0 -} - -# 配置健康检查 -health_check() { - echo -e "${BLUE}配置健康检查${NC}" - echo "" - - local issues=0 - local warnings=0 - - # 检查配置文件存在性 - if [[ ! -f "$CONFIG_PATH" ]]; then - echo -e "${RED}✗ 配置文件不存在${NC}" - ((issues++)) - return - else - echo -e "${GREEN}✓ 配置文件存在${NC}" - fi - - # 检查配置文件权限 - local perms=$(stat -c %a "$CONFIG_PATH" 2>/dev/null) - if [[ "$perms" == "600" ]]; then - echo -e "${GREEN}✓ 配置文件权限正确 ($perms)${NC}" - else - echo -e "${YELLOW}⚠ 配置文件权限: $perms (建议: 600)${NC}" - ((warnings++)) - fi - - # 检查配置语法 - if command -v hysteria >/dev/null && hysteria server --config "$CONFIG_PATH" --check 2>/dev/null; then - echo -e "${GREEN}✓ 配置文件语法正确${NC}" - else - echo -e "${RED}✗ 配置文件语法错误${NC}" - ((issues++)) - fi - - # 检查端口配置 - local port=$(grep -E "^listen:" "$CONFIG_PATH" | awk '{print $2}' | sed 's/://') - if [[ -n "$port" ]]; then - if validate_port "$port" >/dev/null 2>&1; then - echo -e "${GREEN}✓ 端口配置有效: $port${NC}" - - # 检查端口占用 - if netstat -tuln 2>/dev/null | grep -q ":$port "; then - if pgrep -f hysteria >/dev/null; then - echo -e "${GREEN}✓ 端口 $port 被 Hysteria 占用${NC}" - else - echo -e "${YELLOW}⚠ 端口 $port 被其他程序占用${NC}" - ((warnings++)) - fi - else - echo -e "${YELLOW}⚠ 端口 $port 未被占用${NC}" - ((warnings++)) - fi - else - echo -e "${RED}✗ 端口配置无效: $port${NC}" - ((issues++)) - fi - else - echo -e "${YELLOW}⚠ 使用默认端口 443${NC}" - ((warnings++)) - fi - - # 检查证书配置 - if grep -q "^acme:" "$CONFIG_PATH"; then - echo -e "${GREEN}✓ ACME 证书配置已启用${NC}" - local domain=$(grep -A 5 "^acme:" "$CONFIG_PATH" | grep -E "^\s*-" | head -1 | awk '{print $2}') - if [[ -n "$domain" ]]; then - echo -e " 域名: $domain" - fi - elif grep -q "^tls:" "$CONFIG_PATH"; then - echo -e "${GREEN}✓ TLS 证书配置已启用${NC}" - local cert_path=$(grep -A 3 "^tls:" "$CONFIG_PATH" | grep "cert:" | awk '{print $2}') - local key_path=$(grep -A 3 "^tls:" "$CONFIG_PATH" | grep "key:" | awk '{print $2}') - - if [[ -f "$cert_path" ]]; then - echo -e "${GREEN}✓ 证书文件存在${NC}" - else - echo -e "${RED}✗ 证书文件不存在: $cert_path${NC}" - ((issues++)) - fi - - if [[ -f "$key_path" ]]; then - echo -e "${GREEN}✓ 私钥文件存在${NC}" - else - echo -e "${RED}✗ 私钥文件不存在: $key_path${NC}" - ((issues++)) - fi - else - echo -e "${YELLOW}⚠ 未配置证书${NC}" - ((warnings++)) - fi - - # 检查认证配置 - if grep -q "^auth:" "$CONFIG_PATH"; then - echo -e "${GREEN}✓ 认证配置已启用${NC}" - local auth_type=$(grep -A 2 "^auth:" "$CONFIG_PATH" | grep "type:" | awk '{print $2}') - echo -e " 认证类型: ${auth_type:-未知}" - else - echo -e "${RED}✗ 未配置认证${NC}" - ((issues++)) - fi - - # 检查混淆配置 - if grep -q "^obfs:" "$CONFIG_PATH"; then - echo -e "${GREEN}✓ 混淆配置已启用${NC}" - else - echo -e "${BLUE}ℹ 混淆配置未启用 (可选)${NC}" - fi - - # 检查端口跳跃 - if [[ -f "$CONFIG_DIR/port-hopping.conf" ]]; then - echo -e "${GREEN}✓ 端口跳跃配置存在${NC}" - source "$CONFIG_DIR/port-hopping.conf" - - if iptables -t nat -L PREROUTING -n 2>/dev/null | grep -q "$START_PORT:$END_PORT"; then - echo -e "${GREEN}✓ 端口跳跃规则已生效${NC}" - else - echo -e "${YELLOW}⚠ 端口跳跃规则未生效${NC}" - ((warnings++)) - fi - else - echo -e "${BLUE}ℹ 端口跳跃未配置 (可选)${NC}" - fi - - # 总结 - echo "" - echo -e "${CYAN}健康检查总结:${NC}" - if [[ $issues -eq 0 ]]; then - echo -e "${GREEN}✓ 配置健康,发现 $warnings 个警告${NC}" - else - echo -e "${RED}✗ 发现 $issues 个问题和 $warnings 个警告${NC}" - echo -e "${YELLOW}建议修复问题后重新检查${NC}" - fi - - return $issues -} - -# 端口验证函数 -validate_port() { - local port=$1 - - # 检查端口范围 - if [[ ! "$port" =~ ^[0-9]+$ ]] || [[ $port -lt 1 ]] || [[ $port -gt 65535 ]]; then - echo -e "${RED}端口必须在 1-65535 范围内${NC}" - return 1 - fi - - # 检查特权端口警告 - if [[ $port -lt 1024 ]] && [[ $port -ne 443 ]] && [[ $port -ne 80 ]]; then - echo -e "${YELLOW}警告: 端口 $port 是特权端口,确保以 root 权限运行${NC}" - fi - - return 0 -} - -# 配置备份函数 -backup_config_with_checksum() { - local config_file=$1 - local backup_suffix=${2:-$(date +%Y%m%d_%H%M%S)} - local backup_file="${config_file}.backup.${backup_suffix}" - - if [[ ! -f "$config_file" ]]; then - echo -e "${RED}配置文件不存在: $config_file${NC}" - return 1 - fi - - # 创建备份 - if cp "$config_file" "$backup_file"; then - # 生成校验和 - if command -v sha256sum >/dev/null 2>&1; then - sha256sum "$config_file" > "${backup_file}.checksum" - elif command -v shasum >/dev/null 2>&1; then - shasum -a 256 "$config_file" > "${backup_file}.checksum" - fi - - echo -e "${GREEN}配置已备份: $backup_file${NC}" - echo "$backup_file" - return 0 - else - echo -e "${RED}配置备份失败${NC}" - return 1 - fi -} - -# 配置回滚函数 -rollback_config() { - local backup_file=$1 - local checksum_file="${backup_file}.checksum" - - if [[ ! -f "$backup_file" ]]; then - echo -e "${RED}备份文件不存在: $backup_file${NC}" - return 1 - fi - - # 验证备份文件完整性 - if [[ -f "$checksum_file" ]]; then - echo -e "${BLUE}验证备份文件完整性...${NC}" - if command -v sha256sum >/dev/null 2>&1; then - if ! sha256sum -c "$checksum_file" >/dev/null 2>&1; then - echo -e "${RED}警告: 备份文件可能已损坏${NC}" - echo -n -e "${BLUE}是否继续回滚? [y/N]: ${NC}" - read -r continue_rollback - [[ ! $continue_rollback =~ ^[Yy]$ ]] && return 1 - fi - fi - fi - - # 执行回滚 - if cp "$backup_file" "$CONFIG_PATH"; then - echo -e "${GREEN}配置已回滚${NC}" - return 0 - else - echo -e "${RED}配置回滚失败${NC}" - return 1 - fi -} - -# 修改监听端口 -modify_listen_port() { - echo -e "${BLUE}修改监听端口${NC}" - echo "" - - if ! security_check; then - return 1 - fi - - # 显示当前端口 - local current_port=$(grep -E "^listen:" "$CONFIG_PATH" | awk '{print $2}' | sed 's/://') - if [[ -z "$current_port" ]]; then - current_port="443" - echo -e "${YELLOW}当前端口: 443 (默认)${NC}" - else - echo -e "${YELLOW}当前端口: $current_port${NC}" - fi - - # 输入新端口 - while true; do - echo -n -e "${BLUE}请输入新端口 (1-65535, 回车取消): ${NC}" - read -r new_port - - [[ -z "$new_port" ]] && { echo -e "${BLUE}取消端口修改${NC}"; return; } - - if validate_port "$new_port"; then - break - fi - done - - # 检查端口占用 - if netstat -tuln | grep -q ":$new_port "; then - echo -e "${YELLOW}警告: 端口 $new_port 已被占用${NC}" - netstat -tulnp | grep ":$new_port " - echo "" - echo -n -e "${BLUE}是否继续使用此端口? [y/N]: ${NC}" - read -r continue_change - if [[ ! $continue_change =~ ^[Yy]$ ]]; then - echo -e "${BLUE}取消端口修改${NC}" - return - fi - fi - - # 备份配置文件 - local backup_file - if ! backup_file=$(backup_config_with_checksum "$CONFIG_PATH"); then - echo -e "${RED}配置备份失败,取消操作${NC}" - return 1 - fi - - # 修改配置文件 - local update_success=false - if grep -q "^listen:" "$CONFIG_PATH"; then - if sed -i.tmp "s/^listen:.*/listen: :$new_port/" "$CONFIG_PATH"; then - update_success=true - fi - else - if sed -i.tmp "1i listen: :$new_port" "$CONFIG_PATH"; then - update_success=true - fi - fi - - # 清理临时文件 - rm -f "${CONFIG_PATH}.tmp" - - if [[ "$update_success" == "true" ]]; then - echo -e "${GREEN}端口已修改为: $new_port${NC}" - - # 验证配置文件语法 - if command -v hysteria >/dev/null && ! hysteria server --config "$CONFIG_PATH" --check 2>/dev/null; then - echo -e "${RED}配置文件语法错误,正在回滚...${NC}" - rollback_config "$backup_file" - return 1 - fi - - # 询问是否重启服务 - if systemctl is-active --quiet $SERVICE_NAME; then - echo -n -e "${BLUE}是否重启服务以应用新端口? [Y/n]: ${NC}" - read -r restart_service - if [[ ! $restart_service =~ ^[Nn]$ ]]; then - if systemctl restart $SERVICE_NAME; then - echo -e "${GREEN}服务已重启${NC}" - else - echo -e "${RED}服务重启失败,正在回滚配置...${NC}" - rollback_config "$backup_file" - return 1 - fi - fi - fi - - # 防火墙提醒 - echo "" - echo -e "${YELLOW}重要提醒:${NC}" - echo "1. 请确保防火墙允许端口 $new_port 通信" - echo "2. 如果使用云服务器,请检查安全组设置" - echo "3. 客户端配置也需要更新端口号" - - else - echo -e "${RED}配置文件修改失败${NC}" - return 1 - fi -} - -# 查看当前进阶配置 -view_advanced_config() { - echo -e "${CYAN}当前进阶配置状态:${NC}" - echo "" - - if [[ ! -f "$CONFIG_PATH" ]]; then - echo -e "${RED}配置文件不存在: $CONFIG_PATH${NC}" - return 1 - fi - - security_check -} - -# 主进阶配置函数 -advanced_configuration() { - # 初始化环境 - init_environment - - while true; do - clear - echo -e "${BLUE}Hysteria2 进阶配置 - 修复版本${NC}" - echo "" - - # 显示系统状态 - if systemctl is-active --quiet $SERVICE_NAME; then - echo -e "服务状态: ${GREEN}运行中${NC}" - else - echo -e "服务状态: ${RED}已停止${NC}" - fi - - if [[ -f "$CONFIG_PATH" ]]; then - local config_size=$(du -h "$CONFIG_PATH" | cut -f1) - echo -e "配置文件: ${GREEN}存在${NC} ($config_size) - $CONFIG_PATH" - else - echo -e "配置文件: ${RED}不存在${NC} - $CONFIG_PATH" - fi - - echo "" - echo -e "${YELLOW}配置选项:${NC}" - echo -e "${GREEN}1.${NC} 修改监听端口" - echo -e "${GREEN}2.${NC} 查看配置状态" - echo -e "${GREEN}3.${NC} 配置健康检查" - echo -e "${GREEN}4.${NC} 重新检测配置文件" - echo -e "${GREEN}5.${NC} 创建默认配置文件" - echo "" - echo -e "${RED}0.${NC} 返回主菜单" - echo "" - echo -n -e "${BLUE}请选择操作 [0-5]: ${NC}" - read -r choice - - case $choice in - 1) - clear - modify_listen_port - echo "" - read -p "按回车键继续..." - ;; - 2) - clear - view_advanced_config - echo "" - read -p "按回车键继续..." - ;; - 3) - clear - health_check - echo "" - read -p "按回车键继续..." - ;; - 4) - clear - echo -e "${BLUE}重新检测配置文件...${NC}" - detect_config_file - echo "" - read -p "按回车键继续..." - ;; - 5) - clear - if [[ -f "$CONFIG_PATH" ]]; then - echo -e "${YELLOW}配置文件已存在: $CONFIG_PATH${NC}" - echo -n -e "${BLUE}是否覆盖现有配置? [y/N]: ${NC}" - read -r overwrite - if [[ $overwrite =~ ^[Yy]$ ]]; then - create_default_config - else - echo -e "${BLUE}取消创建${NC}" - fi - else - create_default_config - fi - echo "" - read -p "按回车键继续..." - ;; - 0) - break - ;; - *) - echo -e "${RED}无效选项${NC}" - sleep 1 - ;; - esac - done -} - -# 如果脚本被直接执行,运行主函数 -if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then - advanced_configuration -fi diff --git a/scripts/troubleshoot.sh b/scripts/troubleshoot.sh deleted file mode 100644 index e2845fb..0000000 --- a/scripts/troubleshoot.sh +++ /dev/null @@ -1,1540 +0,0 @@ -# 检查证书文件(优化版本) -check_certificates() { - echo -e "${CYAN}=== 证书文件检查 ===${NC}" - echo "" - - local cert_dir="/etc/hysteria" - local cert_file="$cert_dir/server.crt" - local key_file="$cert_dir/server.key" - - # 检查 ACME 证书配置 - if grep -q "^acme:" "$CONFIG_PATH" 2>/dev/null; then - echo -e "${BLUE}ACME 自动证书模式${NC}" - - # 获取配置的域名 - local domains=($(grep -A 10 "^acme:" "$CONFIG_PATH" | grep -E "^\s*-" | awk '{print $2}')) - - if [[ ${#domains[@]} -gt 0 ]]; then - echo "配置域名: ${domains[*]}" - - # 检查域名解析 - for domain in "${domains[@]}"; do - echo -n "检查域名解析 $domain... " - local resolved_ip=$(timeout 5 dig +short A "$domain" 2>/dev/null | head -1) - if [[ -n "$resolved_ip" ]]; then - echo -e "${GREEN}✓ $resolved_ip${NC}" - add_diagnostic_result "SUCCESS" "域名解析" "域名 $domain 解析正常: $resolved_ip" - else - echo -e "${RED}✗ 解析失败${NC}" - add_diagnostic_result "CRITICAL" "域名解析" "域名 $domain 解析失败" true - fi - done - - # 检查域名是否指向当前服务器 - local public_ip=$(timeout 5 curl -s ipv4.icanhazip.com 2>/dev/null) - if [[ -n "$public_ip" ]]; then - for domain in "${domains[@]}"; do - local domain_ip=$(timeout 5 dig +short A "$domain" 2>/dev/null | head -1) - if [[ "$domain_ip" == "$public_ip" ]]; then - echo -e "${GREEN}✓ 域名 $domain 正确指向当前服务器${NC}" - add_diagnostic_result "SUCCESS" "域名配置" "域名 $domain 正确指向服务器" - else - echo -e "${YELLOW}⚠ 域名 $domain 未指向当前服务器 ($domain_ip vs $public_ip)${NC}" - add_diagnostic_result "WARNING" "域名配置" "域名 $domain 未指向当前服务器" true - fi - done - fi - - else - echo -e "${RED}✗ ACME 配置中未找到域名${NC}" - add_diagnostic_result "CRITICAL" "ACME配置" "ACME 配置中未找到域名" true - fi - - # 检查 ACME 证书目录 - local acme_dir="/var/lib/hysteria" - if [[ -d "$acme_dir" ]]; then - echo "ACME 证书目录: $acme_dir (存在)" - local cert_count=$(find "$acme_dir" -name "*.crt" 2>/dev/null | wc -l) - echo "已生成证书数量: $cert_count" - else - echo "ACME 证书目录: $acme_dir (不存在)" - add_diagnostic_result "INFO" "ACME证书" "ACME 证书目录不存在,首次运行时会创建" - fi - - # 检查手动证书配置 - elif grep -q "^tls:" "$CONFIG_PATH" 2>/dev/null; then - echo -e "${BLUE}手动证书模式${NC}" - - local config_cert=$(grep -A 3 "^tls:" "$CONFIG_PATH" | grep "cert:" | awk '{print $2}') - local config_key=$(grep -A 3 "^tls:" "$CONFIG_PATH" | grep "key:" | awk '{print $2}') - - echo "配置中的证书路径: $config_cert" - echo "配置中的私钥路径: $config_key" - - # 检查证书文件 - if [[ -f "$config_cert" ]]; then - echo -e "${GREEN}✓ 证书文件存在${NC}" - local cert_size=$(du -h "$config_cert" | cut -f1) - echo " 大小: $cert_size" - - # 检查证书详情 - if command -v openssl >/dev/null; then - local cert_info=$(openssl x509 -in "$config_cert" -text -noout 2>/dev/null) - if [[ -n "$cert_info" ]]; then - local subject=$(echo "$cert_info" | grep "Subject:" | cut -d= -f2- | sed 's/^[[:space:]]*//') - local issuer=$(echo "$cert_info" | grep "Issuer:" | cut -d= -f2- | sed 's/^[[:space:]]*//') - local not_after=$(echo "$cert_info" | grep "Not After" | cut -d: -f2-) - - echo " 主体: $subject" - echo " 颁发者: $issuer" - echo " 有效期至: $not_after" - - # 检查证书是否过期 - local expiry_timestamp=$(date -d "$not_after" +%s 2>/dev/null) - local current_timestamp=$(date +%s) - - if [[ -n "$expiry_timestamp" ]] && [[ $expiry_timestamp -gt $current_timestamp ]]; then - local days_left=$(( (expiry_timestamp - current_timestamp) / 86400 )) - echo -e " 状态: ${GREEN}有效 (剩余 $days_left 天)${NC}" - - if [[ $days_left -lt 30 ]]; then - add_diagnostic_result "WARNING" "证书有效期" "证书将在 $days_left 天后过期" true - else - add_diagnostic_result "SUCCESS" "证书有效期" "证书有效,剩余 $days_left 天" - fi - else - echo -e " 状态: ${RED}已过期${NC}" - add_diagnostic_result "CRITICAL" "证书有效期" "证书已过期" true - fi - - add_diagnostic_result "SUCCESS" "证书文件" "证书文件存在且可读取" - else - echo -e " 状态: ${RED}证书格式错误${NC}" - add_diagnostic_result "CRITICAL" "证书格式" "证书文件格式错误" true - fi - fi - else - echo -e "${RED}✗ 证书文件不存在${NC}" - add_diagnostic_result "CRITICAL" "证书文件" "证书文件不存在: $config_cert" true - fi - - # 检查私钥文件 - if [[ -f "$config_key" ]]; then - echo -e "${GREEN}✓ 私钥文件存在${NC}" - local key_size=$(du -h "$config_key" | cut -f1) - local key_perms=$(stat -c %a "$config_key" 2>/dev/null) - echo " 大小: $key_size" - echo " 权限: $key_perms" - - if [[ "$key_perms" == "600" ]]; then - add_diagnostic_result "SUCCESS" "私钥权限" "私钥文件权限正确" - else - add_diagnostic_result "WARNING" "私钥权限" "私钥文件权限不安全: $key_perms (建议: 600)" true - fi - - # 验证私钥格式 - if command -v openssl >/dev/null; then - if openssl rsa -in "$config_key" -check -noout 2>/dev/null; then - echo -e " 格式: ${GREEN}有效${NC}" - add_diagnostic_result "SUCCESS" "私钥格式" "私钥文件格式有效" - else - echo -e " 格式: ${RED}无效${NC}" - add_diagnostic_result "CRITICAL" "私钥格式" "私钥文件格式无效" true - fi - fi - else - echo -e "${RED}✗ 私钥文件不存在${NC}" - add_diagnostic_result "CRITICAL" "私钥文件" "私钥文件不存在: $config_key" true - fi - - # 检查默认自签名证书 - elif [[ -f "$cert_file" && -f "$key_file" ]]; then - echo -e "${BLUE}自签名证书模式${NC}" - echo -e "${GREEN}✓ 自签名证书文件存在${NC}" - echo "证书路径: $cert_file" - echo "私钥路径: $key_file" - - add_diagnostic_result "INFO" "证书配置" "使用自签名证书" - - else - echo -e "${YELLOW}⚠ 未找到证书配置或文件${NC}" - add_diagnostic_result "WARNING" "证书配置" "未找到有效的证书配置" true - fi - - echo "" -} - -# 检查服务状态(优化版本) -check_service_status() { - echo -e "${CYAN}=== 服务状态检查 ===${NC}" - echo "" - - # 基本服务状态 - echo -n "服务运行状态: " - if systemctl is-active --quiet hysteria-server.service; then - echo -e "${GREEN}运行中${NC}" - add_diagnostic_result "SUCCESS" "服务状态" "服务正在运行" - - # 获取服务详细信息 - local start_time=$(systemctl show hysteria-server.service --property=ActiveEnterTimestamp --value) - if [[ -n "$start_time" ]]; then - echo "启动时间: $start_time" - fi - - # 检查服务稳定性 - local restart_count=$(systemctl show hysteria-server.service --property=NRestarts --value) - echo "重启次数: ${restart_count:-0}" - - if [[ "${restart_count:-0}" -gt 5 ]]; then - add_diagnostic_result "WARNING" "服务稳定性" "服务重启次数较多: $restart_count" false - fi - - else - echo -e "${RED}未运行${NC}" - add_diagnostic_result "CRITICAL" "服务状态" "服务未运行" true - - # 获取停止原因 - local exit_code=$(systemctl show hysteria-server.service --property=ExecMainStatus --value) - local exit_signal=$(systemctl show hysteria-server.service --property=ExecMainSignal --value) - - if [[ -n "$exit_code" && "$exit_code" != "0" ]]; then - echo "退出代码: $exit_code" - add_diagnostic_result "CRITICAL" "服务退出" "服务异常退出,代码: $exit_code" true - fi - - if [[ -n "$exit_signal" && "$exit_signal" != "0" ]]; then - echo "信号: $exit_signal" - fi - fi - - # 开机自启状态 - echo -n "开机自启状态: " - if systemctl is-enabled --quiet hysteria-server.service; then - echo -e "${GREEN}已启用${NC}" - add_diagnostic_result "SUCCESS" "开机自启" "开机自启已启用" - else - echo -e "${RED}未启用${NC}" - add_diagnostic_result "WARNING" "开机自启" "开机自启未启用" true - fi - - # 进程信息 - local pid=$(pgrep -f hysteria-server) - if [[ -n "$pid" ]]; then - echo "" - echo -e "${BLUE}进程信息:${NC}" - echo "进程ID: $pid" - - # 性能信息 - local cpu_usage=$(ps -p $pid -o %cpu= 2>/dev/null | awk '{print $1"%"}') - local mem_usage=$(ps -p $pid -o rss= 2>/dev/null | awk '{printf "%.1f MB", $1/1024}') - local mem_percent=$(ps -p $pid -o %mem= 2>/dev/null | awk '{print $1"%"}') - - echo "CPU 使用率: ${cpu_usage:-N/A}" - echo "内存使用: ${mem_usage:-N/A} (${mem_percent:-N/A})" - - # 文件描述符 - if [[ -d "/proc/$pid/fd" ]]; then - local fd_count=$(ls /proc/$pid/fd 2>/dev/null | wc -l) - echo "文件描述符: $fd_count" - - if [[ $fd_count -gt 1000 ]]; then - add_diagnostic_result "WARNING" "资源使用" "文件描述符使用较多: $fd_count" false - fi - fi - - add_diagnostic_result "SUCCESS" "进程状态" "进程运行正常,PID: $pid" - fi - - echo "" -} - -# 检查端口监听(优化版本) -check_port_listening() { - echo -e "${CYAN}=== 端口监听检查 ===${NC}" - echo "" - - local port="443" - if [[ -f "$CONFIG_PATH" ]]; then - port=$(grep -E "^listen:" "$CONFIG_PATH" | awk '{print $2}' | sed 's/://' || echo "443") - fi - - echo -e "${BLUE}检查端口 $port 监听状态:${NC}" - - # 检查端口是否在监听 - if netstat -tuln 2>/dev/null | grep -q ":$port "; then - echo -e "${GREEN}✓ 端口 $port 正在监听${NC}" - - # 显示详细监听信息 - local listen_info=$(netstat -tulnp 2>/dev/null | grep ":$port ") - echo "监听详情:" - echo "$listen_info" | sed 's/^/ /' - - add_diagnostic_result "SUCCESS" "端口监听" "端口 $port 正在监听" - - # 检查连接统计 - local established=$(netstat -an 2>/dev/null | grep ":$port " | grep -c ESTABLISHED || echo "0") - local time_wait=$(netstat -an 2>/dev/null | grep ":$port " | grep -c TIME_WAIT || echo "0") - - echo "" - echo "连接统计:" - echo " ESTABLISHED: $established" - echo " TIME_WAIT: $time_wait" - - if [[ $established -gt 100 ]]; then - add_diagnostic_result "INFO" "连接数量" "活跃连接较多: $established" - fi - - else - echo -e "${RED}✗ 端口 $port 未监听${NC}" - add_diagnostic_result "CRITICAL" "端口监听" "端口 $port 未监听" true - - # 检查端口是否被占用 - local port_owner=$(netstat -tulnp 2>/dev/null | grep ":$port " | head -1) - if [[ -n "$port_owner" ]]; then - echo "端口被其他进程占用:" - echo " $port_owner" - add_diagnostic_result "CRITICAL" "端口占用" "端口 $port 被其他进程占用" true - fi - - echo "" - echo "可能原因:" - echo "1. 服务未启动" - echo "2. 配置文件错误" - echo "3. 端口被其他程序占用" - echo "4. 防火墙阻止端口监听" - fi - - # 测试端口连通性 - echo "" - echo -e "${BLUE}端口连通性测试:${NC}" - - local public_ip=$(timeout 3 curl -s ipv4.icanhazip.com 2>/dev/null) - if [[ -n "$public_ip" ]]; then - echo -n "测试外部连接到 $public_ip:$port... " - if timeout 5 bash -c "/dev/null; then - echo -e "${GREEN}✓ 可连接${NC}" - add_diagnostic_result "SUCCESS" "外部连接" "端口 $port 外部可连接" - else - echo -e "${RED}✗ 无法连接${NC}" - add_diagnostic_result "WARNING" "外部连接" "端口 $port 外部无法连接,可能被防火墙阻挡" true - fi - else - echo "无法获取公网IP,跳过外部连接测试" - fi - - echo "" -} - -# 检查防火墙状态(优化版本) -check_firewall() { - echo -e "${CYAN}=== 防火墙检查 ===${NC}" - echo "" - - local port="443" - if [[ -f "$CONFIG_PATH" ]]; then - port=$(grep -E "^listen:" "$CONFIG_PATH" | awk '{print $2}' | sed 's/://' || echo "443") - fi - - local firewall_detected=false - local port_allowed=false - - # 检查 UFW - if command -v ufw &> /dev/null; then - echo -e "${BLUE}UFW 防火墙:${NC}" - local ufw_status=$(ufw status 2>/dev/null) - local ufw_active=$(echo "$ufw_status" | head -1) - echo "$ufw_active" - - if echo "$ufw_active" | grep -q "Status: active"; then - firewall_detected=true - - # 检查端口规则 - if echo "$ufw_status" | grep -E "^$port\b|^$port/"; then - echo -e "${GREEN}✓ 端口 $port 在 UFW 规则中${NC}" - port_allowed=true - add_diagnostic_result "SUCCESS" "UFW规则" "端口 $port 已在 UFW 中允许" - else - echo -e "${YELLOW}⚠ 端口 $port 不在 UFW 规则中${NC}" - add_diagnostic_result "WARNING" "UFW规则" "端口 $port 未在 UFW 中配置" true - fi - - echo "UFW 规则详情:" - echo "$ufw_status" | tail -n +4 | head -10 | sed 's/^/ /' - else - echo "UFW 未激活" - add_diagnostic_result "INFO" "UFW状态" "UFW 防火墙未激活" - fi - echo "" - fi - - # 检查 firewalld - if command -v firewall-cmd &> /dev/null; then - echo -e "${BLUE}Firewalld 防火墙:${NC}" - if firewall-cmd --state &>/dev/null; then - echo "运行中" - firewall_detected=true - - # 检查端口是否开放 - if firewall-cmd --list-ports 2>/dev/null | grep -q "$port"; then - echo -e "${GREEN}✓ 端口 $port 已开放${NC}" - port_allowed=true - add_diagnostic_result "SUCCESS" "Firewalld规则" "端口 $port 已在 firewalld 中开放" - else - echo -e "${YELLOW}⚠ 端口 $port 未开放${NC}" - add_diagnostic_result "WARNING" "Firewalld规则" "端口 $port 未在 firewalld 中开放" true - fi - - echo "开放端口:" - firewall-cmd --list-ports 2>/dev/null | sed 's/^/ /' - - echo "活动区域:" - firewall-cmd --get-active-zones 2>/dev/null | sed 's/^/ /' - else - echo "未运行" - add_diagnostic_result "INFO" "Firewalld状态" "Firewalld 防火墙未运行" - fi - echo "" - fi - - # 检查 iptables - if command -v iptables &> /dev/null; then - echo -e "${BLUE}iptables 规则:${NC}" - firewall_detected=true - - # 检查 INPUT 链中的端口规则 - local iptables_rules=$(iptables -L INPUT -n 2>/dev/null) - if echo "$iptables_rules" | grep -q "$port"; then - echo -e "${GREEN}✓ 发现端口 $port 相关规则${NC}" - echo "相关规则:" - echo "$iptables_rules" | grep "$port" | sed 's/^/ /' - add_diagnostic_result "SUCCESS" "iptables规则" "发现端口 $port 相关的 iptables 规则" - else - echo -e "${YELLOW}⚠ 未发现端口 $port 相关规则${NC}" - add_diagnostic_result "WARNING" "iptables规则" "未发现端口 $port 的 iptables 规则" false - fi - - # 检查默认策略 - local default_policy=$(iptables -L INPUT 2>/dev/null | head -1 | grep -o 'policy [A-Z]*' | cut -d' ' -f2) - if [[ "$default_policy" == "DROP" || "$default_policy" == "REJECT" ]]; then - echo "INPUT 链默认策略: $default_policy" - add_diagnostic_result "INFO" "iptables策略" "INPUT 链默认策略为 $default_policy,需要明确允许端口" - fi - echo "" - fi - - # 总结防火墙状态 - if [[ "$firewall_detected" == false ]]; then - echo -e "${GREEN}✓ 未检测到活跃的防火墙,端口访问不受限制${NC}" - add_diagnostic_result "INFO" "防火墙状态" "未检测到活跃的防火墙" - elif [[ "$port_allowed" == true ]]; then - echo -e "${GREEN}✓ 防火墙已正确配置,端口 $port 已允许${NC}" - add_diagnostic_result "SUCCESS" "防火墙配置" "防火墙已正确配置端口 $port" - else - echo -e "${YELLOW}⚠ 防火墙可能阻止端口 $port 访问${NC}" - add_diagnostic_result "WARNING" "防火墙阻挡" "防火墙可能阻止端口 $port 访问" true - fi - - echo "" -} - -# 检查网络连通性(优化版本) -check_network_connectivity() { - echo -e "${CYAN}=== 网络连通性检查 ===${NC}" - echo "" - - # DNS 解析测试 - echo -e "${BLUE}DNS 解析测试:${NC}" - local dns_servers=("8.8.8.8" "1.1.1.1" "114.114.114.114") - local dns_ok=false - - for dns in "${dns_servers[@]}"; do - echo -n "测试 DNS $dns... " - if timeout 3 nslookup google.com "$dns" &>/dev/null; then - echo -e "${GREEN}✓${NC}" - dns_ok=true - else - echo -e "${RED}✗${NC}" - fi - done - - if [[ "$dns_ok" == true ]]; then - add_diagnostic_result "SUCCESS" "DNS解析" "DNS 解析正常" - else - add_diagnostic_result "CRITICAL" "DNS解析" "DNS 解析失败" true - fi - - echo "" - - # 外网连接测试 - echo -e "${BLUE}外网连接测试:${NC}" - local test_sites=("google.com" "cloudflare.com" "github.com") - local connectivity_ok=false - - for site in "${test_sites[@]}"; do - echo -n "连接 $site... " - if timeout 5 curl -s --connect-timeout 3 "$site" &>/dev/null; then - echo -e "${GREEN}✓${NC}" - connectivity_ok=true - else - echo -e "${RED}✗${NC}" - fi - done - - if [[ "$connectivity_ok" == true ]]; then - add_diagnostic_result "SUCCESS" "外网连接" "外网连接正常" - else - add_diagnostic_result "CRITICAL" "外网连接" "外网连接失败" true - fi - - echo "" - - # 网络接口检查 - echo -e "${BLUE}网络接口检查:${NC}" - local interfaces=$(ip link show | grep -E "^[0-9]+:" | grep "UP" | awk -F': ' '{print $2}' | grep -v lo) - - if [[ -n "$interfaces" ]]; then - echo "活跃网络接口:" - echo "$interfaces" | while read -r interface; do - local ip=$(ip addr show "$interface" | grep "inet " | awk '{print $2}' | cut -d/ -f1) - echo " $interface: ${ip:-无IP}" - done - add_diagnostic_result "SUCCESS" "网络接口" "网络接口正常" - else - echo -e "${RED}✗ 未找到活跃的网络接口${NC}" - add_diagnostic_result "CRITICAL" "网络接口" "未找到活跃的网络接口" true - fi - - echo "" - - # 路由表检查 - echo -e "${BLUE}路由检查:${NC}" - local default_route=$(ip route | grep default) - if [[ -n "$default_route" ]]; then - echo "默认路由:" - echo "$default_route" | sed 's/^/ /' - add_diagnostic_result "SUCCESS" "路由配置" "默认路由配置正常" - else - echo -e "${RED}✗ 未找到默认路由${NC}" - add_diagnostic_result "CRITICAL" "路由配置" "未找到默认路由" true - fi - - echo "" -} - -# 检查日志错误(优化版本) -check_logs() { - echo -e "${CYAN}=== 日志错误检查 ===${NC}" - echo "" - - if ! command -v journalctl >/dev/null; then - echo -e "${YELLOW}journalctl 命令不可用,无法检查日志${NC}" - add_diagnostic_result "WARNING" "日志检查" "journalctl 不可用" - return 1 - fi - - # 检查不同时间段的日志 - local time_periods=("1 hour" "6 hours" "24 hours") - - for period in "${time_periods[@]}"; do - echo -e "${BLUE}最近 $period 的日志统计:${NC}" - - local error_count=$(journalctl -u hysteria-server.service --since "$period ago" --no-pager -q 2>/dev/null | grep -ic "error" || echo "0") - local warning_count=$(journalctl -u hysteria-server.service --since "$period ago" --no-pager -q 2>/dev/null | grep -ic "warn" || echo "0") - local fatal_count=$(journalctl -u hysteria-server.service --since "$period ago" --no-pager -q 2>/dev/null | grep -ic "fatal" || echo "0") - local total_lines=$(journalctl -u hysteria-server.service --since "$period ago" --no-pager -q 2>/dev/null | wc -l || echo "0") - - echo " 总日志行数: $total_lines" - echo " 错误消息: $error_count" - echo " 警告消息: $warning_count" - echo " 严重错误: $fatal_count" - - # 根据错误数量判断问题严重性 - if [[ $fatal_count -gt 0 ]]; then - add_diagnostic_result "CRITICAL" "日志分析" "最近 $period 发现 $fatal_count 个严重错误" true - elif [[ $error_count -gt 10 ]]; then - add_diagnostic_result "WARNING" "日志分析" "最近 $period 错误消息较多: $error_count 个" false - elif [[ $error_count -eq 0 && $warning_count -eq 0 ]]; then - add_diagnostic_result "SUCCESS" "日志分析" "最近 $period 无错误或警告" - fi - - echo "" - done - - # 显示最近的严重错误 - echo -e "${BLUE}最近的严重错误 (如果有):${NC}" - local recent_errors=$(journalctl -u hysteria-server.service --since "24 hours ago" --no-pager -q 2>/dev/null | grep -iE "error|fatal" | tail -3) - - if [[ -n "$recent_errors" ]]; then - echo "$recent_errors" | sed 's/^/ /' - add_diagnostic_result "WARNING" "最近错误" "发现最近的错误日志" - else - echo -e "${GREEN}✓ 未发现最近的严重错误${NC}" - fi - - echo "" -} - -# 自动修复功能 -auto_fix_issues() { - echo -e "${CYAN}=== 自动修复问题 ===${NC}" - echo "" - - local fixed_count=0 - local failed_count=0 - - # 遍历诊断结果,寻找可修复的问题 - for result in "${DIAGNOSTIC_RESULTS[@]}"; do - IFS='|' read -r level category message fix_available <<< "$result" - - if [[ "$fix_available" == "true" && ("$level" == "CRITICAL" || "$level" == "WARNING") ]]; then - echo -e "${BLUE}正在修复: $message${NC}" - - case "$category" in - "程序安装") - if ! command -v hysteria >/dev/null; then - echo " 尝试安装 Hysteria2..." - if bash <(curl -fsSL https://get.hy2.sh/) 2>/dev/null; then - echo -e " ${GREEN}✓ Hysteria2 安装成功${NC}" - ((fixed_count++)) - else - echo -e " ${RED}✗ 安装失败${NC}" - ((failed_count++)) - fi - fi - ;; - - "文件权限") - if [[ -f "$CONFIG_PATH" ]]; then - echo " 修复配置文件权限..." - if chmod 600 "$CONFIG_PATH"; then - echo -e " ${GREEN}✓ 权限修复成功${NC}" - ((fixed_count++)) - else - echo -e " ${RED}✗ 权限修复失败${NC}" - ((failed_count++)) - fi - fi - ;; - - "私钥权限") - local key_file=$(grep -A 3 "^tls:" "$CONFIG_PATH" 2>/dev/null | grep "key:" | awk '{print $2}') - if [[ -f "$key_file" ]]; then - echo " 修复私钥文件权限..." - if chmod 600 "$key_file"; then - echo -e " ${GREEN}✓ 私钥权限修复成功${NC}" - ((fixed_count++)) - else - echo -e " ${RED}✗ 私钥权限修复失败${NC}" - ((failed_count++)) - fi - fi - ;; - - "服务状态") - if ! systemctl is-active --quiet hysteria-server.service; then - echo " 尝试启动服务..." - if systemctl start hysteria-server.service; then - echo -e " ${GREEN}✓ 服务启动成功${NC}" - ((fixed_count++)) - else - echo -e " ${RED}✗ 服务启动失败${NC}" - ((failed_count++)) - fi - fi - ;; - - "开机自启") - if ! systemctl is-enabled --quiet hysteria-server.service; then - echo " 启用开机自启..." - if systemctl enable hysteria-server.service; then - echo -e " ${GREEN}✓ 开机自启启用成功${NC}" - ((fixed_count++)) - else - echo -e " ${RED}✗ 开机自启启用失败${NC}" - ((failed_count++)) - fi - fi - ;; - - "系统资源") - if [[ "$message" == *"内存"* ]]; then - echo " 尝试释放内存..." - if sync && echo 3 > /proc/sys/vm/drop_caches 2>/dev/null; then - echo -e " ${GREEN}✓ 内存释放完成${NC}" - ((fixed_count++)) - else - echo -e " ${YELLOW}⚠ 内存释放权限不足${NC}" - fi - fi - ;; - - "UFW规则"|"Firewalld规则"|"防火墙阻挡") - local port=$(grep -E "^listen:" "$CONFIG_PATH" 2>/dev/null | awk '{print $2}' | sed 's/://' || echo "443") - - if command -v ufw >/dev/null && ufw status 2>/dev/null | grep -q "Status: active"; then - echo " 配置 UFW 规则..." - if ufw allow "$port" 2>/dev/null; then - echo -e " ${GREEN}✓ UFW 规则添加成功${NC}" - ((fixed_count++)) - else - echo -e " ${RED}✗ UFW 规则添加失败${NC}" - ((failed_count++)) - fi - elif command -v firewall-cmd >/dev/null && firewall-cmd --state >/dev/null 2>&1; then - echo " 配置 firewalld 规则..." - if firewall-cmd --permanent --add-port="$port/tcp" 2>/dev/null && firewall-cmd --reload 2>/dev/null; then - echo -e " ${GREEN}✓ firewalld 规则添加成功${NC}" - ((fixed_count++)) - else - echo -e " ${RED}✗ firewalld 规则添加失败${NC}" - ((failed_count++)) - fi - fi - ;; - - "配置文件") - if [[ ! -f "$CONFIG_PATH" ]]; then - echo " 创建基础配置文件..." - mkdir -p "$(dirname "$CONFIG_PATH")" - cat > "$CONFIG_PATH" << 'EOF' -listen: :443 - -auth: - type: password - password: changeme - -tls: - cert: /etc/hysteria/server.crt - key: /etc/hysteria/server.key - -masquerade: - type: proxy - proxy: - url: https://news.ycombinator.com/ - rewriteHost: true -EOF - chmod 600 "$CONFIG_PATH" - echo -e " ${GREEN}✓ 基础配置文件创建成功${NC}" - echo -e " ${YELLOW}⚠ 请手动配置认证密码和证书${NC}" - ((fixed_count++)) - fi - ;; - - *) - echo -e " ${YELLOW}⚠ 暂不支持自动修复此类问题${NC}" - ;; - esac - - echo "" - fi - done - - # 修复总结 - echo -e "${CYAN}修复总结:${NC}" - echo "成功修复: $fixed_count 个问题" - echo "修复失败: $failed_count 个问题" - - if [[ $fixed_count -gt 0 ]]; then - echo -e "${GREEN}建议重新运行诊断以验证修复结果${NC}" - fi - - echo "" -} - -# 生成详细诊断报告 -generate_diagnostic_report() { - local report_file="/tmp/hysteria2-diagnostic-$(date +%Y%m%d_%H%M%S).txt" - local html_report_file="/tmp/hysteria2-diagnostic-$(date +%Y%m%d_%H%M%S).html" - - echo -e "${BLUE}生成详细诊断报告...${NC}" - - # 生成文本报告 - { - echo "Hysteria2 详细诊断报告" - echo "========================================" - echo "生成时间: $(date)" - echo "系统信息: $(uname -a)" - echo "报告版本: v2.0" - echo "" - - echo "========================================" - echo "诊断结果汇总" - echo "========================================" - - local critical_count=0 - local warning_count=0 - local success_count=0 - local info_count=0 - - for result in "${DIAGNOSTIC_RESULTS[@]}"; do - IFS='|' read -r level category message fix_available <<< "$result" - case "$level" in - "CRITICAL") ((critical_count++)) ;; - "WARNING") ((warning_count++)) ;; - "SUCCESS") ((success_count++)) ;; - "INFO") ((info_count++)) ;; - esac - done - - echo "严重问题: $critical_count" - echo "警告问题: $warning_count" - echo "正常项目: $success_count" - echo "信息项目: $info_count" - echo "" - - echo "========================================" - echo "详细诊断结果" - echo "========================================" - - for result in "${DIAGNOSTIC_RESULTS[@]}"; do - IFS='|' read -r level category message fix_available <<< "$result" - echo "[$level] $category: $message" - if [[ "$fix_available" == "true" ]]; then - echo " └─ 支持自动修复" - fi - echo "" - done - - echo "========================================" - echo "系统详细信息" - echo "========================================" - check_system_info 2>&1 - - echo "========================================" - echo "安装状态" - echo "========================================" - check_hysteria_installation 2>&1 - - echo "========================================" - echo "配置检查" - echo "========================================" - check_configuration 2>&1 - - echo "========================================" - echo "证书检查" - echo "========================================" - check_certificates 2>&1 - - echo "========================================" - echo "服务状态" - echo "========================================" - check_service_status 2>&1 - - echo "========================================" - echo "端口检查" - echo "========================================" - check_port_listening 2>&1 - - echo "========================================" - echo "防火墙检查" - echo "========================================" - check_firewall 2>&1 - - echo "========================================" - echo "网络连通性" - echo "========================================" - check_network_connectivity 2>&1 - - echo "========================================" - echo "日志分析" - echo "========================================" - check_logs 2>&1 - - echo "========================================" - echo "报告结束" - echo "========================================" - - } > "$report_file" 2>&1 - - # 生成 HTML 报告 - generate_html_report "$html_report_file" - - echo -e "${GREEN}诊断报告已生成:${NC}" - echo "文本版本: $report_file" - echo "HTML版本: $html_report_file" - echo "" - - echo -n -e "${BLUE}选择查看方式:${NC}" - echo "" - echo "1. 查看文本报告" - echo "2. 在浏览器中打开HTML报告" - echo "3. 不查看" - echo "" - echo -n -e "${BLUE}请选择 [1-3]: ${NC}" - read -r view_choice - - case $view_choice in - 1) - if command -v less >/dev/null; then - less "$report_file" - else - cat "$report_file" - fi - ;; - 2) - echo "HTML报告路径: $html_report_file" - echo "请在浏览器中打开此文件查看详细报告" - ;; - 3) - ;; - *) - echo -e "${YELLOW}无效选择${NC}" - ;; - esac -} - -# 生成 HTML 报告 -generate_html_report() { - local html_file=$1 - - cat > "$html_file" << 'EOF' - - - - - - Hysteria2 诊断报告 - - - - -
-

🔍 Hysteria2 诊断报告

-
生成时间: REPLACE_TIMESTAMP
- -

📊 诊断结果汇总

-
-
-
严重问题
-
REPLACE_CRITICAL_COUNT
-
-
-
警告问题
-
REPLACE_WARNING_COUNT
-
-
-
正常项目
-
REPLACE_SUCCESS_COUNT
-
-
-
信息项目
-
REPLACE_INFO_COUNT
-
-
- -

📋 详细诊断结果

-
- REPLACE_DETAILED_RESULTS -
- -

💡 修复建议

-
- REPLACE_FIX_SUGGESTIONS -
- -

🔧 系统信息

- -
- - -EOF - - # 替换内容 - local timestamp=$(date) - local critical_count=0 - local warning_count=0 - local success_count=0 - local info_count=0 - local detailed_results="" - local fix_suggestions="" - - for result in "${DIAGNOSTIC_RESULTS[@]}"; do - IFS='|' read -r level category message fix_available <<< "$result" - case "$level" in - "CRITICAL") ((critical_count++)) ;; - "WARNING") ((warning_count++)) ;; - "SUCCESS") ((success_count++)) ;; - "INFO") ((info_count++)) ;; - esac - - detailed_results+="
[$level] $category: $message" - if [[ "$fix_available" == "true" ]]; then - detailed_results+=" (支持自动修复)" - fix_suggestions+="
  • $category: $message
  • " - fi - detailed_results+="
    " - done - - if [[ -z "$fix_suggestions" ]]; then - fix_suggestions="
    ✅ 暂无需要修复的问题
    " - else - fix_suggestions="

    提示: 运行脚本的自动修复功能来解决这些问题。

    " - fi - - # 获取系统信息 - local system_info - system_info=$(check_system_info 2>&1 | sed 's/&/\&/g; s//\>/g') - - # 执行替换 - sed -i "s/REPLACE_TIMESTAMP/$timestamp/g" "$html_file" - sed -i "s/REPLACE_CRITICAL_COUNT/$critical_count/g" "$html_file" - sed -i "s/REPLACE_WARNING_COUNT/$warning_count/g" "$html_file" - sed -i "s/REPLACE_SUCCESS_COUNT/$success_count/g" "$html_file" - sed -i "s/REPLACE_INFO_COUNT/$info_count/g" "$html_file" - sed -i "s|REPLACE_DETAILED_RESULTS|$detailed_results|g" "$html_file" - sed -i "s|REPLACE_FIX_SUGGESTIONS|$fix_suggestions|g" "$html_file" - sed -i "s|REPLACE_SYSTEM_INFO|$system_info|g" "$html_file" -} - -# 快速健康检查 -quick_health_check() { - echo -e "${BLUE}快速健康检查${NC}" - echo "" - - local issues=0 - - # 重置诊断结果 - DIAGNOSTIC_RESULTS=() - - echo -n "检查 Hysteria 安装... " - if command -v hysteria >/dev/null; then - echo -e "${GREEN}✓${NC}" - else - echo -e "${RED}✗${NC}" - ((issues++)) - add_diagnostic_result "CRITICAL" "程序安装" "Hysteria2 未安装" true - fi - - echo -n "检查配置文件... " - if [[ -f "$CONFIG_PATH" ]]; then - echo -e "${GREEN}✓${NC}" - add_diagnostic_result "SUCCESS" "配置文件" "配置文件存在" - else - echo -e "${RED}✗${NC}" - ((issues++)) - add_diagnostic_result "CRITICAL" "配置文件" "配置文件不存在" true - fi - - echo -n "检查服务状态... " - if systemctl is-active --quiet hysteria-server.service; then - echo -e "${GREEN}✓${NC}" - add_diagnostic_result "SUCCESS" "服务状态" "服务正在运行" - else - echo -e "${RED}✗${NC}" - ((issues++)) - add_diagnostic_result "CRITICAL" "服务状态" "服务未运行" true - fi - - echo -n "检查端口监听... " - local port=$(grep -E "^listen:" "$CONFIG_PATH" 2>/dev/null | awk '{print $2}' | sed 's/://' || echo "443") - if netstat -tuln 2>/dev/null | grep -q ":$port "; then - echo -e "${GREEN}✓${NC}" - add_diagnostic_result "SUCCESS" "端口监听" "端口 $port 正在监听" - else - echo -e "${RED}✗${NC}" - ((issues++)) - add_diagnostic_result "CRITICAL" "端口监听" "端口 $port 未监听" true - fi - - echo -n "检查网络连通性... " - if timeout 3 curl -s google.com >/dev/null 2>&1; then - echo -e "${GREEN}✓${NC}" - add_diagnostic_result "SUCCESS" "网络连接" "网络连通正常" - else - echo -e "${RED}✗${NC}" - ((issues++)) - add_diagnostic_result "WARNING" "网络连接" "网络连接可能有问题" false - fi - - echo "" - echo -e "${CYAN}快速检查结果:${NC}" - if [[ $issues -eq 0 ]]; then - echo -e "${GREEN}✓ 系统健康,未发现问题${NC}" - else - echo -e "${RED}✗ 发现 $issues 个问题${NC}" - echo -e "${BLUE}建议运行完整诊断获取详细信息${NC}" - fi - - return $issues -} - -# 主诊断函数(优化版本) -run_diagnostics() { - while true; do - clear - echo -e "${BLUE}Hysteria2 故障排除和诊断 - 优化版本${NC}" - echo "" - - # 显示快速状态 - if systemctl is-active --quiet hysteria-server.service 2>/dev/null; then - echo -e "服务状态: ${GREEN}●${NC} 运行中" - else - echo -e "服务状态: ${RED}●${NC} 已停止" - fi - - if [[ -f "$CONFIG_PATH" ]]; then - echo -e "配置文件: ${GREEN}存在${NC}" - else - echo -e "配置文件: ${RED}不存在${NC}" - fi - - echo "" - echo -e "${YELLOW}检查选项:${NC}" - echo -e "${GREEN}1.${NC} 快速健康检查" - echo -e "${GREEN}2.${NC} 系统信息检查" - echo -e "${GREEN}3.${NC} Hysteria2 安装检查" - echo -e "${GREEN}4.${NC} 配置文件检查" - echo -e "${GREEN}5.${NC} 证书文件检查" - echo -e "${GREEN}6.${NC} 服务状态检查" - echo -e "${GREEN}7.${NC} 端口监听检查" - echo -e "${GREEN}8.${NC} 防火墙检查" - echo -e "${GREEN}9.${NC} 网络连通性检查" - echo -e "${GREEN}10.${NC} 日志错误检查" - echo "" - echo -e "${YELLOW}综合功能:${NC}" - echo -e "${GREEN}11.${NC} 完整诊断 (所有检查)" - echo -e "${GREEN}12.${NC} 自动修复问题" - echo -e "${GREEN}13.${NC} 生成诊断报告" - echo "" - echo -e "${RED}0.${NC} 返回主菜单" - echo "" - echo -n -e "${BLUE}请选择检查项目 [0-13]: ${NC}" - read -r choice - - # 重置诊断结果 - DIAGNOSTIC_RESULTS=() - - case $choice in - 1) - clear - quick_health_check - echo "" - read -p "按回车键继续..." - ;; - 2) - clear - check_system_info - read -p "按回车键继续..." - ;; - 3) - clear - check_hysteria_installation - read -p "按回车键继续..." - ;; - 4) - clear - check_configuration - read -p "按回车键继续..." - ;; - 5) - clear - check_certificates - read -p "按回车键继续..." - ;; - 6) - clear - check_service_status - read -p "按回车键继续..." - ;; - 7) - clear - check_port_listening - read -p "按回车键继续..." - ;; - 8) - clear - check_firewall - read -p "按回车键继续..." - ;; - 9) - clear - check_network_connectivity - read -p "按回车键继续..." - ;; - 10) - clear - check_logs - read -p "按回车键继续..." - ;; - 11) - clear - echo -e "${BLUE}执行完整诊断...${NC}" - echo "" - check_system_info - check_hysteria_installation - check_configuration - check_certificates - check_service_status - check_port_listening - check_firewall - check_network_connectivity - check_logs - - # 总结 - local critical_count=0 - local warning_count=0 - for result in "${DIAGNOSTIC_RESULTS[@]}"; do - IFS='|' read -r level _ _ _ <<< "$result" - case "$level" in - "CRITICAL") ((critical_count++)) ;; - "WARNING") ((warning_count++)) ;; - esac - done - - echo "" - echo -e "${CYAN}完整诊断总结:${NC}" - echo "严重问题: $critical_count 个" - echo "警告问题: $warning_count 个" - - if [[ $critical_count -eq 0 && $warning_count -eq 0 ]]; then - echo -e "${GREEN}✓ 系统完全健康${NC}" - elif [[ $critical_count -eq 0 ]]; then - echo -e "${YELLOW}⚠ 系统基本健康,有一些警告${NC}" - else - echo -e "${RED}✗ 发现严重问题,需要修复${NC}" - fi - - read -p "按回车键继续..." - ;; - 12) - clear - if [[ ${#DIAGNOSTIC_RESULTS[@]} -eq 0 ]]; then - echo -e "${YELLOW}请先运行诊断检查${NC}" - echo -n -e "${BLUE}是否运行快速健康检查? [Y/n]: ${NC}" - read -r run_check - if [[ ! $run_check =~ ^[Nn]$ ]]; then - quick_health_check - echo "" - fi - fi - - if [[ ${#DIAGNOSTIC_RESULTS[@]} -gt 0 ]]; then - auto_fix_issues - else - echo -e "${YELLOW}没有可修复的问题${NC}" - fi - read -p "按回车键继续..." - ;; - 13) - clear - if [[ ${#DIAGNOSTIC_RESULTS[@]} -eq 0 ]]; then - echo -e "${BLUE}正在执行完整诊断以生成报告...${NC}" - echo "" - check_system_info >/dev/null 2>&1 - check_hysteria_installation >/dev/null 2>&1 - check_configuration >/dev/null 2>&1 - check_certificates >/dev/null 2>&1 - check_service_status >/dev/null 2>&1 - check_port_listening >/dev/null 2>&1 - check_firewall >/dev/null 2>&1 - check_network_connectivity >/dev/null 2>&1 - check_logs >/dev/null 2>&1 - fi - generate_diagnostic_report - read -p "按回车键继续..." - ;; - 0) - break - ;; - *) - echo -e "${RED}无效选项${NC}" - sleep 1 - ;; - esac - done -}#!/bin/bash - -# Hysteria2 故障排除和诊断脚本 - 优化版本 - -# 自动修复问题的计数器 -FIXED_ISSUES=0 -FAILED_FIXES=0 - -# 问题等级定义 -declare -A ISSUE_LEVELS=( - ["CRITICAL"]="${RED}严重${NC}" - ["WARNING"]="${YELLOW}警告${NC}" - ["INFO"]="${BLUE}信息${NC}" - ["SUCCESS"]="${GREEN}正常${NC}" -) - -# 记录诊断结果 -declare -a DIAGNOSTIC_RESULTS=() - -# 添加诊断结果 -add_diagnostic_result() { - local level=$1 - local category=$2 - local message=$3 - local fix_available=${4:-false} - - DIAGNOSTIC_RESULTS+=("$level|$category|$message|$fix_available") -} - -# 系统信息检查(优化版本) -check_system_info() { - echo -e "${CYAN}=== 系统信息检查 ===${NC}" - echo "" - - echo -e "${BLUE}操作系统信息:${NC}" - if [[ -f /etc/os-release ]]; then - source /etc/os-release - echo "发行版: $PRETTY_NAME" - echo "版本: $VERSION" - echo "ID: $ID" - echo "内核: $(uname -r)" - - # 检查系统是否支持 - case $ID in - ubuntu|debian|centos|rhel|fedora|opensuse*) - add_diagnostic_result "SUCCESS" "系统兼容性" "支持的操作系统: $PRETTY_NAME" - ;; - *) - add_diagnostic_result "WARNING" "系统兼容性" "未完全测试的操作系统: $PRETTY_NAME" - ;; - esac - fi - - echo "" - echo -e "${BLUE}硬件信息:${NC}" - echo "架构: $(uname -m)" - echo "CPU核心: $(nproc)" - - # 内存检查 - local mem_total=$(free -m | awk '/^Mem:/ {print $2}') - local mem_available=$(free -m | awk '/^Mem:/ {print $7}') - local mem_usage_percent=$((($mem_total - $mem_available) * 100 / $mem_total)) - - echo "内存总量: ${mem_total}MB" - echo "可用内存: ${mem_available}MB (使用率: ${mem_usage_percent}%)" - - if [[ $mem_available -lt 128 ]]; then - add_diagnostic_result "WARNING" "系统资源" "可用内存不足: ${mem_available}MB" true - elif [[ $mem_usage_percent -gt 90 ]]; then - add_diagnostic_result "WARNING" "系统资源" "内存使用率过高: ${mem_usage_percent}%" true - else - add_diagnostic_result "SUCCESS" "系统资源" "内存充足: ${mem_available}MB 可用" - fi - - # 磁盘检查 - local disk_info=$(df -h / | tail -1) - local disk_usage=$(echo "$disk_info" | awk '{print $5}' | sed 's/%//') - local disk_available=$(echo "$disk_info" | awk '{print $4}') - - echo "磁盘使用: ${disk_usage}% (可用: ${disk_available})" - - if [[ $disk_usage -gt 90 ]]; then - add_diagnostic_result "CRITICAL" "磁盘空间" "磁盘使用率过高: ${disk_usage}%" true - elif [[ $disk_usage -gt 80 ]]; then - add_diagnostic_result "WARNING" "磁盘空间" "磁盘使用率较高: ${disk_usage}%" false - else - add_diagnostic_result "SUCCESS" "磁盘空间" "磁盘空间充足" - fi - - echo "" - echo -e "${BLUE}网络信息:${NC}" - echo "主机名: $(hostname)" - - # 内网IP - local internal_ip=$(ip route get 8.8.8.8 2>/dev/null | grep -oP 'src \K\S+' | head -1) - if [[ -n "$internal_ip" ]]; then - echo "内网IP: $internal_ip" - add_diagnostic_result "SUCCESS" "网络配置" "内网IP: $internal_ip" - else - echo "内网IP: 无法获取" - add_diagnostic_result "WARNING" "网络配置" "无法获取内网IP" true - fi - - # 公网IP - local public_ip=$(timeout 5 curl -s ipv4.icanhazip.com 2>/dev/null || timeout 5 curl -s ifconfig.me 2>/dev/null) - if [[ -n "$public_ip" ]]; then - echo "公网IP: $public_ip" - add_diagnostic_result "SUCCESS" "网络连接" "公网IP: $public_ip" - else - echo "公网IP: 无法获取" - add_diagnostic_result "CRITICAL" "网络连接" "无法获取公网IP,网络可能有问题" true - fi - - echo "" -} - -# 检查 Hysteria2 安装状态(优化版本) -check_hysteria_installation() { - echo -e "${CYAN}=== Hysteria2 安装检查 ===${NC}" - echo "" - - if command -v hysteria &> /dev/null; then - local version=$(hysteria version 2>/dev/null | head -1 | cut -d' ' -f2 || echo "未知版本") - echo -e "${GREEN}✓ Hysteria2 已安装${NC}" - echo "版本: $version" - echo "路径: $(which hysteria)" - - # 检查可执行文件权限 - local hysteria_path=$(which hysteria) - local perms=$(stat -c %a "$hysteria_path" 2>/dev/null || stat -f %Lp "$hysteria_path" 2>/dev/null) - echo "权限: $perms" - - add_diagnostic_result "SUCCESS" "程序安装" "Hysteria2 已安装: $version" - - # 检查版本是否是最新的(简单检查) - if [[ "$version" =~ ^v?[0-9]+\.[0-9]+\.[0-9]+$ ]]; then - add_diagnostic_result "INFO" "版本信息" "版本格式正常: $version" - else - add_diagnostic_result "WARNING" "版本信息" "版本格式异常: $version" - fi - - else - echo -e "${RED}✗ Hysteria2 未安装${NC}" - add_diagnostic_result "CRITICAL" "程序安装" "Hysteria2 未安装" true - return 1 - fi - - echo "" -} - -# 检查配置文件(优化版本) -check_configuration() { - echo -e "${CYAN}=== 配置文件检查 ===${NC}" - echo "" - - if [[ -f "$CONFIG_PATH" ]]; then - echo -e "${GREEN}✓ 配置文件存在${NC}" - echo "路径: $CONFIG_PATH" - echo "大小: $(du -h "$CONFIG_PATH" | cut -f1)" - echo "修改时间: $(stat -c %y "$CONFIG_PATH" 2>/dev/null | cut -d. -f1 || stat -f %Sm "$CONFIG_PATH" 2>/dev/null)" - - # 检查配置文件权限 - local perms=$(stat -c %a "$CONFIG_PATH" 2>/dev/null || stat -f %Lp "$CONFIG_PATH" 2>/dev/null) - echo "文件权限: $perms" - - if [[ "$perms" == "600" ]]; then - add_diagnostic_result "SUCCESS" "文件权限" "配置文件权限正确: $perms" - else - add_diagnostic_result "WARNING" "文件权限" "配置文件权限不安全: $perms (建议: 600)" true - fi - - # 检查配置文件所有者 - local owner=$(stat -c %U:%G "$CONFIG_PATH" 2>/dev/null || stat -f %Su:%Sg "$CONFIG_PATH" 2>/dev/null) - echo "文件所有者: $owner" - - # 检查配置文件语法 - echo "" - echo -e "${BLUE}配置文件语法检查:${NC}" - if command -v hysteria >/dev/null; then - if hysteria server --config "$CONFIG_PATH" --check 2>/dev/null; then - echo -e "${GREEN}✓ 配置文件语法正确${NC}" - add_diagnostic_result "SUCCESS" "配置语法" "配置文件语法正确" - else - echo -e "${RED}✗ 配置文件语法错误${NC}" - echo "语法错误详情:" - hysteria server --config "$CONFIG_PATH" --check 2>&1 | head -5 | sed 's/^/ /' - add_diagnostic_result "CRITICAL" "配置语法" "配置文件语法错误" true - fi - else - echo -e "${YELLOW}⚠ 无法验证语法 (hysteria 命令不可用)${NC}" - add_diagnostic_result "WARNING" "配置验证" "无法验证配置文件语法" - fi - - # 分析配置内容 - echo "" - echo -e "${BLUE}配置内容分析:${NC}" - - # 监听端口 - local port=$(grep -E "^listen:" "$CONFIG_PATH" | awk '{print $2}' | sed 's/://') - if [[ -n "$port" ]]; then - echo "监听端口: $port" - add_diagnostic_result "INFO" "端口配置" "监听端口: $port" - else - echo "监听端口: 443 (默认)" - add_diagnostic_result "INFO" "端口配置" "使用默认端口: 443" - fi - - # 认证配置 - local auth_type=$(grep -A 2 "^auth:" "$CONFIG_PATH" | grep "type:" | awk '{print $2}') - if [[ -n "$auth_type" ]]; then - echo "认证方式: $auth_type" - add_diagnostic_result "SUCCESS" "认证配置" "已配置认证: $auth_type" - else - echo -e "${RED}认证方式: 未配置${NC}" - add_diagnostic_result "CRITICAL" "认证配置" "未配置认证方式" true - fi - - # 证书配置 - if grep -q "^acme:" "$CONFIG_PATH"; then - echo "证书类型: ACME 自动证书" - local domains=$(grep -A 5 "^acme:" "$CONFIG_PATH" | grep -E "^\s*-" | head -5 | awk '{print $2}' | tr '\n' ' ') - echo "ACME 域名: ${domains:-未设置}" - add_diagnostic_result "SUCCESS" "证书配置" "ACME 自动证书已配置" - elif grep -q "^tls:" "$CONFIG_PATH"; then - echo "证书类型: 手动证书" - local cert_path=$(grep -A 3 "^tls:" "$CONFIG_PATH" | grep "cert:" | awk '{print $2}') - local key_path=$(grep -A 3 "^tls:" "$CONFIG_PATH" | grep "key:" | awk '{print $2}') - echo "证书路径: $cert_path" - echo "私钥路径: $key_path" - add_diagnostic_result "SUCCESS" "证书配置" "手动证书已配置" - else - echo -e "${RED}证书类型: 未配置${NC}" - add_diagnostic_result "CRITICAL" "证书配置" "未配置证书" true - fi - - # 混淆配置 - if grep -q "^obfs:" "$CONFIG_PATH"; then - local obfs_type=$(grep -A 3 "^obfs:" "$CONFIG_PATH" | grep "type:" | awk '{print $2}') - echo "混淆配置: 已启用 ($obfs_type)" - add_diagnostic_result "SUCCESS" "混淆配置" "混淆已启用: $obfs_type" - else - echo "混淆配置: 未启用" - add_diagnostic_result "INFO" "混淆配置" "混淆未启用 (可选)" - fi - - # 伪装配置 - if grep -q "^masquerade:" "$CONFIG_PATH"; then - local masq_url=$(grep -A 5 "^masquerade:" "$CONFIG_PATH" | grep "url:" | awk '{print $2}') - echo "伪装网站: ${masq_url:-已配置}" - add_diagnostic_result "SUCCESS" "伪装配置" "伪装网站已配置" - else - echo "伪装网站: 未配置" - add_diagnostic_result "WARNING" "伪装配置" "未配置伪装网站" false - fi - - else - echo -e "${RED}✗ 配置文件不存在${NC}" - echo "预期路径: $CONFIG_PATH" - add_diagnostic_result "CRITICAL" "配置文件" "配置文件不存在" true - return 1 - fi - - echo "" -} - -# 检查证书文件(优化版本) -check_certificates diff --git a/templates/advanced-config.yaml b/templates/advanced-config.yaml deleted file mode 100644 index cc03417..0000000 --- a/templates/advanced-config.yaml +++ /dev/null @@ -1,126 +0,0 @@ -# Hysteria2 高级配置文件模板 -# 包含所有可用的配置选项和详细说明 - -# 监听地址和端口 -listen: :443 - -# TLS 配置 (二选一) -# 选项1: ACME 自动证书 -acme: - domains: - - your.domain.net - email: your@email.com - ca: letsencrypt # 可选:zerossl, letsencrypt - altHttpPort: 8080 - altTlsAlpnPort: 8443 - -# 选项2: 手动证书 -# tls: -# cert: /path/to/cert.pem -# key: /path/to/key.pem - -# 认证配置 -auth: - type: password - password: your_password - # 或者使用用户名密码认证 - # type: userpass - # userpass: - # user1: pass1 - # user2: pass2 - -# 伪装配置 -masquerade: - type: proxy - proxy: - url: https://news.ycombinator.com/ - rewriteHost: true - # 或者使用文件伪装 - # type: file - # file: - # dir: /var/www/html - -# 混淆配置 -obfs: - type: salamander - salamander: - password: obfs_password - -# 带宽限制 -bandwidth: - up: 1 gbps - down: 1 gbps - -# 忽略客户端带宽设置 -ignoreClientBandwidth: false - -# UDP 相关配置 -udpIdleTimeout: 60s -disableUDP: false - -# ACL 访问控制 -acl: /etc/hysteria/acl.txt - -# 出站配置 -outbounds: - - name: direct - type: direct - - name: block - type: block - - name: socks5 - type: socks5 - socks5: - addr: 127.0.0.1:1080 - username: user - password: pass - -# 路由规则 -routing: - rules: - # 阻止中国大陆 IP - - outbound: block - geoip: - - cn - # 直连私有 IP - - outbound: direct - ipCIDR: - - 10.0.0.0/8 - - 172.16.0.0/12 - - 192.168.0.0/16 - # 特定域名走代理 - - outbound: socks5 - domain: - - example.com - - "*.google.com" - -# 日志配置 -log: - level: info # debug, info, warn, error - output: /var/log/hysteria.log - -# 性能调优 -resolver: - type: udp - tcp: - addr: 8.8.8.8:53 - timeout: 4s - udp: - addr: 8.8.8.8:53 - timeout: 4s - tls: - addr: 8.8.8.8:853 - timeout: 10s - sni: dns.google - insecure: false - https: - addr: https://1.1.1.1/dns-query - timeout: 10s - -# 流量统计 -trafficStats: - listen: :8080 - secret: stats_secret - -# 其他高级选项 -disableMTUDiscovery: false -hopInterval: 30s