From 7e3be618bbbd60b98193a971987801d7ca8b51e9 Mon Sep 17 00:00:00 2001 From: sindricn Date: Tue, 5 Aug 2025 14:11:40 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=9C=AC=E5=9C=B0=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 157 +++++++++ DEPLOYMENT_GUIDE.md | 382 ++++++++++++++++++++++ FEATURES.md | 298 +++++++++++++++++ PROJECT_OVERVIEW.md | 243 ++++++++++++++ README.md | 179 +++++++++++ UNINSTALL_COMPARISON.md | 213 +++++++++++++ UNINSTALL_GUIDE.md | 333 +++++++++++++++++++ USAGE.md | 307 ++++++++++++++++++ demo.sh | 529 +++++++++++++++++++++++++++++++ hy2-manager.sh | 527 ++++++++++++++++++++++++++++++ install.sh | 216 +++++++++++++ quick-install.sh | 259 +++++++++++++++ scripts/advanced.sh | 428 +++++++++++++++++++++++++ scripts/config.sh | 546 ++++++++++++++++++++++++++++++++ scripts/domain-test.sh | 304 ++++++++++++++++++ scripts/install.sh | 200 ++++++++++++ scripts/node-info.sh | 343 ++++++++++++++++++++ scripts/service.sh | 398 +++++++++++++++++++++++ scripts/troubleshoot.sh | 403 +++++++++++++++++++++++ templates/acme-config.yaml | 66 ++++ templates/advanced-config.yaml | 126 ++++++++ templates/client-config.yaml | 91 ++++++ templates/self-cert-config.yaml | 62 ++++ 23 files changed, 6610 insertions(+) create mode 100644 CHANGELOG.md create mode 100644 DEPLOYMENT_GUIDE.md create mode 100644 FEATURES.md create mode 100644 PROJECT_OVERVIEW.md create mode 100644 README.md create mode 100644 UNINSTALL_COMPARISON.md create mode 100644 UNINSTALL_GUIDE.md create mode 100644 USAGE.md create mode 100644 demo.sh create mode 100644 hy2-manager.sh create mode 100644 install.sh create mode 100644 quick-install.sh create mode 100644 scripts/advanced.sh create mode 100644 scripts/config.sh create mode 100644 scripts/domain-test.sh create mode 100644 scripts/install.sh create mode 100644 scripts/node-info.sh create mode 100644 scripts/service.sh create mode 100644 scripts/troubleshoot.sh create mode 100644 templates/acme-config.yaml create mode 100644 templates/advanced-config.yaml create mode 100644 templates/client-config.yaml create mode 100644 templates/self-cert-config.yaml diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..09e49d0 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,157 @@ +# 更新日志 + +## 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 new file mode 100644 index 0000000..91be28f --- /dev/null +++ b/DEPLOYMENT_GUIDE.md @@ -0,0 +1,382 @@ +# 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 new file mode 100644 index 0000000..2ad1a6f --- /dev/null +++ b/FEATURES.md @@ -0,0 +1,298 @@ +# 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 new file mode 100644 index 0000000..3e8ffac --- /dev/null +++ b/PROJECT_OVERVIEW.md @@ -0,0 +1,243 @@ +# 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 new file mode 100644 index 0000000..f6b0122 --- /dev/null +++ b/README.md @@ -0,0 +1,179 @@ +# Hysteria2 配置管理脚本 + +一个用于简化 Hysteria2 服务器配置和管理的交互式脚本工具。 + +## 功能特性 + +- 🚀 **一键安装/卸载** Hysteria2 服务器 +- ⚙️ **交互式配置生成** 支持 ACME 自动证书和自签名证书 +- 🌐 **智能伪装域名选择** 自动测试延迟选择最优域名 +- 🔧 **进阶配置支持** 端口修改、混淆密码、端口跳跃 +- 📊 **服务管理** 状态查看、日志查询、服务重启 +- 📝 **配置模板** 预设多种常用配置模板 + +## 快速开始 + +### 一键安装 (推荐) + +```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. **安装 Hysteria2** - 自动下载并安装 Hysteria2 服务器 +2. **一键快速配置** - 自动配置自签名证书+混淆+端口跳跃 +3. **手动配置** - 交互式生成配置文件 (ACME/自签名) +4. **管理服务** - 启动/停止/重启/查看状态 +5. **查看日志** - 查看服务运行日志 +6. **测试伪装域名** - 测试并选择最优伪装域名 +7. **进阶配置** - 端口跳跃、混淆等高级设置 +8. **节点信息** - 显示节点链接、订阅链接和客户端配置 +9. **卸载服务** - 提供两种卸载方式: + - 仅卸载程序 (保留配置文件和证书) + - 完全卸载 (删除所有文件) + +## 配置模式 + +### 一键快速配置 (推荐新手) +- **自动化程度**: 完全自动化,无需手动输入 +- **证书方案**: 自签名证书 (无需域名) +- **伪装域名**: 自动测试选择延迟最低的域名 +- **安全特性**: 自动生成认证密码和混淆密码 +- **网络优化**: 自动配置端口跳跃 (20000-50000) +- **网卡检测**: 自动识别网络接口 +- **适用场景**: 快速部署、测试环境、新手用户 + +### ACME 自动证书模式 +- 自动申请和续期 SSL 证书 +- 需要有效域名和邮箱 +- 推荐用于生产环境 + +### 自签名证书模式 +- 生成自签名证书 +- 无需域名,快速部署 +- 适合测试环境 + +## 目录结构 + +``` +s-hy2/ +├── hy2-manager.sh # 主脚本 +├── quick-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 # 说明文档 +``` + +## 快捷命令 + +安装完成后,可以使用以下命令快速启动: + +```bash +# 推荐使用 (简短易记) +sudo s-hy2 + +# 或者使用完整命令 +sudo hy2-manager +``` + +## 系统要求 + +- Linux 系统 (Ubuntu/Debian/CentOS/RHEL/Fedora) +- Root 权限 +- 网络连接 +- 至少 100MB 可用空间 + +## 快速开始示例 + +### 完整部署流程 +```bash +# 1. 一键安装 +curl -fsSL https://raw.githubusercontent.com/your-repo/s-hy2/main/quick-install.sh | sudo bash + +# 2. 启动脚本 +sudo s-hy2 + +# 3. 按菜单操作 +# 选择 1 -> 安装 Hysteria2 +# 选择 2 -> 一键快速配置 +# 选择 8 -> 查看节点信息 +``` + +### 预期输出 +``` +=== Hysteria2 一键快速配置 === + +步骤 1/7: 获取服务器信息... +服务器IP: 192.168.1.100 +网络接口: eth0 + +步骤 2/7: 测试最优伪装域名... +最优伪装域名: cdn.jsdelivr.net + +步骤 3/7: 生成随机密码... +认证密码: Kx9mP2nQ8vR5wE7t +混淆密码: Hy6bN4jM1sL3xC9z + +步骤 4/7: 生成自签名证书... +证书生成完成 + +步骤 5/7: 生成配置文件... +配置文件生成完成 + +步骤 6/7: 配置端口跳跃... +端口跳跃配置成功 (20000-50000 -> 443) + +步骤 7/7: 启动服务... +服务启动成功! + +=== 配置完成 === +节点链接: hysteria2://Kx9mP2nQ8vR5wE7t@192.168.1.100:443?sni=cdn.jsdelivr.net&insecure=1&obfs=salamander&obfs-password=Hy6bN4jM1sL3xC9z#Hysteria2-QuickSetup +``` + +## 常见问题 + +### Q: 一键快速配置包含哪些功能? +A: 自动获取服务器IP、测试最优伪装域名、生成随机密码、创建自签名证书、配置混淆和端口跳跃、启动服务。 + +### Q: 如何获取节点连接信息? +A: 运行 `sudo s-hy2`,选择菜单 "8. 节点信息",可查看节点链接、订阅链接和客户端配置。 + +### Q: 支持哪些操作系统? +A: Ubuntu 18.04+、Debian 9+、CentOS 7+、RHEL 7+、Fedora 30+。 + +### Q: 如何卸载? +A: 运行脚本选择 "9. 卸载服务",提供"仅卸载程序"和"完全卸载"两种方式。 + +## 许可证 + +MIT License diff --git a/UNINSTALL_COMPARISON.md b/UNINSTALL_COMPARISON.md new file mode 100644 index 0000000..e2dc9a5 --- /dev/null +++ b/UNINSTALL_COMPARISON.md @@ -0,0 +1,213 @@ +# S-Hy2 卸载方式对比 + +## 三种卸载方式详细对比 + +### 📊 对比表格 + +| 卸载方式 | 程序文件 | 配置文件 | 证书文件 | 用户账户 | 管理脚本 | 快捷命令 | 适用场景 | +|---------|---------|---------|---------|---------|---------|---------|---------| +| **方式1: 仅卸载服务器** | ✅ 删除 | ❌ 保留 | ❌ 保留 | ❌ 保留 | ❌ 保留 | ❌ 保留 | 临时卸载、升级、重装 | +| **方式2: 卸载服务器及配置** | ✅ 删除 | ✅ 删除 | ✅ 删除 | ✅ 删除 | ❌ 保留 | ❌ 保留 | 清理配置,保留脚本 | +| **方式3: 卸载所有内容** | ✅ 删除 | ✅ 删除 | ✅ 删除 | ✅ 删除 | ✅ 删除 | ✅ 删除 | 彻底清理、不再使用 | + +## 🎯 选择建议 + +### 方式1: 仅卸载 Hysteria2 服务器 +**推荐指数: ⭐⭐⭐⭐⭐** + +**何时使用:** +- 🔄 临时卸载,计划重新安装 +- 🆙 系统升级或重装前的准备 +- 💾 保留配置以备后用 +- 🧪 测试不同版本的 Hysteria2 + +**优点:** +- 保留所有配置,重新安装后可直接使用 +- 保留证书文件,无需重新生成 +- 保留管理脚本,操作便捷 +- 卸载过程快速,风险最低 + +**操作:** +```bash +sudo s-hy2 +# 选择 "9. 卸载服务" -> "1. 仅卸载 Hysteria2 服务器" +``` + +### 方式2: 卸载 Hysteria2 服务器及配置文件 +**推荐指数: ⭐⭐⭐⭐** + +**何时使用:** +- 🧹 清理所有配置,但保留管理脚本 +- 🆕 重新开始全新配置 +- 🧪 清理测试环境 +- 🔒 出于安全考虑清理敏感配置 + +**优点:** +- 清理所有 Hysteria2 相关配置 +- 保留管理脚本,便于重新部署 +- 清理用户账户和证书 +- 重新配置时从零开始 + +**操作:** +```bash +sudo s-hy2 +# 选择 "9. 卸载服务" -> "2. 卸载 Hysteria2 服务器及配置文件" +``` + +### 方式3: 卸载脚本及 Hysteria2 服务器和所有文件 +**推荐指数: ⭐⭐⭐** + +**何时使用:** +- 🚫 不再使用 Hysteria2 和管理脚本 +- 🧹 彻底清理系统 +- 🔄 服务器用途完全改变 +- 💾 释放所有相关存储空间 + +**优点:** +- 完全清理,不留任何痕迹 +- 释放所有相关存储空间 +- 适合服务器用途完全改变的情况 + +**缺点:** +- 重新使用需要重新安装脚本 +- 操作不可逆,需要谨慎确认 + +**操作:** +```bash +sudo s-hy2 +# 选择 "9. 卸载服务" -> "3. 卸载脚本及 Hysteria2 服务器和所有文件" +# 输入 "YES" 确认 +``` + +## 🔄 重新安装指南 + +### 从方式1卸载后重新安装 +```bash +# 直接重新安装 Hysteria2 +sudo s-hy2 +# 选择 "1. 安装 Hysteria2" +# 选择 "4. 管理服务" -> "1. 启动服务" +``` + +### 从方式2卸载后重新安装 +```bash +# 重新安装和配置 +sudo s-hy2 +# 选择 "1. 安装 Hysteria2" +# 选择 "2. 一键快速配置" +``` + +### 从方式3卸载后重新安装 +```bash +# 重新安装脚本 +curl -fsSL https://raw.githubusercontent.com/sindricn/s-hy2/main/quick-install.sh | sudo bash + +# 运行脚本并配置 +sudo s-hy2 +# 选择 "1. 安装 Hysteria2" +# 选择 "2. 一键快速配置" +``` + +## 🛡️ 安全注意事项 + +### 配置文件安全 +- 配置文件包含认证密码和混淆密码 +- 方式1保留配置文件,注意保护敏感信息 +- 方式2和3会删除配置文件,确保数据安全 + +### 证书文件处理 +- 自签名证书文件包含私钥信息 +- ACME 证书会自动续期,卸载前考虑备份 +- 方式1保留证书,方式2和3删除证书 + +### 端口跳跃规则 +- 所有方式都会清理 iptables 规则 +- 确保清理不会影响其他服务 +- 如有自定义规则,请提前备份 + +## 📋 卸载验证清单 + +### 通用验证命令 +```bash +# 检查 Hysteria2 程序 +which hysteria + +# 检查服务状态 +sudo systemctl status hysteria-server + +# 检查端口监听 +sudo netstat -tulnp | grep :443 +``` + +### 方式1验证 (应该存在) +```bash +# 检查配置文件 +ls -la /etc/hysteria/ + +# 检查用户账户 +id hysteria + +# 检查管理脚本 +which s-hy2 +``` + +### 方式2验证 (应该存在) +```bash +# 检查管理脚本 +which s-hy2 + +# 检查配置文件 (应该不存在) +ls -la /etc/hysteria/ +``` + +### 方式3验证 (全部应该不存在) +```bash +# 检查管理脚本 +which s-hy2 + +# 检查安装目录 +ls -la /opt/s-hy2/ + +# 检查配置文件 +ls -la /etc/hysteria/ +``` + +## 🆘 故障恢复 + +### 误操作恢复 +如果误选了错误的卸载方式: + +1. **立即停止操作** - 如果还在确认阶段,选择取消 +2. **检查剩余文件** - 使用验证命令检查还有哪些文件 +3. **重新安装** - 根据剩余文件情况选择合适的重新安装方式 + +### 部分卸载失败 +如果卸载过程中出现错误: + +1. **查看错误信息** - 记录具体的错误提示 +2. **手动清理** - 根据错误信息手动清理相关文件 +3. **重新尝试** - 修复问题后重新尝试卸载 + +### 网络问题处理 +如果因网络问题导致官方卸载脚本失败: + +1. **检查网络连接** - 确保可以访问 get.hy2.sh +2. **手动删除文件** - 手动删除程序文件和服务文件 +3. **清理残留** - 使用脚本的其他步骤清理残留文件 + +## 📞 技术支持 + +如果在卸载过程中遇到问题: + +1. **查看日志** - 检查系统日志获取详细错误信息 +2. **参考文档** - 查看 UNINSTALL_GUIDE.md 获取详细说明 +3. **社区支持** - 在 GitHub 仓库提交 Issue + +--- + +**仓库地址:** https://github.com/sindricn/s-hy2 + +**一键安装命令:** +```bash +curl -fsSL https://raw.githubusercontent.com/sindricn/s-hy2/main/quick-install.sh | sudo bash +``` diff --git a/UNINSTALL_GUIDE.md b/UNINSTALL_GUIDE.md new file mode 100644 index 0000000..9bf2653 --- /dev/null +++ b/UNINSTALL_GUIDE.md @@ -0,0 +1,333 @@ +# 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 new file mode 100644 index 0000000..beecd5e --- /dev/null +++ b/USAGE.md @@ -0,0 +1,307 @@ +# 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 new file mode 100644 index 0000000..444adb1 --- /dev/null +++ b/demo.sh @@ -0,0 +1,529 @@ +#!/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 new file mode 100644 index 0000000..95a35dd --- /dev/null +++ b/hy2-manager.sh @@ -0,0 +1,527 @@ +#!/bin/bash + +# Hysteria2 配置管理脚本 +# 版本: 1.0.0 +# 作者: Hysteria2 Manager + +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' # No Color + +# 脚本目录 +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +SCRIPTS_DIR="$SCRIPT_DIR/scripts" +TEMPLATES_DIR="$SCRIPT_DIR/templates" + +# 配置文件路径 +CONFIG_PATH="/etc/hysteria/config.yaml" +SERVICE_NAME="hysteria-server.service" + +# 检查是否为 root 用户 +check_root() { + if [[ $EUID -ne 0 ]]; then + echo -e "${RED}错误: 此脚本需要 root 权限运行${NC}" + echo "请使用 sudo 运行此脚本" + exit 1 + fi +} + +# 打印标题 +print_header() { + clear + echo -e "${CYAN}================================================${NC}" + echo -e "${CYAN} Hysteria2 配置管理脚本${NC}" + echo -e "${CYAN}================================================${NC}" + echo "" +} + +# 打印菜单 +print_menu() { + echo -e "${YELLOW}请选择操作:${NC}" + echo "" + echo -e "${GREEN}1.${NC} 安装 Hysteria2" + 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 "${GREEN}9.${NC} 故障排除" + echo -e "${GREEN}10.${NC} 卸载服务" + echo -e "${GREEN}11.${NC} 关于脚本" + echo -e "${RED}0.${NC} 退出" + echo "" + echo -n -e "${BLUE}请输入选项 [0-11]: ${NC}" +} + +# 检查 Hysteria2 是否已安装 +check_hysteria_installed() { + if command -v hysteria &> /dev/null; then + return 0 + else + return 1 + fi +} + +# 检查服务状态 +check_service_status() { + if systemctl is-active --quiet $SERVICE_NAME; then + echo -e "${GREEN}运行中${NC}" + elif systemctl is-enabled --quiet $SERVICE_NAME; then + echo -e "${YELLOW}已启用但未运行${NC}" + else + echo -e "${RED}未启用${NC}" + fi +} + +# 显示当前状态 +show_status() { + echo "" + echo -e "${CYAN}当前状态:${NC}" + if check_hysteria_installed; then + echo -e "Hysteria2: ${GREEN}已安装${NC}" + echo -n "服务状态: " + check_service_status + if [[ -f "$CONFIG_PATH" ]]; then + echo -e "配置文件: ${GREEN}存在${NC}" + else + echo -e "配置文件: ${RED}不存在${NC}" + fi + else + echo -e "Hysteria2: ${RED}未安装${NC}" + fi + echo "" +} + +# 安装 Hysteria2 +install_hysteria() { + echo -e "${BLUE}正在安装 Hysteria2...${NC}" + if [[ -f "$SCRIPTS_DIR/install.sh" ]]; then + source "$SCRIPTS_DIR/install.sh" + install_hysteria_main + else + echo -e "${RED}错误: 安装脚本不存在${NC}" + read -p "按回车键继续..." + fi +} + +# 一键快速配置 +quick_config() { + echo -e "${BLUE}一键快速配置...${NC}" + if [[ -f "$SCRIPTS_DIR/config.sh" ]]; then + source "$SCRIPTS_DIR/config.sh" + quick_setup_hysteria + else + echo -e "${RED}错误: 配置脚本不存在${NC}" + read -p "按回车键继续..." + fi +} + +# 手动配置 +manual_config() { + echo -e "${BLUE}手动配置...${NC}" + if [[ -f "$SCRIPTS_DIR/config.sh" ]]; then + source "$SCRIPTS_DIR/config.sh" + generate_hysteria_config + else + echo -e "${RED}错误: 配置脚本不存在${NC}" + read -p "按回车键继续..." + fi +} + +# 管理服务 +manage_service() { + echo -e "${BLUE}服务管理...${NC}" + if [[ -f "$SCRIPTS_DIR/service.sh" ]]; then + source "$SCRIPTS_DIR/service.sh" + manage_hysteria_service + else + echo -e "${RED}错误: 服务管理脚本不存在${NC}" + fi +} + +# 查看日志 +view_logs() { + echo -e "${BLUE}查看服务日志...${NC}" + echo "" + journalctl --no-pager -e -u $SERVICE_NAME + echo "" + read -p "按回车键继续..." +} + +# 测试伪装域名 +test_domains() { + echo -e "${BLUE}测试伪装域名...${NC}" + if [[ -f "$SCRIPTS_DIR/domain-test.sh" ]]; then + source "$SCRIPTS_DIR/domain-test.sh" + test_masquerade_domains + else + echo -e "${RED}错误: 域名测试脚本不存在${NC}" + fi +} + +# 进阶配置 +advanced_config() { + echo -e "${BLUE}进阶配置...${NC}" + if [[ -f "$SCRIPTS_DIR/advanced.sh" ]]; then + source "$SCRIPTS_DIR/advanced.sh" + advanced_configuration + else + echo -e "${RED}错误: 进阶配置脚本不存在${NC}" + read -p "按回车键继续..." + fi +} + +# 节点信息 +show_node_info() { + echo -e "${BLUE}节点信息...${NC}" + if [[ -f "$SCRIPTS_DIR/node-info.sh" ]]; then + source "$SCRIPTS_DIR/node-info.sh" + display_node_info + else + echo -e "${RED}错误: 节点信息脚本不存在${NC}" + read -p "按回车键继续..." + fi +} + +# 故障排除 +troubleshoot() { + echo -e "${BLUE}故障排除...${NC}" + if [[ -f "$SCRIPTS_DIR/troubleshoot.sh" ]]; then + source "$SCRIPTS_DIR/troubleshoot.sh" + run_diagnostics + else + echo -e "${RED}错误: 故障排除脚本不存在${NC}" + read -p "按回车键继续..." + fi +} + +# 卸载服务 +uninstall_hysteria() { + echo -e "${YELLOW}Hysteria2 卸载选项:${NC}" + echo "" + echo -e "${GREEN}1.${NC} 仅卸载 Hysteria2 服务器 (保留配置文件)" + echo -e "${GREEN}2.${NC} 卸载 Hysteria2 服务器及配置文件" + echo -e "${GREEN}3.${NC} 卸载脚本及 Hysteria2 服务器和所有文件" + echo -e "${RED}0.${NC} 取消" + echo "" + echo -e "${CYAN}说明:${NC}" + echo "选项1: 只删除程序,保留配置和证书,便于重新安装" + echo "选项2: 删除程序和配置,但保留管理脚本" + echo "选项3: 完全删除所有相关文件,包括管理脚本" + echo "" + echo -n -e "${BLUE}请选择卸载方式 [0-3]: ${NC}" + read -r uninstall_choice + + case $uninstall_choice in + 1) + uninstall_server_only + ;; + 2) + uninstall_server_and_config + ;; + 3) + uninstall_everything + ;; + 0) + echo -e "${BLUE}取消卸载${NC}" + ;; + *) + echo -e "${RED}无效选择${NC}" + ;; + esac + + echo "" + read -p "按回车键继续..." +} + +# 方式1: 仅卸载 Hysteria2 服务器 +uninstall_server_only() { + echo -e "${BLUE}仅卸载 Hysteria2 服务器 (保留配置文件和证书)${NC}" + echo "" + + if ! check_hysteria_installed; then + echo -e "${YELLOW}Hysteria2 未安装${NC}" + return + fi + + echo -e "${YELLOW}此操作将:${NC}" + echo "✓ 删除 Hysteria2 程序文件" + echo "✓ 停止并删除系统服务" + echo "✗ 保留配置文件和证书" + echo "✗ 保留用户账户" + echo "✗ 保留管理脚本" + echo "" + echo -e "${YELLOW}确定要卸载 Hysteria2 服务器吗? [y/N]: ${NC}" + read -r confirm + if [[ ! $confirm =~ ^[Yy]$ ]]; then + echo -e "${BLUE}取消卸载${NC}" + return + fi + + # 使用官方卸载脚本 + echo -e "${BLUE}正在卸载 Hysteria2 服务器...${NC}" + if bash <(curl -fsSL https://get.hy2.sh/) --remove; then + echo "" + echo -e "${GREEN}Hysteria2 服务器卸载完成!${NC}" + echo "" + echo -e "${CYAN}已保留内容:${NC}" + echo "• 配置文件: /etc/hysteria/" + echo "• SSL 证书文件" + echo "• hysteria 用户账户" + echo "• 管理脚本: s-hy2" + echo "" + echo -e "${YELLOW}重新安装:${NC}" + echo "运行 's-hy2' 选择 '1. 安装 Hysteria2' 即可重新安装" + echo "" + else + echo -e "${RED}卸载失败${NC}" + fi +} + +# 方式2: 卸载 Hysteria2 服务器及配置文件 +uninstall_server_and_config() { + echo -e "${BLUE}卸载 Hysteria2 服务器及配置文件${NC}" + echo "" + + if ! check_hysteria_installed; then + echo -e "${YELLOW}Hysteria2 未安装${NC}" + return + fi + + echo -e "${YELLOW}此操作将:${NC}" + echo "✓ 删除 Hysteria2 程序文件" + echo "✓ 停止并删除系统服务" + echo "✓ 删除配置文件和证书" + echo "✓ 删除用户账户" + echo "✓ 清理端口跳跃规则" + echo "✗ 保留管理脚本" + echo "" + echo -e "${YELLOW}确定要卸载 Hysteria2 服务器及配置吗? [y/N]: ${NC}" + read -r confirm + if [[ ! $confirm =~ ^[Yy]$ ]]; then + echo -e "${BLUE}取消卸载${NC}" + return + fi + + # 1. 卸载程序 + echo -e "${BLUE}步骤 1/5: 卸载 Hysteria2 程序...${NC}" + bash <(curl -fsSL https://get.hy2.sh/) --remove + + # 2. 删除配置文件和证书 + echo -e "${BLUE}步骤 2/5: 删除配置文件和证书...${NC}" + if [[ -d "/etc/hysteria" ]]; then + rm -rf /etc/hysteria + echo "已删除 /etc/hysteria" + fi + + # 3. 删除用户账户 + echo -e "${BLUE}步骤 3/5: 删除用户账户...${NC}" + if id "hysteria" &>/dev/null; then + userdel -r hysteria 2>/dev/null || userdel hysteria 2>/dev/null + echo "已删除 hysteria 用户" + fi + + # 4. 清理 systemd 服务残留 + echo -e "${BLUE}步骤 4/5: 清理 systemd 服务残留...${NC}" + rm -f /etc/systemd/system/multi-user.target.wants/hysteria-server.service + rm -f /etc/systemd/system/multi-user.target.wants/hysteria-server@*.service + systemctl daemon-reload + echo "已清理 systemd 服务残留" + + # 5. 清理端口跳跃配置 + echo -e "${BLUE}步骤 5/5: 清理端口跳跃配置...${NC}" + # 注意:这里配置文件已经被删除,所以无法读取配置 + echo "端口跳跃规则可能需要手动清理" + + echo "" + echo -e "${GREEN}Hysteria2 服务器及配置文件卸载完成!${NC}" + echo "" + echo -e "${CYAN}已保留内容:${NC}" + echo "• 管理脚本: s-hy2" + echo "" + echo -e "${YELLOW}重新安装:${NC}" + echo "运行 's-hy2' 选择 '1. 安装 Hysteria2' 和 '2. 一键快速配置' 即可重新部署" + echo "" +} + +# 方式3: 卸载脚本及 Hysteria2 服务器和所有文件 +uninstall_everything() { + echo -e "${RED}卸载脚本及 Hysteria2 服务器和所有文件${NC}" + echo "" + + echo -e "${RED}警告: 此操作将删除所有相关文件,包括:${NC}" + echo "• Hysteria2 程序文件" + echo "• 配置文件和证书" + echo "• 用户账户" + echo "• 系统服务" + echo "• 管理脚本 (s-hy2)" + echo "• 端口跳跃规则" + echo "" + echo -e "${YELLOW}确定要完全卸载所有内容吗? 请输入 'YES' 确认: ${NC}" + read -r confirm + if [[ "$confirm" != "YES" ]]; then + echo -e "${BLUE}取消卸载${NC}" + return + fi + + # 1. 清理端口跳跃配置 (需要在删除配置文件前执行) + echo -e "${BLUE}步骤 1/8: 清理端口跳跃配置...${NC}" + if [[ -f "/etc/hysteria/port-hopping.conf" ]]; then + source "/etc/hysteria/port-hopping.conf" 2>/dev/null + if [[ -n "$INTERFACE" && -n "$START_PORT" && -n "$END_PORT" && -n "$TARGET_PORT" ]]; then + iptables -t nat -D PREROUTING -i "$INTERFACE" -p udp --dport "$START_PORT:$END_PORT" -j REDIRECT --to-ports "$TARGET_PORT" 2>/dev/null + echo "已清理端口跳跃 iptables 规则" + fi + else + echo "未找到端口跳跃配置" + fi + + # 2. 卸载 Hysteria2 程序 + echo -e "${BLUE}步骤 2/8: 卸载 Hysteria2 程序...${NC}" + if check_hysteria_installed; then + bash <(curl -fsSL https://get.hy2.sh/) --remove + else + echo "Hysteria2 未安装" + fi + + # 3. 删除配置文件和证书 + echo -e "${BLUE}步骤 3/8: 删除配置文件和证书...${NC}" + if [[ -d "/etc/hysteria" ]]; then + rm -rf /etc/hysteria + echo "已删除 /etc/hysteria" + fi + + # 4. 删除用户账户 + echo -e "${BLUE}步骤 4/8: 删除用户账户...${NC}" + if id "hysteria" &>/dev/null; then + userdel -r hysteria 2>/dev/null || userdel hysteria 2>/dev/null + echo "已删除 hysteria 用户" + fi + + # 5. 清理 systemd 服务残留 + echo -e "${BLUE}步骤 5/8: 清理 systemd 服务残留...${NC}" + rm -f /etc/systemd/system/multi-user.target.wants/hysteria-server.service + rm -f /etc/systemd/system/multi-user.target.wants/hysteria-server@*.service + systemctl daemon-reload + echo "已清理 systemd 服务残留" + + # 6. 清理 iptables 规则残留 + echo -e "${BLUE}步骤 6/8: 清理 iptables 规则残留...${NC}" + iptables -t nat -L PREROUTING --line-numbers | grep "REDIRECT.*443" | awk '{print $1}' | tac | while read line; do + iptables -t nat -D PREROUTING $line 2>/dev/null + done + echo "已清理可能的 iptables 规则残留" + + # 7. 删除管理脚本符号链接 + echo -e "${BLUE}步骤 7/8: 删除管理脚本符号链接...${NC}" + rm -f /usr/local/bin/hy2-manager + rm -f /usr/local/bin/s-hy2 + echo "已删除命令快捷方式" + + # 8. 删除管理脚本安装目录 + echo -e "${BLUE}步骤 8/8: 删除管理脚本安装目录...${NC}" + if [[ -d "/opt/s-hy2" ]]; then + rm -rf /opt/s-hy2 + echo "已删除 /opt/s-hy2" + fi + + # 删除桌面快捷方式 + if [[ -n "$SUDO_USER" ]]; then + rm -f "/home/$SUDO_USER/Desktop/S-Hy2-Manager.desktop" + echo "已删除桌面快捷方式" + fi + + echo "" + echo -e "${GREEN}所有文件卸载完成!${NC}" + echo -e "${BLUE}系统已完全清理,感谢使用 S-Hy2 管理脚本${NC}" + echo "" + echo -e "${YELLOW}重新安装:${NC}" + echo "curl -fsSL https://raw.githubusercontent.com/sindricn/s-hy2/main/quick-install.sh | sudo bash" + echo "" +} + +# 关于脚本 +about_script() { + echo -e "${CYAN}关于 Hysteria2 配置管理脚本${NC}" + echo "" + echo "版本: 1.0.0" + echo "功能: 简化 Hysteria2 的安装、配置和管理" + echo "" + echo "支持的功能:" + echo "- 一键安装/卸载" + echo "- 交互式配置生成" + echo "- 智能伪装域名选择" + echo "- 服务管理" + echo "- 进阶配置" + echo "" + read -p "按回车键继续..." +} + +# 主循环 +main() { + check_root + + while true; do + print_header + show_status + print_menu + + read -r choice + + case $choice in + 1) + install_hysteria + ;; + 2) + quick_config + ;; + 3) + manual_config + ;; + 4) + manage_service + ;; + 5) + view_logs + ;; + 6) + test_domains + ;; + 7) + advanced_config + ;; + 8) + show_node_info + ;; + 9) + troubleshoot + ;; + 10) + uninstall_hysteria + ;; + 11) + about_script + ;; + 0) + echo -e "${GREEN}感谢使用 Hysteria2 配置管理脚本!${NC}" + exit 0 + ;; + *) + echo -e "${RED}无效选项,请重新选择${NC}" + sleep 2 + ;; + esac + done +} + +# 运行主程序 +main "$@" diff --git a/install.sh b/install.sh new file mode 100644 index 0000000..6c7fb3b --- /dev/null +++ b/install.sh @@ -0,0 +1,216 @@ +#!/bin/bash + +# Hysteria2 配置管理脚本一键安装脚本 + +set -e + +# 颜色定义 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +CYAN='\033[0;36m' +NC='\033[0m' + +# 脚本信息 +SCRIPT_NAME="hy2-manager" +INSTALL_DIR="/opt/$SCRIPT_NAME" +BIN_DIR="/usr/local/bin" +REPO_URL="https://github.com/sindricn/s-hy2" + +# 检查是否为 root 用户 +check_root() { + if [[ $EUID -ne 0 ]]; then + echo -e "${RED}错误: 此脚本需要 root 权限运行${NC}" + echo "请使用 sudo 运行此脚本" + exit 1 + fi +} + +# 检测系统类型 +detect_system() { + if [[ -f /etc/os-release ]]; then + source /etc/os-release + OS=$ID + VER=$VERSION_ID + else + echo -e "${RED}无法检测系统类型${NC}" + exit 1 + fi + + echo -e "${BLUE}检测到系统: $PRETTY_NAME${NC}" +} + +# 安装依赖 +install_dependencies() { + echo -e "${BLUE}安装必要依赖...${NC}" + + case $OS in + ubuntu|debian) + apt update + apt install -y curl wget git openssl net-tools + ;; + centos|rhel|fedora) + if command -v dnf &> /dev/null; then + dnf install -y curl wget git openssl net-tools + else + yum install -y curl wget git openssl net-tools + fi + ;; + *) + echo -e "${YELLOW}未知系统,尝试通用安装...${NC}" + ;; + esac +} + +# 下载脚本 +download_script() { + echo -e "${BLUE}下载 Hysteria2 配置管理脚本...${NC}" + + # 创建安装目录 + mkdir -p "$INSTALL_DIR" + cd "$INSTALL_DIR" + + # 下载方式1: 从 GitHub 下载 + if command -v git &> /dev/null; then + echo -e "${BLUE}使用 git 克隆仓库...${NC}" + git clone "$REPO_URL" . 2>/dev/null || { + echo -e "${YELLOW}Git 克隆失败,尝试直接下载...${NC}" + download_direct + } + else + download_direct + fi + + # 设置执行权限 + chmod +x hy2-manager.sh + chmod +x scripts/*.sh +} + +# 直接下载文件 +download_direct() { + echo -e "${BLUE}直接下载脚本文件...${NC}" + + # 这里应该替换为实际的下载链接 + # 由于这是示例,我们创建一个本地复制的方式 + echo -e "${YELLOW}注意: 请手动将脚本文件复制到 $INSTALL_DIR${NC}" + echo "或者从以下地址下载:" + echo " 主脚本: $REPO_URL/raw/main/hy2-manager.sh" + echo " 脚本目录: $REPO_URL/tree/main/scripts" + echo " 模板目录: $REPO_URL/tree/main/templates" +} + +# 创建符号链接 +create_symlink() { + echo -e "${BLUE}创建命令行快捷方式...${NC}" + + # 创建符号链接到 /usr/local/bin + ln -sf "$INSTALL_DIR/hy2-manager.sh" "$BIN_DIR/hy2-manager" + ln -sf "$INSTALL_DIR/hy2-manager.sh" "$BIN_DIR/s-hy2" + + echo -e "${GREEN}已创建命令行快捷方式:${NC}" + echo " hy2-manager" + echo " s-hy2" +} + +# 创建桌面快捷方式 (可选) +create_desktop_shortcut() { + if [[ -d "/home" ]] && [[ -n "$SUDO_USER" ]]; then + local user_home="/home/$SUDO_USER" + local desktop_dir="$user_home/Desktop" + + if [[ -d "$desktop_dir" ]]; then + echo -e "${BLUE}创建桌面快捷方式...${NC}" + + cat > "$desktop_dir/Hysteria2-Manager.desktop" << EOF +[Desktop Entry] +Version=1.0 +Type=Application +Name=Hysteria2 Manager +Comment=Hysteria2 配置管理工具 +Exec=sudo $INSTALL_DIR/hy2-manager.sh +Icon=network-server +Terminal=true +Categories=Network;System; +EOF + + chmod +x "$desktop_dir/Hysteria2-Manager.desktop" + chown "$SUDO_USER:$SUDO_USER" "$desktop_dir/Hysteria2-Manager.desktop" + + echo -e "${GREEN}桌面快捷方式已创建${NC}" + fi + fi +} + +# 显示安装完成信息 +show_completion() { + echo "" + echo -e "${CYAN}================================================${NC}" + echo -e "${CYAN} Hysteria2 配置管理脚本安装完成!${NC}" + echo -e "${CYAN}================================================${NC}" + echo "" + echo -e "${GREEN}安装位置:${NC} $INSTALL_DIR" + echo -e "${GREEN}命令快捷方式:${NC} hy2-manager, s-hy2" + echo "" + echo -e "${YELLOW}使用方法:${NC}" + echo " 方式1: 快捷命令 (推荐)" + echo " sudo s-hy2" + echo "" + echo " 方式2: 完整命令" + echo " sudo hy2-manager" + echo "" + echo " 方式3: 运行完整路径" + echo " sudo $INSTALL_DIR/hy2-manager.sh" + echo "" + echo -e "${YELLOW}功能特性:${NC}" + echo " ✓ 一键安装/卸载 Hysteria2" + echo " ✓ 交互式配置生成" + echo " ✓ 智能伪装域名选择" + echo " ✓ 服务管理和监控" + echo " ✓ 进阶配置支持" + echo "" + echo -e "${BLUE}现在可以运行 'sudo s-hy2' 开始使用!${NC}" + echo "" +} + +# 卸载脚本 +uninstall() { + echo -e "${YELLOW}卸载 Hysteria2 配置管理脚本...${NC}" + + # 删除符号链接 + rm -f "$BIN_DIR/hy2-manager" + rm -f "$BIN_DIR/s-hy2" + + # 删除安装目录 + rm -rf "$INSTALL_DIR" + + # 删除桌面快捷方式 + if [[ -n "$SUDO_USER" ]]; then + rm -f "/home/$SUDO_USER/Desktop/Hysteria2-Manager.desktop" + fi + + echo -e "${GREEN}卸载完成${NC}" +} + +# 主函数 +main() { + # 检查参数 + if [[ "$1" == "--uninstall" ]]; then + uninstall + exit 0 + fi + + echo -e "${CYAN}Hysteria2 配置管理脚本安装程序${NC}" + echo "" + + check_root + detect_system + install_dependencies + download_script + create_symlink + create_desktop_shortcut + show_completion +} + +# 运行主函数 +main "$@" diff --git a/quick-install.sh b/quick-install.sh new file mode 100644 index 0000000..92dd8ce --- /dev/null +++ b/quick-install.sh @@ -0,0 +1,259 @@ +#!/bin/bash + +# Hysteria2 配置管理脚本一键安装脚本 +# 使用方法: curl -fsSL https://raw.githubusercontent.com/your-repo/s-hy2/main/quick-install.sh | sudo bash + +set -e + +# 颜色定义 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +CYAN='\033[0;36m' +NC='\033[0m' + +# 脚本信息 +SCRIPT_NAME="s-hy2" +INSTALL_DIR="/opt/$SCRIPT_NAME" +BIN_DIR="/usr/local/bin" +REPO_URL="https://github.com/sindricn/s-hy2" +RAW_URL="https://raw.githubusercontent.com/sindricn/s-hy2/main" + +# 打印标题 +print_header() { + clear + echo -e "${CYAN}================================================${NC}" + echo -e "${CYAN} Hysteria2 配置管理脚本一键安装${NC}" + echo -e "${CYAN}================================================${NC}" + echo "" +} + +# 检查是否为 root 用户 +check_root() { + if [[ $EUID -ne 0 ]]; then + echo -e "${RED}错误: 此脚本需要 root 权限运行${NC}" + echo "请使用 sudo 运行此脚本" + exit 1 + fi +} + +# 检测系统类型 +detect_system() { + if [[ -f /etc/os-release ]]; then + source /etc/os-release + OS=$ID + VER=$VERSION_ID + else + echo -e "${RED}无法检测系统类型${NC}" + exit 1 + fi + + echo -e "${BLUE}检测到系统: $PRETTY_NAME${NC}" +} + +# 安装依赖 +install_dependencies() { + echo -e "${BLUE}安装必要依赖...${NC}" + + case $OS in + ubuntu|debian) + apt update + apt install -y curl wget git openssl net-tools iptables + ;; + centos|rhel|fedora) + if command -v dnf &> /dev/null; then + dnf install -y curl wget git openssl net-tools iptables + else + yum install -y curl wget git openssl net-tools iptables + fi + ;; + *) + echo -e "${YELLOW}未知系统,尝试通用安装...${NC}" + ;; + esac +} + +# 下载脚本文件 +download_scripts() { + echo -e "${BLUE}下载 Hysteria2 配置管理脚本...${NC}" + + # 创建安装目录 + mkdir -p "$INSTALL_DIR" + mkdir -p "$INSTALL_DIR/scripts" + mkdir -p "$INSTALL_DIR/templates" + + cd "$INSTALL_DIR" + + # 下载主脚本 + echo "下载主脚本..." + curl -fsSL "$RAW_URL/hy2-manager.sh" -o hy2-manager.sh + + # 下载功能脚本 + echo "下载功能模块..." + curl -fsSL "$RAW_URL/scripts/install.sh" -o scripts/install.sh + curl -fsSL "$RAW_URL/scripts/config.sh" -o scripts/config.sh + curl -fsSL "$RAW_URL/scripts/service.sh" -o scripts/service.sh + curl -fsSL "$RAW_URL/scripts/domain-test.sh" -o scripts/domain-test.sh + curl -fsSL "$RAW_URL/scripts/advanced.sh" -o scripts/advanced.sh + curl -fsSL "$RAW_URL/scripts/node-info.sh" -o scripts/node-info.sh + + # 下载配置模板 + echo "下载配置模板..." + curl -fsSL "$RAW_URL/templates/acme-config.yaml" -o templates/acme-config.yaml + curl -fsSL "$RAW_URL/templates/self-cert-config.yaml" -o templates/self-cert-config.yaml + curl -fsSL "$RAW_URL/templates/advanced-config.yaml" -o templates/advanced-config.yaml + curl -fsSL "$RAW_URL/templates/client-config.yaml" -o templates/client-config.yaml + + # 设置执行权限 + chmod +x hy2-manager.sh + chmod +x scripts/*.sh + + echo -e "${GREEN}脚本文件下载完成${NC}" +} + +# 创建符号链接 +create_symlink() { + echo -e "${BLUE}创建命令行快捷方式...${NC}" + + # 创建符号链接到 /usr/local/bin + ln -sf "$INSTALL_DIR/hy2-manager.sh" "$BIN_DIR/hy2-manager" + ln -sf "$INSTALL_DIR/hy2-manager.sh" "$BIN_DIR/s-hy2" + + echo -e "${GREEN}已创建命令行快捷方式:${NC}" + echo " hy2-manager" + echo " s-hy2" +} + +# 创建桌面快捷方式 (可选) +create_desktop_shortcut() { + if [[ -d "/home" ]] && [[ -n "$SUDO_USER" ]]; then + local user_home="/home/$SUDO_USER" + local desktop_dir="$user_home/Desktop" + + if [[ -d "$desktop_dir" ]]; then + echo -e "${BLUE}创建桌面快捷方式...${NC}" + + cat > "$desktop_dir/S-Hy2-Manager.desktop" << EOF +[Desktop Entry] +Version=1.0 +Type=Application +Name=S-Hy2 Manager +Comment=Hysteria2 配置管理工具 +Exec=sudo $INSTALL_DIR/hy2-manager.sh +Icon=network-server +Terminal=true +Categories=Network;System; +EOF + + chmod +x "$desktop_dir/S-Hy2-Manager.desktop" + chown "$SUDO_USER:$SUDO_USER" "$desktop_dir/S-Hy2-Manager.desktop" + + echo -e "${GREEN}桌面快捷方式已创建${NC}" + fi + fi +} + +# 显示安装完成信息 +show_completion() { + echo "" + echo -e "${CYAN}================================================${NC}" + echo -e "${CYAN} Hysteria2 配置管理脚本安装完成!${NC}" + echo -e "${CYAN}================================================${NC}" + echo "" + echo -e "${GREEN}安装位置:${NC} $INSTALL_DIR" + echo -e "${GREEN}命令快捷方式:${NC} s-hy2, hy2-manager" + echo "" + echo -e "${YELLOW}使用方法:${NC}" + echo " 方式1: 快捷命令 (推荐)" + echo " sudo s-hy2" + echo "" + echo " 方式2: 完整命令" + echo " sudo hy2-manager" + echo "" + echo -e "${YELLOW}功能特性:${NC}" + echo " ✓ 一键安装/卸载 Hysteria2" + echo " ✓ 一键快速配置 (自签名证书+混淆+端口跳跃)" + echo " ✓ 手动配置 (ACME/自签名证书)" + echo " ✓ 智能伪装域名选择" + echo " ✓ 服务管理和监控" + echo " ✓ 节点信息和订阅链接生成" + echo " ✓ 进阶配置支持" + echo "" + echo -e "${YELLOW}快速开始:${NC}" + echo "1. 运行: sudo s-hy2" + echo "2. 选择 '1. 安装 Hysteria2'" + echo "3. 选择 '2. 一键快速配置'" + echo "4. 选择 '8. 节点信息' 查看连接信息" + echo "" + echo -e "${BLUE}现在可以运行 'sudo s-hy2' 开始使用!${NC}" + echo "" +} + +# 检查网络连接 +check_network() { + echo -e "${BLUE}检查网络连接...${NC}" + if ! curl -s --connect-timeout 10 https://www.google.com > /dev/null; then + echo -e "${RED}网络连接失败,请检查网络设置${NC}" + exit 1 + fi + echo -e "${GREEN}网络连接正常${NC}" +} + +# 卸载脚本 +uninstall() { + echo -e "${YELLOW}卸载 Hysteria2 配置管理脚本...${NC}" + + # 删除符号链接 + rm -f "$BIN_DIR/hy2-manager" + rm -f "$BIN_DIR/s-hy2" + + # 删除安装目录 + rm -rf "$INSTALL_DIR" + + # 删除桌面快捷方式 + if [[ -n "$SUDO_USER" ]]; then + rm -f "/home/$SUDO_USER/Desktop/S-Hy2-Manager.desktop" + fi + + echo -e "${GREEN}卸载完成${NC}" +} + +# 主函数 +main() { + # 检查参数 + if [[ "$1" == "--uninstall" ]]; then + uninstall + exit 0 + fi + + print_header + + echo -e "${YELLOW}即将安装 Hysteria2 配置管理脚本${NC}" + echo "" + echo -e "${BLUE}此脚本将会:${NC}" + echo "• 检测系统环境" + echo "• 安装必要依赖" + echo "• 下载脚本文件" + echo "• 创建快捷命令 's-hy2'" + echo "• 设置执行权限" + echo "" + echo -n -e "${YELLOW}是否继续安装? [Y/n]: ${NC}" + read -r confirm + if [[ $confirm =~ ^[Nn]$ ]]; then + echo -e "${BLUE}取消安装${NC}" + exit 0 + fi + + check_root + check_network + detect_system + install_dependencies + download_scripts + create_symlink + create_desktop_shortcut + show_completion +} + +# 运行主函数 +main "$@" diff --git a/scripts/advanced.sh b/scripts/advanced.sh new file mode 100644 index 0000000..b2fe3c0 --- /dev/null +++ b/scripts/advanced.sh @@ -0,0 +1,428 @@ +#!/bin/bash + +# Hysteria2 进阶配置脚本 + +# 修改监听端口 +modify_listen_port() { + echo -e "${BLUE}修改监听端口${NC}" + echo "" + + if [[ ! -f "$CONFIG_PATH" ]]; then + echo -e "${RED}配置文件不存在${NC}" + 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 + + if [[ "$new_port" =~ ^[0-9]+$ ]] && [[ $new_port -ge 1 ]] && [[ $new_port -le 65535 ]]; then + break + else + echo -e "${RED}端口格式无效,请输入 1-65535 之间的数字${NC}" + fi + done + + # 检查端口占用 + if netstat -tuln | grep -q ":$new_port "; then + echo -e "${YELLOW}警告: 端口 $new_port 已被占用${NC}" + echo -n -e "${BLUE}是否继续? [y/N]: ${NC}" + read -r continue_change + if [[ ! $continue_change =~ ^[Yy]$ ]]; then + echo -e "${BLUE}取消端口修改${NC}" + return + fi + fi + + # 备份配置文件 + cp "$CONFIG_PATH" "$CONFIG_PATH.backup.$(date +%Y%m%d_%H%M%S)" + + # 修改配置文件 + if grep -q "^listen:" "$CONFIG_PATH"; then + sed -i "s/^listen:.*/listen: :$new_port/" "$CONFIG_PATH" + else + sed -i "1i listen: :$new_port" "$CONFIG_PATH" + fi + + echo -e "${GREEN}端口已修改为: $new_port${NC}" + + # 询问是否重启服务 + if systemctl is-active --quiet $SERVICE_NAME; then + echo -n -e "${BLUE}是否重启服务以应用新端口? [y/N]: ${NC}" + read -r restart_service + if [[ $restart_service =~ ^[Yy]$ ]]; then + systemctl restart $SERVICE_NAME + echo -e "${GREEN}服务已重启${NC}" + fi + fi + + echo "" + echo -e "${YELLOW}注意: 请确保防火墙允许新端口通信${NC}" +} + +# 添加混淆配置 +add_obfuscation() { + echo -e "${BLUE}添加混淆配置${NC}" + echo "" + + if [[ ! -f "$CONFIG_PATH" ]]; then + echo -e "${RED}配置文件不存在${NC}" + return 1 + fi + + # 检查是否已有混淆配置 + if grep -q "^obfs:" "$CONFIG_PATH"; then + echo -e "${YELLOW}检测到现有混淆配置${NC}" + echo -n -e "${BLUE}是否覆盖现有配置? [y/N]: ${NC}" + read -r overwrite + if [[ ! $overwrite =~ ^[Yy]$ ]]; then + echo -e "${BLUE}取消混淆配置${NC}" + return + fi + fi + + # 输入混淆密码 + echo -n -e "${BLUE}请输入混淆密码 (留空自动生成): ${NC}" + read -r obfs_password + if [[ -z "$obfs_password" ]]; then + obfs_password=$(openssl rand -base64 16 | tr -d "=+/" | cut -c1-16) + echo -e "${GREEN}自动生成混淆密码: $obfs_password${NC}" + fi + + # 备份配置文件 + cp "$CONFIG_PATH" "$CONFIG_PATH.backup.$(date +%Y%m%d_%H%M%S)" + + # 删除现有混淆配置 + sed -i '/^obfs:/,/^[a-zA-Z]/{ /^[a-zA-Z]/!d; }' "$CONFIG_PATH" + sed -i '/^obfs:/d' "$CONFIG_PATH" + + # 添加混淆配置 + cat >> "$CONFIG_PATH" << EOF + +obfs: + type: salamander + salamander: + password: $obfs_password +EOF + + echo -e "${GREEN}混淆配置已添加${NC}" + echo -e "${YELLOW}混淆密码: $obfs_password${NC}" + + # 询问是否重启服务 + if systemctl is-active --quiet $SERVICE_NAME; then + echo -n -e "${BLUE}是否重启服务以应用混淆配置? [y/N]: ${NC}" + read -r restart_service + if [[ $restart_service =~ ^[Yy]$ ]]; then + systemctl restart $SERVICE_NAME + echo -e "${GREEN}服务已重启${NC}" + fi + fi + + echo "" + echo -e "${YELLOW}注意: 客户端也需要配置相同的混淆密码${NC}" +} + +# 移除混淆配置 +remove_obfuscation() { + echo -e "${BLUE}移除混淆配置${NC}" + echo "" + + if [[ ! -f "$CONFIG_PATH" ]]; then + echo -e "${RED}配置文件不存在${NC}" + return 1 + fi + + if ! grep -q "^obfs:" "$CONFIG_PATH"; then + echo -e "${YELLOW}未找到混淆配置${NC}" + return + fi + + echo -n -e "${BLUE}确定要移除混淆配置吗? [y/N]: ${NC}" + read -r confirm + if [[ ! $confirm =~ ^[Yy]$ ]]; then + echo -e "${BLUE}取消移除${NC}" + return + fi + + # 备份配置文件 + cp "$CONFIG_PATH" "$CONFIG_PATH.backup.$(date +%Y%m%d_%H%M%S)" + + # 删除混淆配置 + sed -i '/^obfs:/,/^[a-zA-Z]/{ /^[a-zA-Z]/!d; }' "$CONFIG_PATH" + sed -i '/^obfs:/d' "$CONFIG_PATH" + + echo -e "${GREEN}混淆配置已移除${NC}" + + # 询问是否重启服务 + if systemctl is-active --quiet $SERVICE_NAME; then + echo -n -e "${BLUE}是否重启服务以应用更改? [y/N]: ${NC}" + read -r restart_service + if [[ $restart_service =~ ^[Yy]$ ]]; then + systemctl restart $SERVICE_NAME + echo -e "${GREEN}服务已重启${NC}" + fi + fi +} + +# 配置端口跳跃 +configure_port_hopping() { + echo -e "${BLUE}配置端口跳跃${NC}" + echo "" + + # 获取网卡信息 + echo -e "${BLUE}检测网络接口...${NC}" + local interfaces=($(ip link show | grep -E "^[0-9]+:" | awk -F': ' '{print $2}' | grep -v lo)) + + if [[ ${#interfaces[@]} -eq 0 ]]; then + echo -e "${RED}未找到可用的网络接口${NC}" + return 1 + fi + + echo -e "${BLUE}可用的网络接口:${NC}" + for i in "${!interfaces[@]}"; do + echo "$((i+1)). ${interfaces[$i]}" + done + + echo -n -e "${BLUE}请选择网络接口 [1-${#interfaces[@]}]: ${NC}" + read -r interface_choice + + if [[ ! "$interface_choice" =~ ^[0-9]+$ ]] || [[ $interface_choice -lt 1 ]] || [[ $interface_choice -gt ${#interfaces[@]} ]]; then + echo -e "${RED}无效选择${NC}" + return 1 + fi + + local selected_interface="${interfaces[$((interface_choice-1))]}" + + # 输入端口范围 + echo -n -e "${BLUE}请输入起始端口 (建议 20000): ${NC}" + read -r start_port + echo -n -e "${BLUE}请输入结束端口 (建议 50000): ${NC}" + read -r end_port + + if [[ ! "$start_port" =~ ^[0-9]+$ ]] || [[ ! "$end_port" =~ ^[0-9]+$ ]] || [[ $start_port -ge $end_port ]]; then + echo -e "${RED}端口范围无效${NC}" + return 1 + fi + + # 获取目标端口 + local target_port=$(grep -E "^listen:" "$CONFIG_PATH" | awk '{print $2}' | sed 's/://') + if [[ -z "$target_port" ]]; then + target_port="443" + fi + + # 生成 iptables 规则 + local iptables_rule="iptables -t nat -A PREROUTING -i $selected_interface -p udp --dport $start_port:$end_port -j REDIRECT --to-ports $target_port" + + echo "" + echo -e "${YELLOW}将要执行的 iptables 规则:${NC}" + echo "$iptables_rule" + echo "" + echo -e "${YELLOW}配置信息:${NC}" + echo "网络接口: $selected_interface" + echo "端口范围: $start_port-$end_port" + echo "目标端口: $target_port" + echo "" + + echo -n -e "${BLUE}是否执行此规则? [y/N]: ${NC}" + read -r confirm + if [[ ! $confirm =~ ^[Yy]$ ]]; then + echo -e "${BLUE}取消端口跳跃配置${NC}" + return + fi + + # 执行 iptables 规则 + if eval "$iptables_rule"; then + echo -e "${GREEN}端口跳跃规则已添加${NC}" + + # 保存 iptables 规则 + echo -n -e "${BLUE}是否保存 iptables 规则以便重启后生效? [y/N]: ${NC}" + read -r save_rules + if [[ $save_rules =~ ^[Yy]$ ]]; then + if command -v iptables-save &> /dev/null; then + iptables-save > /etc/iptables/rules.v4 2>/dev/null || iptables-save > /etc/iptables.rules 2>/dev/null + echo -e "${GREEN}iptables 规则已保存${NC}" + else + echo -e "${YELLOW}无法自动保存规则,请手动保存${NC}" + fi + fi + + # 保存配置信息 + cat > "/etc/hysteria/port-hopping.conf" << EOF +# 端口跳跃配置 +# 生成时间: $(date) +INTERFACE=$selected_interface +START_PORT=$start_port +END_PORT=$end_port +TARGET_PORT=$target_port +IPTABLES_RULE="$iptables_rule" +EOF + + echo -e "${GREEN}端口跳跃配置已保存到 /etc/hysteria/port-hopping.conf${NC}" + + else + echo -e "${RED}端口跳跃规则添加失败${NC}" + fi +} + +# 移除端口跳跃 +remove_port_hopping() { + echo -e "${BLUE}移除端口跳跃配置${NC}" + echo "" + + if [[ ! -f "/etc/hysteria/port-hopping.conf" ]]; then + echo -e "${YELLOW}未找到端口跳跃配置文件${NC}" + echo -e "${BLUE}手动查找相关 iptables 规则...${NC}" + + local hysteria_rules=$(iptables -t nat -L PREROUTING --line-numbers | grep "REDIRECT.*hysteria\|REDIRECT.*443") + if [[ -n "$hysteria_rules" ]]; then + echo -e "${YELLOW}找到可能相关的规则:${NC}" + echo "$hysteria_rules" + else + echo -e "${YELLOW}未找到相关的 iptables 规则${NC}" + fi + return + fi + + # 读取配置 + source "/etc/hysteria/port-hopping.conf" + + echo -e "${YELLOW}当前端口跳跃配置:${NC}" + echo "网络接口: $INTERFACE" + echo "端口范围: $START_PORT-$END_PORT" + echo "目标端口: $TARGET_PORT" + echo "" + + echo -n -e "${BLUE}确定要移除端口跳跃配置吗? [y/N]: ${NC}" + read -r confirm + if [[ ! $confirm =~ ^[Yy]$ ]]; then + echo -e "${BLUE}取消移除${NC}" + return + fi + + # 删除 iptables 规则 + local remove_rule="iptables -t nat -D PREROUTING -i $INTERFACE -p udp --dport $START_PORT:$END_PORT -j REDIRECT --to-ports $TARGET_PORT" + + if eval "$remove_rule" 2>/dev/null; then + echo -e "${GREEN}端口跳跃规则已移除${NC}" + else + echo -e "${YELLOW}规则可能已经不存在或移除失败${NC}" + fi + + # 删除配置文件 + rm -f "/etc/hysteria/port-hopping.conf" + echo -e "${GREEN}端口跳跃配置文件已删除${NC}" +} + +# 查看当前进阶配置 +view_advanced_config() { + echo -e "${CYAN}当前进阶配置状态:${NC}" + echo "" + + if [[ ! -f "$CONFIG_PATH" ]]; then + echo -e "${RED}配置文件不存在${NC}" + return 1 + 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" + fi + + # 混淆配置 + if grep -q "^obfs:" "$CONFIG_PATH"; then + echo -e "${BLUE}混淆配置:${NC} ${GREEN}已启用${NC}" + local obfs_password=$(grep -A 3 "^obfs:" "$CONFIG_PATH" | grep "password:" | awk '{print $2}') + if [[ -n "$obfs_password" ]]; then + echo -e "${BLUE}混淆密码:${NC} $obfs_password" + fi + else + echo -e "${BLUE}混淆配置:${NC} ${RED}未启用${NC}" + fi + + # 端口跳跃 + if [[ -f "/etc/hysteria/port-hopping.conf" ]]; then + echo -e "${BLUE}端口跳跃:${NC} ${GREEN}已配置${NC}" + source "/etc/hysteria/port-hopping.conf" + echo -e "${BLUE}跳跃范围:${NC} $START_PORT-$END_PORT" + echo -e "${BLUE}网络接口:${NC} $INTERFACE" + else + echo -e "${BLUE}端口跳跃:${NC} ${RED}未配置${NC}" + fi + + echo "" +} + +# 主进阶配置函数 +advanced_configuration() { + while true; do + echo -e "${BLUE}Hysteria2 进阶配置${NC}" + echo "" + + view_advanced_config + + 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 "${GREEN}6.${NC} 查看配置状态" + echo -e "${RED}0.${NC} 返回主菜单" + echo "" + echo -n -e "${BLUE}请选择操作 [0-6]: ${NC}" + read -r choice + + case $choice in + 1) + modify_listen_port + echo "" + read -p "按回车键继续..." + ;; + 2) + add_obfuscation + echo "" + read -p "按回车键继续..." + ;; + 3) + remove_obfuscation + echo "" + read -p "按回车键继续..." + ;; + 4) + configure_port_hopping + echo "" + read -p "按回车键继续..." + ;; + 5) + remove_port_hopping + echo "" + read -p "按回车键继续..." + ;; + 6) + view_advanced_config + echo "" + read -p "按回车键继续..." + ;; + 0) + break + ;; + *) + echo -e "${RED}无效选项${NC}" + sleep 1 + ;; + esac + done +} diff --git a/scripts/config.sh b/scripts/config.sh new file mode 100644 index 0000000..80513cd --- /dev/null +++ b/scripts/config.sh @@ -0,0 +1,546 @@ +#!/bin/bash + +# Hysteria2 配置生成脚本 + +# 生成随机密码 +generate_password() { + local length=${1:-12} + openssl rand -base64 $length | tr -d "=+/" | cut -c1-$length +} + +# 验证域名格式 +validate_domain() { + local domain=$1 + if [[ $domain =~ ^[a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?)*$ ]]; then + return 0 + else + return 1 + fi +} + +# 验证邮箱格式 +validate_email() { + local email=$1 + if [[ $email =~ ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$ ]]; then + return 0 + else + return 1 + fi +} + +# ACME 配置模式 +configure_acme_mode() { + echo -e "${BLUE}ACME 自动证书配置${NC}" + echo "" + + # 输入域名 + while true; do + echo -n -e "${BLUE}请输入域名 (例: your.domain.com): ${NC}" + read -r domain + if validate_domain "$domain"; then + break + else + echo -e "${RED}域名格式无效,请重新输入${NC}" + fi + done + + # 输入邮箱 + while true; do + echo -n -e "${BLUE}请输入邮箱地址: ${NC}" + read -r email + if validate_email "$email"; then + break + else + echo -e "${RED}邮箱格式无效,请重新输入${NC}" + fi + done + + # 输入密码 + echo -n -e "${BLUE}请输入认证密码 (留空自动生成): ${NC}" + read -r password + if [[ -z "$password" ]]; then + password=$(generate_password 16) + echo -e "${GREEN}自动生成密码: $password${NC}" + fi + + # 选择伪装网站 + echo "" + echo -e "${BLUE}选择伪装网站:${NC}" + echo "1. 使用默认 (news.ycombinator.com)" + echo "2. 自动测试选择最优域名" + echo "3. 手动输入" + echo -n -e "${BLUE}请选择 [1-3]: ${NC}" + read -r masq_choice + + case $masq_choice in + 1) + masquerade_url="https://news.ycombinator.com/" + ;; + 2) + echo -e "${BLUE}正在测试域名延迟...${NC}" + if [[ -f "$SCRIPTS_DIR/domain-test.sh" ]]; then + source "$SCRIPTS_DIR/domain-test.sh" + masquerade_url=$(get_best_domain) + else + masquerade_url="https://news.ycombinator.com/" + fi + ;; + 3) + echo -n -e "${BLUE}请输入伪装网站URL: ${NC}" + read -r masquerade_url + ;; + *) + masquerade_url="https://news.ycombinator.com/" + ;; + esac + + # 生成配置文件 + cat > "$CONFIG_PATH" << EOF +# Hysteria2 配置文件 - ACME 模式 +# 生成时间: $(date) + +listen: :443 + +acme: + domains: + - $domain + email: $email + +auth: + type: password + password: $password + +masquerade: + type: proxy + proxy: + url: $masquerade_url + rewriteHost: true +EOF + + echo "" + echo -e "${GREEN}ACME 配置文件生成成功!${NC}" + echo -e "${YELLOW}域名: $domain${NC}" + echo -e "${YELLOW}邮箱: $email${NC}" + echo -e "${YELLOW}密码: $password${NC}" + echo -e "${YELLOW}伪装网站: $masquerade_url${NC}" +} + +# 自签名证书配置模式 +configure_self_cert_mode() { + echo -e "${BLUE}自签名证书配置${NC}" + echo "" + + # 选择伪装域名 + echo -e "${BLUE}选择伪装域名:${NC}" + echo "1. 使用默认 (cdn.jsdelivr.net)" + echo "2. 自动测试选择最优域名" + echo "3. 手动输入" + echo -n -e "${BLUE}请选择 [1-3]: ${NC}" + read -r domain_choice + + case $domain_choice in + 1) + cert_domain="cdn.jsdelivr.net" + masquerade_url="https://cdn.jsdelivr.net/" + ;; + 2) + echo -e "${BLUE}正在测试域名延迟...${NC}" + if [[ -f "$SCRIPTS_DIR/domain-test.sh" ]]; then + source "$SCRIPTS_DIR/domain-test.sh" + best_domain=$(get_best_domain_name) + cert_domain="$best_domain" + masquerade_url="https://$best_domain/" + else + cert_domain="cdn.jsdelivr.net" + masquerade_url="https://cdn.jsdelivr.net/" + fi + ;; + 3) + echo -n -e "${BLUE}请输入伪装域名: ${NC}" + read -r cert_domain + masquerade_url="https://$cert_domain/" + ;; + *) + cert_domain="cdn.jsdelivr.net" + masquerade_url="https://cdn.jsdelivr.net/" + ;; + esac + + # 输入密码 + echo -n -e "${BLUE}请输入认证密码 (留空自动生成): ${NC}" + read -r password + if [[ -z "$password" ]]; then + password=$(generate_password 16) + echo -e "${GREEN}自动生成密码: $password${NC}" + fi + + # 生成自签名证书 + echo -e "${BLUE}生成自签名证书...${NC}" + mkdir -p /etc/hysteria + + openssl req -x509 -nodes -newkey ec:<(openssl ecparam -name prime256v1) \ + -keyout /etc/hysteria/server.key \ + -out /etc/hysteria/server.crt \ + -subj "/CN=$cert_domain" \ + -days 3650 + + # 设置证书权限 + if id "hysteria" &>/dev/null; then + chown hysteria:hysteria /etc/hysteria/server.key + chown hysteria:hysteria /etc/hysteria/server.crt + fi + + # 生成配置文件 + cat > "$CONFIG_PATH" << EOF +# Hysteria2 配置文件 - 自签名证书模式 +# 生成时间: $(date) + +listen: :443 + +tls: + cert: /etc/hysteria/server.crt + key: /etc/hysteria/server.key + +auth: + type: password + password: $password + +masquerade: + type: proxy + proxy: + url: $masquerade_url + rewriteHost: true +EOF + + echo "" + echo -e "${GREEN}自签名证书配置生成成功!${NC}" + echo -e "${YELLOW}证书域名: $cert_domain${NC}" + echo -e "${YELLOW}密码: $password${NC}" + echo -e "${YELLOW}伪装网站: $masquerade_url${NC}" +} + +# 获取服务器公网IP +get_server_ip() { + local ip="" + + # 尝试多种方法获取公网IP + ip=$(curl -s --connect-timeout 5 ipv4.icanhazip.com 2>/dev/null) || \ + ip=$(curl -s --connect-timeout 5 ifconfig.me 2>/dev/null) || \ + ip=$(curl -s --connect-timeout 5 ip.sb 2>/dev/null) || \ + ip=$(curl -s --connect-timeout 5 checkip.amazonaws.com 2>/dev/null) + + if [[ -n "$ip" && "$ip" =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then + echo "$ip" + else + # 如果无法获取公网IP,尝试获取本地IP + ip=$(ip route get 8.8.8.8 2>/dev/null | grep -oP 'src \K\S+') + echo "${ip:-127.0.0.1}" + fi +} + +# 自动检测网卡 +get_network_interface() { + # 获取默认路由的网卡 + local interface=$(ip route | grep default | head -1 | awk '{print $5}') + + # 如果没有找到,尝试其他方法 + if [[ -z "$interface" ]]; then + interface=$(ip link show | grep -E "^[0-9]+:" | grep -v lo | head -1 | awk -F': ' '{print $2}') + fi + + # 最后的备选方案 + if [[ -z "$interface" ]]; then + interface="eth0" + fi + + echo "$interface" +} + +# 一键快速配置 +quick_setup_hysteria() { + echo -e "${CYAN}=== Hysteria2 一键快速配置 ===${NC}" + echo "" + + # 检查是否已安装 + if ! check_hysteria_installed; then + echo -e "${RED}错误: Hysteria2 未安装${NC}" + echo "请先安装 Hysteria2" + read -p "按回车键继续..." + return + fi + + # 检查现有配置 + if [[ -f "$CONFIG_PATH" ]]; then + echo -e "${YELLOW}检测到现有配置文件${NC}" + echo -n -e "${BLUE}是否覆盖现有配置? [y/N]: ${NC}" + read -r overwrite + if [[ ! $overwrite =~ ^[Yy]$ ]]; then + echo -e "${BLUE}取消配置生成${NC}" + read -p "按回车键继续..." + return + fi + + # 备份现有配置 + cp "$CONFIG_PATH" "$CONFIG_PATH.backup.$(date +%Y%m%d_%H%M%S)" + echo -e "${GREEN}已备份现有配置${NC}" + fi + + echo -e "${BLUE}正在执行一键快速配置...${NC}" + echo "" + + # 1. 获取服务器信息 + echo -e "${BLUE}步骤 1/7: 获取服务器信息...${NC}" + local server_ip=$(get_server_ip) + local network_interface=$(get_network_interface) + echo "服务器IP: $server_ip" + echo "网络接口: $network_interface" + + # 2. 测试最优伪装域名 + echo -e "${BLUE}步骤 2/7: 测试最优伪装域名...${NC}" + if [[ -f "$SCRIPTS_DIR/domain-test.sh" ]]; then + source "$SCRIPTS_DIR/domain-test.sh" + local best_domain=$(get_best_domain_name) + local masquerade_url="https://$best_domain/" + echo "最优伪装域名: $best_domain" + else + local best_domain="cdn.jsdelivr.net" + local masquerade_url="https://cdn.jsdelivr.net/" + echo "使用默认伪装域名: $best_domain" + fi + + # 3. 生成密码 + echo -e "${BLUE}步骤 3/7: 生成随机密码...${NC}" + local auth_password=$(generate_password 16) + local obfs_password=$(generate_password 16) + echo "认证密码: $auth_password" + echo "混淆密码: $obfs_password" + + # 4. 生成自签名证书 + echo -e "${BLUE}步骤 4/7: 生成自签名证书...${NC}" + mkdir -p /etc/hysteria + + openssl req -x509 -nodes -newkey ec:<(openssl ecparam -name prime256v1) \ + -keyout /etc/hysteria/server.key \ + -out /etc/hysteria/server.crt \ + -subj "/CN=$best_domain" \ + -days 3650 &>/dev/null + + # 设置证书权限 + if id "hysteria" &>/dev/null; then + chown hysteria:hysteria /etc/hysteria/server.key + chown hysteria:hysteria /etc/hysteria/server.crt + fi + echo "证书生成完成" + + # 5. 生成配置文件 + echo -e "${BLUE}步骤 5/7: 生成配置文件...${NC}" + cat > "$CONFIG_PATH" << EOF +# Hysteria2 配置文件 - 一键快速配置 +# 生成时间: $(date) +# 服务器IP: $server_ip + +listen: :443 + +tls: + cert: /etc/hysteria/server.crt + key: /etc/hysteria/server.key + +auth: + type: password + password: $auth_password + +masquerade: + type: proxy + proxy: + url: $masquerade_url + rewriteHost: true + +obfs: + type: salamander + salamander: + password: $obfs_password +EOF + + # 设置配置文件权限 + if id "hysteria" &>/dev/null; then + chown hysteria:hysteria "$CONFIG_PATH" + fi + chmod 600 "$CONFIG_PATH" + echo "配置文件生成完成" + + # 6. 配置端口跳跃 + echo -e "${BLUE}步骤 6/7: 配置端口跳跃...${NC}" + local start_port=20000 + local end_port=50000 + local target_port=443 + + # 生成 iptables 规则 + local iptables_rule="iptables -t nat -A PREROUTING -i $network_interface -p udp --dport $start_port:$end_port -j REDIRECT --to-ports $target_port" + + if eval "$iptables_rule" 2>/dev/null; then + echo "端口跳跃配置成功 ($start_port-$end_port -> $target_port)" + + # 保存端口跳跃配置 + cat > "/etc/hysteria/port-hopping.conf" << EOF +# 端口跳跃配置 - 一键快速配置 +# 生成时间: $(date) +INTERFACE=$network_interface +START_PORT=$start_port +END_PORT=$end_port +TARGET_PORT=$target_port +IPTABLES_RULE="$iptables_rule" +EOF + else + echo "端口跳跃配置失败,跳过此步骤" + fi + + # 7. 启动服务 + echo -e "${BLUE}步骤 7/7: 启动服务...${NC}" + + # 启用并启动服务 + systemctl enable hysteria-server.service &>/dev/null + if systemctl start hysteria-server.service; then + sleep 3 + if systemctl is-active --quiet hysteria-server.service; then + echo -e "${GREEN}服务启动成功!${NC}" + + # 显示配置信息 + echo "" + echo -e "${CYAN}=== 一键快速配置完成 ===${NC}" + echo "" + echo -e "${YELLOW}配置信息:${NC}" + echo "服务器地址: $server_ip:443" + echo "认证密码: $auth_password" + echo "混淆密码: $obfs_password" + echo "伪装域名: $best_domain" + echo "端口跳跃: $start_port-$end_port" + echo "" + + # 生成节点信息 + generate_node_info "$server_ip" "$auth_password" "$obfs_password" "$best_domain" "$start_port" "$end_port" + + else + echo -e "${RED}服务启动失败${NC}" + echo "请查看日志: journalctl -u hysteria-server.service" + fi + else + echo -e "${RED}服务启动失败${NC}" + fi + + echo "" + read -p "按回车键继续..." +} + +# 生成节点信息 +generate_node_info() { + local server_ip="$1" + local auth_password="$2" + local obfs_password="$3" + local sni_domain="$4" + local start_port="$5" + local end_port="$6" + + # 保存节点信息到文件 + local node_file="/etc/hysteria/node-info.txt" + + cat > "$node_file" << EOF +# Hysteria2 节点信息 +# 生成时间: $(date) + +服务器地址: $server_ip:443 +认证密码: $auth_password +混淆密码: $obfs_password +SNI域名: $sni_domain +端口跳跃: $start_port-$end_port +证书验证: 忽略 (自签名证书) + +# 客户端配置示例 +server: $server_ip:443 +auth: $auth_password +tls: + sni: $sni_domain + insecure: true +obfs: + type: salamander + salamander: + password: $obfs_password +socks5: + listen: 127.0.0.1:1080 +http: + listen: 127.0.0.1:8080 + +# 节点链接 (Hysteria2://) +hysteria2://$auth_password@$server_ip:443?sni=$sni_domain&insecure=1&obfs=salamander&obfs-password=$obfs_password#Hysteria2-QuickSetup + +# 订阅链接 (Base64编码) +$(echo "hysteria2://$auth_password@$server_ip:443?sni=$sni_domain&insecure=1&obfs=salamander&obfs-password=$obfs_password#Hysteria2-QuickSetup" | base64 -w 0) +EOF + + echo -e "${GREEN}节点信息已保存到: $node_file${NC}" +} + +# 主配置生成函数 +generate_hysteria_config() { + # 检查是否已安装 + if ! check_hysteria_installed; then + echo -e "${RED}错误: Hysteria2 未安装${NC}" + echo "请先安装 Hysteria2" + read -p "按回车键继续..." + return + fi + + # 检查现有配置 + if [[ -f "$CONFIG_PATH" ]]; then + echo -e "${YELLOW}检测到现有配置文件${NC}" + echo -n -e "${BLUE}是否覆盖现有配置? [y/N]: ${NC}" + read -r overwrite + if [[ ! $overwrite =~ ^[Yy]$ ]]; then + echo -e "${BLUE}取消配置生成${NC}" + read -p "按回车键继续..." + return + fi + + # 备份现有配置 + cp "$CONFIG_PATH" "$CONFIG_PATH.backup.$(date +%Y%m%d_%H%M%S)" + echo -e "${GREEN}已备份现有配置${NC}" + fi + + echo "" + echo -e "${BLUE}选择配置模式:${NC}" + echo "" + echo -e "${GREEN}1.${NC} ACME 自动证书 (推荐,需要域名)" + echo -e "${GREEN}2.${NC} 自签名证书 (快速部署,无需域名)" + echo "" + echo -n -e "${BLUE}请选择模式 [1-2]: ${NC}" + read -r config_mode + + case $config_mode in + 1) + configure_acme_mode + ;; + 2) + configure_self_cert_mode + ;; + *) + echo -e "${RED}无效选择${NC}" + read -p "按回车键继续..." + return + ;; + esac + + # 设置配置文件权限 + if id "hysteria" &>/dev/null; then + chown hysteria:hysteria "$CONFIG_PATH" + fi + chmod 600 "$CONFIG_PATH" + + echo "" + echo -e "${GREEN}配置文件已保存到: $CONFIG_PATH${NC}" + echo "" + echo -e "${YELLOW}下一步建议:${NC}" + echo "1. 启动服务: systemctl enable --now hysteria-server.service" + echo "2. 查看状态: systemctl status hysteria-server.service" + echo "3. 查看日志: journalctl -u hysteria-server.service" + echo "" + read -p "按回车键继续..." +} diff --git a/scripts/domain-test.sh b/scripts/domain-test.sh new file mode 100644 index 0000000..abaa339 --- /dev/null +++ b/scripts/domain-test.sh @@ -0,0 +1,304 @@ +#!/bin/bash + +# 伪装域名测试脚本 + +# 预定义的域名列表 +DOMAINS=( + "www.cloudflare.com" + "www.apple.com" + "www.microsoft.com" + "www.bing.com" + "www.google.com" + "developer.apple.com" + "www.gstatic.com" + "fonts.gstatic.com" + "fonts.googleapis.com" + "res-1.cdn.office.net" + "res.public.onecdn.static.microsoft" + "static.cloud.coveo.com" + "aws.amazon.com" + "www.aws.com" + "cloudfront.net" + "d1.awsstatic.com" + "cdn.jsdelivr.net" + "cdn.jsdelivr.org" + "polyfill-fastly.io" + "beacon.gtv-pub.com" + "s7mbrstream.scene7.com" + "cdn.bizibly.com" + "www.sony.com" + "www.nytimes.com" + "www.w3.org" + "www.wikipedia.org" + "ajax.cloudflare.com" + "www.mozilla.org" + "www.intel.com" + "api.snapchat.com" + "images.unsplash.com" + "edge-mqtt.facebook.com" + "video.xx.fbcdn.net" + "gstatic.cn" +) + +# 测试单个域名延迟 +test_domain_latency() { + local domain=$1 + local timeout=${2:-3} + + local start_time=$(date +%s%3N) + + if timeout $timeout openssl s_client -connect "$domain:443" -servername "$domain" /dev/null; then + local end_time=$(date +%s%3N) + local latency=$((end_time - start_time)) + echo "$latency $domain" + return 0 + else + return 1 + fi +} + +# 测试所有域名并排序 +test_all_domains() { + local results=() + local total=${#DOMAINS[@]} + local current=0 + + echo -e "${BLUE}正在测试 $total 个域名的延迟...${NC}" + echo "" + + for domain in "${DOMAINS[@]}"; do + current=$((current + 1)) + printf "\r${BLUE}进度: $current/$total - 测试 $domain${NC}" + + if result=$(test_domain_latency "$domain" 3); then + results+=("$result") + fi + done + + echo "" + echo "" + + if [[ ${#results[@]} -eq 0 ]]; then + echo -e "${RED}所有域名测试失败,请检查网络连接${NC}" + return 1 + fi + + # 排序结果 + printf '%s\n' "${results[@]}" | sort -n +} + +# 显示测试结果 +show_test_results() { + echo -e "${CYAN}域名延迟测试结果 (前10名):${NC}" + echo "" + printf "%-5s %-30s %s\n" "排名" "域名" "延迟(ms)" + echo "----------------------------------------" + + local rank=1 + test_all_domains | head -n 10 | while read -r latency domain; do + printf "%-5d %-30s %d ms\n" "$rank" "$domain" "$latency" + rank=$((rank + 1)) + done +} + +# 获取最优域名 (返回完整URL) +get_best_domain() { + local best_result=$(test_all_domains | head -n 1) + if [[ -n "$best_result" ]]; then + local domain=$(echo "$best_result" | awk '{print $2}') + echo "https://$domain/" + else + echo "https://news.ycombinator.com/" + fi +} + +# 获取最优域名名称 +get_best_domain_name() { + local best_result=$(test_all_domains | head -n 1) + if [[ -n "$best_result" ]]; then + echo "$best_result" | awk '{print $2}' + else + echo "cdn.jsdelivr.net" + fi +} + +# 交互式域名选择 +interactive_domain_selection() { + echo -e "${BLUE}域名延迟测试和选择${NC}" + echo "" + + # 显示测试结果 + local results=$(test_all_domains | head -n 10) + + if [[ -z "$results" ]]; then + echo -e "${RED}域名测试失败,使用默认域名${NC}" + echo "默认域名: news.ycombinator.com" + read -p "按回车键继续..." + return + fi + + echo -e "${CYAN}可用域名列表:${NC}" + echo "" + printf "%-5s %-30s %s\n" "编号" "域名" "延迟(ms)" + echo "----------------------------------------" + + local domains_array=() + local index=1 + + while read -r latency domain; do + printf "%-5d %-30s %d ms\n" "$index" "$domain" "$latency" + domains_array+=("$domain") + index=$((index + 1)) + done <<< "$results" + + echo "" + echo -e "${GREEN}0.${NC} 使用默认域名 (news.ycombinator.com)" + echo "" + echo -n -e "${BLUE}请选择域名编号 [0-${#domains_array[@]}]: ${NC}" + read -r choice + + if [[ "$choice" =~ ^[0-9]+$ ]] && [[ $choice -ge 1 ]] && [[ $choice -le ${#domains_array[@]} ]]; then + local selected_domain="${domains_array[$((choice-1))]}" + echo -e "${GREEN}已选择: $selected_domain${NC}" + + # 更新配置文件中的伪装域名 + if [[ -f "$CONFIG_PATH" ]]; then + echo -n -e "${BLUE}是否更新当前配置文件中的伪装域名? [y/N]: ${NC}" + read -r update_config + if [[ $update_config =~ ^[Yy]$ ]]; then + update_masquerade_domain "$selected_domain" + fi + fi + else + echo -e "${BLUE}使用默认域名: news.ycombinator.com${NC}" + fi + + echo "" + read -p "按回车键继续..." +} + +# 更新配置文件中的伪装域名 +update_masquerade_domain() { + local new_domain=$1 + local new_url="https://$new_domain/" + + if [[ -f "$CONFIG_PATH" ]]; then + # 备份配置文件 + cp "$CONFIG_PATH" "$CONFIG_PATH.backup.$(date +%Y%m%d_%H%M%S)" + + # 更新伪装URL + sed -i "s|url: https://.*|url: $new_url|g" "$CONFIG_PATH" + + echo -e "${GREEN}配置文件已更新${NC}" + echo -e "${YELLOW}新的伪装域名: $new_url${NC}" + + # 询问是否重启服务 + if systemctl is-active --quiet hysteria-server.service; then + echo -n -e "${BLUE}是否重启服务以应用新配置? [y/N]: ${NC}" + read -r restart_service + if [[ $restart_service =~ ^[Yy]$ ]]; then + systemctl restart hysteria-server.service + echo -e "${GREEN}服务已重启${NC}" + fi + fi + else + echo -e "${RED}配置文件不存在${NC}" + fi +} + +# 批量测试自定义域名 +test_custom_domains() { + echo -e "${BLUE}测试自定义域名${NC}" + echo "" + echo "请输入要测试的域名,每行一个,输入空行结束:" + + local custom_domains=() + while true; do + echo -n "域名: " + read -r domain + if [[ -z "$domain" ]]; then + break + fi + custom_domains+=("$domain") + done + + if [[ ${#custom_domains[@]} -eq 0 ]]; then + echo -e "${YELLOW}未输入任何域名${NC}" + read -p "按回车键继续..." + return + fi + + echo "" + echo -e "${BLUE}测试结果:${NC}" + echo "" + printf "%-30s %s\n" "域名" "延迟(ms)" + echo "----------------------------------------" + + local results=() + for domain in "${custom_domains[@]}"; do + if result=$(test_domain_latency "$domain" 5); then + local latency=$(echo "$result" | awk '{print $1}') + printf "%-30s %d ms\n" "$domain" "$latency" + results+=("$result") + else + printf "%-30s %s\n" "$domain" "超时/失败" + fi + done + + if [[ ${#results[@]} -gt 0 ]]; then + echo "" + local best=$(printf '%s\n' "${results[@]}" | sort -n | head -n 1) + local best_domain=$(echo "$best" | awk '{print $2}') + local best_latency=$(echo "$best" | awk '{print $1}') + echo -e "${GREEN}最优域名: $best_domain (${best_latency}ms)${NC}" + fi + + echo "" + read -p "按回车键继续..." +} + +# 主测试函数 +test_masquerade_domains() { + while true; do + 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 "${RED}0.${NC} 返回主菜单" + echo "" + echo -n -e "${BLUE}请选择操作 [0-4]: ${NC}" + read -r choice + + case $choice in + 1) + show_test_results + echo "" + read -p "按回车键继续..." + ;; + 2) + interactive_domain_selection + ;; + 3) + test_custom_domains + ;; + 4) + echo -e "${BLUE}正在获取最优域名...${NC}" + best_domain=$(get_best_domain_name) + best_url=$(get_best_domain) + echo -e "${GREEN}最优域名: $best_domain${NC}" + echo -e "${GREEN}完整URL: $best_url${NC}" + echo "" + read -p "按回车键继续..." + ;; + 0) + break + ;; + *) + echo -e "${RED}无效选项${NC}" + sleep 1 + ;; + esac + done +} diff --git a/scripts/install.sh b/scripts/install.sh new file mode 100644 index 0000000..e6ea228 --- /dev/null +++ b/scripts/install.sh @@ -0,0 +1,200 @@ +#!/bin/bash + +# Hysteria2 安装脚本 + +# 安装 Hysteria2 +install_hysteria2() { + echo -e "${BLUE}开始安装 Hysteria2...${NC}" + echo "" + + # 检查是否已安装 + if check_hysteria_installed; then + echo -e "${YELLOW}Hysteria2 已经安装${NC}" + echo -n -e "${BLUE}是否重新安装? [y/N]: ${NC}" + read -r reinstall + if [[ ! $reinstall =~ ^[Yy]$ ]]; then + echo -e "${BLUE}取消安装${NC}" + read -p "按回车键继续..." + return + fi + fi + + # 检查网络连接 + echo -e "${BLUE}检查网络连接...${NC}" + if ! ping -c 1 google.com &> /dev/null; then + echo -e "${RED}网络连接失败,请检查网络设置${NC}" + read -p "按回车键继续..." + return + fi + + # 更新系统包 + echo -e "${BLUE}更新系统包...${NC}" + if command -v apt &> /dev/null; then + apt update + elif command -v yum &> /dev/null; then + yum update -y + elif command -v dnf &> /dev/null; then + dnf update -y + fi + + # 安装必要依赖 + echo -e "${BLUE}安装必要依赖...${NC}" + if command -v apt &> /dev/null; then + apt install -y curl wget openssl + elif command -v yum &> /dev/null; then + yum install -y curl wget openssl + elif command -v dnf &> /dev/null; then + dnf install -y curl wget openssl + fi + + # 下载并安装 Hysteria2 + echo -e "${BLUE}下载并安装 Hysteria2...${NC}" + if bash <(curl -fsSL https://get.hy2.sh/); then + echo -e "${GREEN}Hysteria2 安装成功!${NC}" + + # 创建配置目录 + mkdir -p /etc/hysteria + + # 设置权限 + if id "hysteria" &>/dev/null; then + chown hysteria:hysteria /etc/hysteria + fi + + echo "" + echo -e "${GREEN}安装完成!${NC}" + echo -e "${YELLOW}下一步: 生成配置文件${NC}" + + else + echo -e "${RED}Hysteria2 安装失败${NC}" + echo "请检查网络连接或手动安装" + fi + + echo "" + read -p "按回车键继续..." +} + +# 检查系统信息 +check_system_info() { + echo -e "${CYAN}系统信息:${NC}" + echo "操作系统: $(uname -s)" + echo "架构: $(uname -m)" + echo "内核版本: $(uname -r)" + + if [[ -f /etc/os-release ]]; then + source /etc/os-release + echo "发行版: $PRETTY_NAME" + fi + + echo "" +} + +# 检查端口占用 +check_port_usage() { + local port=${1:-443} + echo -e "${BLUE}检查端口 $port 占用情况...${NC}" + + if netstat -tuln | grep -q ":$port "; then + echo -e "${YELLOW}警告: 端口 $port 已被占用${NC}" + echo "占用进程:" + netstat -tulnp | grep ":$port " + echo "" + echo -e "${YELLOW}建议在配置时使用其他端口${NC}" + else + echo -e "${GREEN}端口 $port 可用${NC}" + fi + echo "" +} + +# 预安装检查 +pre_install_check() { + echo -e "${BLUE}执行预安装检查...${NC}" + echo "" + + check_system_info + check_port_usage 443 + + # 检查防火墙状态 + echo -e "${BLUE}检查防火墙状态...${NC}" + if command -v ufw &> /dev/null; then + ufw_status=$(ufw status | head -1) + echo "UFW: $ufw_status" + elif command -v firewall-cmd &> /dev/null; then + if firewall-cmd --state &> /dev/null; then + echo "Firewalld: 运行中" + else + echo "Firewalld: 未运行" + fi + elif command -v iptables &> /dev/null; then + echo "iptables: 已安装" + else + echo "防火墙: 未检测到" + fi + + echo "" + echo -e "${YELLOW}注意事项:${NC}" + echo "1. 确保服务器可以访问互联网" + echo "2. 如果使用 ACME 模式,需要域名解析到此服务器" + echo "3. 确保防火墙允许相应端口通信" + echo "4. 建议在安装前备份重要数据" + echo "" + + echo -n -e "${BLUE}是否继续安装? [Y/n]: ${NC}" + read -r continue_install + if [[ $continue_install =~ ^[Nn]$ ]]; then + echo -e "${BLUE}取消安装${NC}" + read -p "按回车键继续..." + return 1 + fi + + return 0 +} + +# 卸载 Hysteria2 (仅程序) +uninstall_hysteria_program() { + echo -e "${BLUE}卸载 Hysteria2 程序 (保留配置文件)...${NC}" + echo "" + + if ! check_hysteria_installed; then + echo -e "${YELLOW}Hysteria2 未安装${NC}" + return + fi + + echo -e "${YELLOW}此操作将卸载 Hysteria2 程序,但保留配置文件和证书${NC}" + echo -n -e "${BLUE}确定要继续吗? [y/N]: ${NC}" + read -r confirm + if [[ ! $confirm =~ ^[Yy]$ ]]; then + echo -e "${BLUE}取消卸载${NC}" + return + fi + + # 使用官方卸载脚本 + if bash <(curl -fsSL https://get.hy2.sh/) --remove; then + echo "" + echo -e "${GREEN}Hysteria2 程序卸载完成!${NC}" + echo "" + echo -e "${CYAN}配置文件和证书已保留在 /etc/hysteria${NC}" + echo "" + echo -e "${YELLOW}如需完全清理,请手动执行以下命令:${NC}" + echo "" + echo -e "${BLUE}删除配置文件和证书:${NC}" + echo " rm -rf /etc/hysteria" + echo "" + echo -e "${BLUE}删除用户账户:${NC}" + echo " userdel -r hysteria" + echo "" + echo -e "${BLUE}清理 systemd 服务残留:${NC}" + echo " rm -f /etc/systemd/system/multi-user.target.wants/hysteria-server.service" + echo " rm -f /etc/systemd/system/multi-user.target.wants/hysteria-server@*.service" + echo " systemctl daemon-reload" + echo "" + else + echo -e "${RED}卸载失败${NC}" + fi +} + +# 主安装函数 +install_hysteria_main() { + if pre_install_check; then + install_hysteria2 + fi +} diff --git a/scripts/node-info.sh b/scripts/node-info.sh new file mode 100644 index 0000000..806599a --- /dev/null +++ b/scripts/node-info.sh @@ -0,0 +1,343 @@ +#!/bin/bash + +# Hysteria2 节点信息显示脚本 + +# 从配置文件解析信息 +parse_config_info() { + local config_file="$CONFIG_PATH" + local node_info=() + + if [[ ! -f "$config_file" ]]; then + echo "配置文件不存在" + return 1 + fi + + # 解析监听端口 + local port=$(grep -E "^listen:" "$config_file" | awk '{print $2}' | sed 's/://') + if [[ -z "$port" ]]; then + port="443" + fi + + # 解析认证密码 + local auth_password=$(grep -A 2 "^auth:" "$config_file" | grep "password:" | awk '{print $2}') + + # 解析混淆密码 + local obfs_password="" + if grep -q "^obfs:" "$config_file"; then + obfs_password=$(grep -A 3 "^obfs:" "$config_file" | grep "password:" | awk '{print $2}') + fi + + # 解析伪装域名 + local masquerade_url=$(grep -A 3 "masquerade:" "$config_file" | grep "url:" | awk '{print $2}') + local sni_domain="" + if [[ -n "$masquerade_url" ]]; then + sni_domain=$(echo "$masquerade_url" | sed 's|https\?://||' | sed 's|/.*||') + fi + + # 检查证书类型 + local cert_type="ACME" + local insecure="false" + if grep -q "^tls:" "$config_file"; then + cert_type="自签名" + insecure="true" + fi + + echo "$port|$auth_password|$obfs_password|$sni_domain|$cert_type|$insecure" +} + +# 获取服务器IP +get_current_server_ip() { + local ip="" + + # 尝试多种方法获取公网IP + ip=$(curl -s --connect-timeout 5 ipv4.icanhazip.com 2>/dev/null) || \ + ip=$(curl -s --connect-timeout 5 ifconfig.me 2>/dev/null) || \ + ip=$(curl -s --connect-timeout 5 ip.sb 2>/dev/null) || \ + ip=$(curl -s --connect-timeout 5 checkip.amazonaws.com 2>/dev/null) + + if [[ -n "$ip" && "$ip" =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then + echo "$ip" + else + # 如果无法获取公网IP,尝试获取本地IP + ip=$(ip route get 8.8.8.8 2>/dev/null | grep -oP 'src \K\S+') + echo "${ip:-127.0.0.1}" + fi +} + +# 获取端口跳跃信息 +get_port_hopping_info() { + if [[ -f "/etc/hysteria/port-hopping.conf" ]]; then + source "/etc/hysteria/port-hopping.conf" + echo "$START_PORT-$END_PORT" + else + echo "未配置" + fi +} + +# 生成节点链接 +generate_node_link() { + local server_ip="$1" + local port="$2" + local auth_password="$3" + local obfs_password="$4" + local sni_domain="$5" + local insecure="$6" + + local link="hysteria2://$auth_password@$server_ip:$port" + local params="" + + if [[ -n "$sni_domain" ]]; then + params="${params}&sni=$sni_domain" + fi + + if [[ "$insecure" == "true" ]]; then + params="${params}&insecure=1" + fi + + if [[ -n "$obfs_password" ]]; then + params="${params}&obfs=salamander&obfs-password=$obfs_password" + fi + + # 移除开头的& + params="${params#&}" + + if [[ -n "$params" ]]; then + link="${link}?${params}" + fi + + link="${link}#Hysteria2-Server" + + echo "$link" +} + +# 生成订阅链接 +generate_subscription_link() { + local node_link="$1" + echo "$node_link" | base64 -w 0 +} + +# 生成客户端配置 +generate_client_config() { + local server_ip="$1" + local port="$2" + local auth_password="$3" + local obfs_password="$4" + local sni_domain="$5" + local insecure="$6" + + cat << EOF +# Hysteria2 客户端配置 +server: $server_ip:$port +auth: $auth_password + +tls: + sni: $sni_domain + insecure: $insecure + +EOF + + if [[ -n "$obfs_password" ]]; then + cat << EOF +obfs: + type: salamander + salamander: + password: $obfs_password + +EOF + fi + + cat << EOF +socks5: + listen: 127.0.0.1:1080 + +http: + listen: 127.0.0.1:8080 + +bandwidth: + up: 100 mbps + down: 100 mbps +EOF +} + +# 显示节点信息 +display_node_info() { + echo -e "${BLUE}Hysteria2 节点信息${NC}" + echo "" + + # 检查服务状态 + if ! systemctl is-active --quiet hysteria-server.service; then + echo -e "${RED}警告: Hysteria2 服务未运行${NC}" + echo "请先启动服务" + echo "" + read -p "按回车键继续..." + return + fi + + # 检查配置文件 + if [[ ! -f "$CONFIG_PATH" ]]; then + echo -e "${RED}错误: 配置文件不存在${NC}" + read -p "按回车键继续..." + return + fi + + # 获取服务器信息 + local server_ip=$(get_current_server_ip) + local config_info=$(parse_config_info) + + if [[ -z "$config_info" ]]; then + echo -e "${RED}错误: 无法解析配置文件${NC}" + read -p "按回车键继续..." + return + fi + + # 解析配置信息 + IFS='|' read -r port auth_password obfs_password sni_domain cert_type insecure <<< "$config_info" + + # 获取端口跳跃信息 + local port_hopping=$(get_port_hopping_info) + + # 显示基本信息 + echo -e "${CYAN}=== 服务器信息 ===${NC}" + echo -e "${YELLOW}服务器地址:${NC} $server_ip:$port" + echo -e "${YELLOW}认证密码:${NC} $auth_password" + if [[ -n "$obfs_password" ]]; then + echo -e "${YELLOW}混淆密码:${NC} $obfs_password" + else + echo -e "${YELLOW}混淆配置:${NC} 未启用" + fi + echo -e "${YELLOW}SNI域名:${NC} ${sni_domain:-未设置}" + echo -e "${YELLOW}证书类型:${NC} $cert_type" + echo -e "${YELLOW}端口跳跃:${NC} $port_hopping" + echo "" + + # 生成链接 + local node_link=$(generate_node_link "$server_ip" "$port" "$auth_password" "$obfs_password" "$sni_domain" "$insecure") + local subscription_link=$(generate_subscription_link "$node_link") + + while true; do + echo -e "${CYAN}=== 节点信息选项 ===${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} 生成二维码 (需要 qrencode)" + echo -e "${GREEN}6.${NC} 刷新信息" + echo -e "${RED}0.${NC} 返回主菜单" + echo "" + echo -n -e "${BLUE}请选择操作 [0-6]: ${NC}" + read -r choice + + case $choice in + 1) + echo "" + echo -e "${CYAN}节点链接:${NC}" + echo "$node_link" + echo "" + read -p "按回车键继续..." + ;; + 2) + echo "" + echo -e "${CYAN}订阅链接 (Base64):${NC}" + echo "$subscription_link" + echo "" + read -p "按回车键继续..." + ;; + 3) + echo "" + echo -e "${CYAN}客户端配置:${NC}" + echo "" + generate_client_config "$server_ip" "$port" "$auth_password" "$obfs_password" "$sni_domain" "$insecure" + echo "" + read -p "按回车键继续..." + ;; + 4) + save_node_info_to_file "$server_ip" "$port" "$auth_password" "$obfs_password" "$sni_domain" "$insecure" "$port_hopping" "$node_link" "$subscription_link" + ;; + 5) + generate_qr_code "$node_link" + ;; + 6) + # 刷新信息 + server_ip=$(get_current_server_ip) + config_info=$(parse_config_info) + IFS='|' read -r port auth_password obfs_password sni_domain cert_type insecure <<< "$config_info" + port_hopping=$(get_port_hopping_info) + node_link=$(generate_node_link "$server_ip" "$port" "$auth_password" "$obfs_password" "$sni_domain" "$insecure") + subscription_link=$(generate_subscription_link "$node_link") + echo -e "${GREEN}信息已刷新${NC}" + sleep 1 + ;; + 0) + break + ;; + *) + echo -e "${RED}无效选项${NC}" + sleep 1 + ;; + esac + done +} + +# 保存节点信息到文件 +save_node_info_to_file() { + local server_ip="$1" + local port="$2" + local auth_password="$3" + local obfs_password="$4" + local sni_domain="$5" + local insecure="$6" + local port_hopping="$7" + local node_link="$8" + local subscription_link="$9" + + local output_file="/etc/hysteria/node-info.txt" + + cat > "$output_file" << EOF +# Hysteria2 节点信息 +# 生成时间: $(date) + +=== 服务器信息 === +服务器地址: $server_ip:$port +认证密码: $auth_password +混淆密码: ${obfs_password:-未启用} +SNI域名: ${sni_domain:-未设置} +证书验证: $([ "$insecure" == "true" ] && echo "忽略 (自签名)" || echo "验证 (ACME)") +端口跳跃: $port_hopping + +=== 节点链接 === +$node_link + +=== 订阅链接 (Base64) === +$subscription_link + +=== 客户端配置 === +$(generate_client_config "$server_ip" "$port" "$auth_password" "$obfs_password" "$sni_domain" "$insecure") +EOF + + echo "" + echo -e "${GREEN}节点信息已保存到: $output_file${NC}" + echo "" + read -p "按回车键继续..." +} + +# 生成二维码 +generate_qr_code() { + local content="$1" + + if command -v qrencode &> /dev/null; then + echo "" + echo -e "${CYAN}节点链接二维码:${NC}" + echo "" + qrencode -t ANSIUTF8 "$content" + echo "" + else + echo "" + echo -e "${YELLOW}qrencode 未安装,无法生成二维码${NC}" + echo "安装命令:" + echo " Ubuntu/Debian: apt install qrencode" + echo " CentOS/RHEL: yum install qrencode" + echo "" + fi + + read -p "按回车键继续..." +} diff --git a/scripts/service.sh b/scripts/service.sh new file mode 100644 index 0000000..012075b --- /dev/null +++ b/scripts/service.sh @@ -0,0 +1,398 @@ +#!/bin/bash + +# Hysteria2 服务管理脚本 + +# 检查服务状态详情 +check_service_detailed() { + echo -e "${CYAN}Hysteria2 服务详细状态:${NC}" + echo "" + + if ! check_hysteria_installed; then + echo -e "${RED}Hysteria2 未安装${NC}" + return 1 + fi + + # 服务状态 + echo -e "${BLUE}服务状态:${NC}" + if systemctl is-active --quiet $SERVICE_NAME; then + echo -e " 运行状态: ${GREEN}运行中${NC}" + else + echo -e " 运行状态: ${RED}已停止${NC}" + fi + + if systemctl is-enabled --quiet $SERVICE_NAME; then + echo -e " 开机启动: ${GREEN}已启用${NC}" + else + echo -e " 开机启动: ${RED}未启用${NC}" + fi + + # 配置文件状态 + echo "" + echo -e "${BLUE}配置文件:${NC}" + if [[ -f "$CONFIG_PATH" ]]; then + echo -e " 配置文件: ${GREEN}存在${NC} ($CONFIG_PATH)" + echo -e " 文件大小: $(du -h "$CONFIG_PATH" | cut -f1)" + echo -e " 修改时间: $(stat -c %y "$CONFIG_PATH" 2>/dev/null || stat -f %Sm "$CONFIG_PATH" 2>/dev/null)" + else + echo -e " 配置文件: ${RED}不存在${NC}" + fi + + # 端口监听状态 + echo "" + echo -e "${BLUE}端口监听:${NC}" + if [[ -f "$CONFIG_PATH" ]]; then + local port=$(grep -E "^listen:" "$CONFIG_PATH" | awk '{print $2}' | sed 's/://') + if [[ -z "$port" ]]; then + port="443" + fi + + if netstat -tuln 2>/dev/null | grep -q ":$port "; then + echo -e " 端口 $port: ${GREEN}正在监听${NC}" + else + echo -e " 端口 $port: ${RED}未监听${NC}" + fi + fi + + # 进程信息 + echo "" + echo -e "${BLUE}进程信息:${NC}" + local pid=$(pgrep -f hysteria) + if [[ -n "$pid" ]]; then + echo -e " 进程ID: ${GREEN}$pid${NC}" + echo -e " 内存使用: $(ps -p $pid -o rss= | awk '{printf "%.1f MB", $1/1024}')" + echo -e " CPU使用: $(ps -p $pid -o %cpu= | awk '{print $1"%"}')" + else + echo -e " 进程状态: ${RED}未运行${NC}" + fi +} + +# 启动服务 +start_service() { + echo -e "${BLUE}启动 Hysteria2 服务...${NC}" + + if ! check_hysteria_installed; then + echo -e "${RED}错误: Hysteria2 未安装${NC}" + return 1 + fi + + if [[ ! -f "$CONFIG_PATH" ]]; then + echo -e "${RED}错误: 配置文件不存在${NC}" + echo "请先生成配置文件" + return 1 + fi + + if systemctl is-active --quiet $SERVICE_NAME; then + echo -e "${YELLOW}服务已在运行中${NC}" + return 0 + fi + + # 启动服务 + if systemctl start $SERVICE_NAME; then + echo -e "${GREEN}服务启动成功${NC}" + + # 等待服务启动 + sleep 2 + + if systemctl is-active --quiet $SERVICE_NAME; then + echo -e "${GREEN}服务运行正常${NC}" + else + echo -e "${RED}服务启动失败${NC}" + echo "查看日志获取详细信息" + fi + else + echo -e "${RED}服务启动失败${NC}" + fi +} + +# 停止服务 +stop_service() { + echo -e "${BLUE}停止 Hysteria2 服务...${NC}" + + if ! systemctl is-active --quiet $SERVICE_NAME; then + echo -e "${YELLOW}服务未在运行${NC}" + return 0 + fi + + if systemctl stop $SERVICE_NAME; then + echo -e "${GREEN}服务停止成功${NC}" + else + echo -e "${RED}服务停止失败${NC}" + fi +} + +# 重启服务 +restart_service() { + echo -e "${BLUE}重启 Hysteria2 服务...${NC}" + + if ! check_hysteria_installed; then + echo -e "${RED}错误: Hysteria2 未安装${NC}" + return 1 + fi + + if [[ ! -f "$CONFIG_PATH" ]]; then + echo -e "${RED}错误: 配置文件不存在${NC}" + return 1 + fi + + if systemctl restart $SERVICE_NAME; then + echo -e "${GREEN}服务重启成功${NC}" + + # 等待服务启动 + sleep 2 + + if systemctl is-active --quiet $SERVICE_NAME; then + echo -e "${GREEN}服务运行正常${NC}" + else + echo -e "${RED}服务重启后未正常运行${NC}" + fi + else + echo -e "${RED}服务重启失败${NC}" + fi +} + +# 启用开机自启 +enable_service() { + echo -e "${BLUE}启用开机自启...${NC}" + + if systemctl is-enabled --quiet $SERVICE_NAME; then + echo -e "${YELLOW}开机自启已启用${NC}" + return 0 + fi + + if systemctl enable $SERVICE_NAME; then + echo -e "${GREEN}开机自启启用成功${NC}" + else + echo -e "${RED}开机自启启用失败${NC}" + fi +} + +# 禁用开机自启 +disable_service() { + echo -e "${BLUE}禁用开机自启...${NC}" + + if ! systemctl is-enabled --quiet $SERVICE_NAME; then + echo -e "${YELLOW}开机自启未启用${NC}" + return 0 + fi + + if systemctl disable $SERVICE_NAME; then + echo -e "${GREEN}开机自启禁用成功${NC}" + else + echo -e "${RED}开机自启禁用失败${NC}" + fi +} + +# 查看实时日志 +view_live_logs() { + echo -e "${BLUE}查看实时日志 (按 Ctrl+C 退出)...${NC}" + echo "" + journalctl -f -u $SERVICE_NAME +} + +# 查看历史日志 +view_history_logs() { + echo -e "${BLUE}查看历史日志${NC}" + echo "" + echo -e "${GREEN}1.${NC} 最近 50 行" + echo -e "${GREEN}2.${NC} 最近 100 行" + echo -e "${GREEN}3.${NC} 最近 500 行" + echo -e "${GREEN}4.${NC} 今天的日志" + echo -e "${GREEN}5.${NC} 自定义行数" + echo "" + echo -n -e "${BLUE}请选择 [1-5]: ${NC}" + read -r choice + + case $choice in + 1) + journalctl --no-pager -n 50 -u $SERVICE_NAME + ;; + 2) + journalctl --no-pager -n 100 -u $SERVICE_NAME + ;; + 3) + journalctl --no-pager -n 500 -u $SERVICE_NAME + ;; + 4) + journalctl --no-pager --since today -u $SERVICE_NAME + ;; + 5) + echo -n -e "${BLUE}请输入行数: ${NC}" + read -r lines + if [[ "$lines" =~ ^[0-9]+$ ]]; then + journalctl --no-pager -n "$lines" -u $SERVICE_NAME + else + echo -e "${RED}无效的行数${NC}" + fi + ;; + *) + echo -e "${RED}无效选择${NC}" + ;; + esac +} + +# 配置文件操作 +config_operations() { + 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 "" + echo -n -e "${BLUE}请选择 [1-5]: ${NC}" + read -r choice + + case $choice in + 1) + if [[ -f "$CONFIG_PATH" ]]; then + echo -e "${BLUE}当前配置文件内容:${NC}" + echo "" + cat "$CONFIG_PATH" + else + echo -e "${RED}配置文件不存在${NC}" + fi + ;; + 2) + if [[ -f "$CONFIG_PATH" ]]; then + echo -e "${BLUE}使用 nano 编辑配置文件...${NC}" + nano "$CONFIG_PATH" + echo -e "${GREEN}编辑完成${NC}" + echo -n -e "${BLUE}是否重启服务以应用更改? [y/N]: ${NC}" + read -r restart + if [[ $restart =~ ^[Yy]$ ]]; then + restart_service + fi + else + echo -e "${RED}配置文件不存在${NC}" + fi + ;; + 3) + if [[ -f "$CONFIG_PATH" ]]; then + local backup_file="$CONFIG_PATH.backup.$(date +%Y%m%d_%H%M%S)" + cp "$CONFIG_PATH" "$backup_file" + echo -e "${GREEN}配置文件已备份到: $backup_file${NC}" + else + echo -e "${RED}配置文件不存在${NC}" + fi + ;; + 4) + echo -e "${BLUE}可用的备份文件:${NC}" + local backups=($(ls "$CONFIG_PATH".backup.* 2>/dev/null)) + if [[ ${#backups[@]} -eq 0 ]]; then + echo -e "${RED}没有找到备份文件${NC}" + return + fi + + for i in "${!backups[@]}"; do + echo "$((i+1)). ${backups[$i]}" + done + + echo -n -e "${BLUE}请选择要恢复的备份 [1-${#backups[@]}]: ${NC}" + read -r backup_choice + + if [[ "$backup_choice" =~ ^[0-9]+$ ]] && [[ $backup_choice -ge 1 ]] && [[ $backup_choice -le ${#backups[@]} ]]; then + local selected_backup="${backups[$((backup_choice-1))]}" + cp "$selected_backup" "$CONFIG_PATH" + echo -e "${GREEN}配置文件已恢复${NC}" + else + echo -e "${RED}无效选择${NC}" + fi + ;; + 5) + if [[ -f "$CONFIG_PATH" ]]; then + echo -e "${BLUE}验证配置文件语法...${NC}" + if hysteria server --config "$CONFIG_PATH" --check 2>/dev/null; then + echo -e "${GREEN}配置文件语法正确${NC}" + else + echo -e "${RED}配置文件语法错误${NC}" + echo "请检查配置文件格式" + fi + else + echo -e "${RED}配置文件不存在${NC}" + fi + ;; + *) + echo -e "${RED}无效选择${NC}" + ;; + esac +} + +# 主服务管理函数 +manage_hysteria_service() { + while true; do + echo -e "${BLUE}Hysteria2 服务管理${NC}" + echo "" + + # 显示当前状态 + check_service_detailed + + 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 "${YELLOW}日志查看:${NC}" + echo -e "${GREEN}6.${NC} 查看实时日志" + echo -e "${GREEN}7.${NC} 查看历史日志" + echo "" + echo -e "${YELLOW}配置管理:${NC}" + echo -e "${GREEN}8.${NC} 配置文件操作" + echo "" + echo -e "${RED}0.${NC} 返回主菜单" + echo "" + echo -n -e "${BLUE}请选择操作 [0-8]: ${NC}" + read -r choice + + case $choice in + 1) + start_service + echo "" + read -p "按回车键继续..." + ;; + 2) + stop_service + echo "" + read -p "按回车键继续..." + ;; + 3) + restart_service + echo "" + read -p "按回车键继续..." + ;; + 4) + enable_service + echo "" + read -p "按回车键继续..." + ;; + 5) + disable_service + echo "" + read -p "按回车键继续..." + ;; + 6) + view_live_logs + ;; + 7) + view_history_logs + echo "" + read -p "按回车键继续..." + ;; + 8) + config_operations + echo "" + read -p "按回车键继续..." + ;; + 0) + break + ;; + *) + echo -e "${RED}无效选项${NC}" + sleep 1 + ;; + esac + done +} diff --git a/scripts/troubleshoot.sh b/scripts/troubleshoot.sh new file mode 100644 index 0000000..0446718 --- /dev/null +++ b/scripts/troubleshoot.sh @@ -0,0 +1,403 @@ +#!/bin/bash + +# Hysteria2 故障排除和诊断脚本 + +# 系统信息检查 +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" + fi + + echo "" + echo -e "${BLUE}系统资源:${NC}" + echo "内核版本: $(uname -r)" + echo "架构: $(uname -m)" + echo "CPU核心: $(nproc)" + echo "内存: $(free -h | grep Mem | awk '{print $2}')" + echo "磁盘空间: $(df -h / | tail -1 | awk '{print $4}') 可用" + + echo "" + echo -e "${BLUE}网络信息:${NC}" + echo "主机名: $(hostname)" + echo "内网IP: $(ip route get 8.8.8.8 2>/dev/null | grep -oP 'src \K\S+')" + + # 获取公网IP + local public_ip=$(curl -s --connect-timeout 5 ipv4.icanhazip.com 2>/dev/null) + if [[ -n "$public_ip" ]]; then + echo "公网IP: $public_ip" + else + echo "公网IP: 无法获取" + fi + + echo "" +} + +# 检查 Hysteria2 安装状态 +check_hysteria_installation() { + echo -e "${CYAN}=== Hysteria2 安装检查 ===${NC}" + echo "" + + if command -v hysteria &> /dev/null; then + echo -e "${GREEN}✓ Hysteria2 已安装${NC}" + echo "版本: $(hysteria version 2>/dev/null | head -1)" + echo "路径: $(which hysteria)" + else + echo -e "${RED}✗ Hysteria2 未安装${NC}" + 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)" + + # 检查配置文件权限 + 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}" + fi + + # 检查配置文件语法 + echo "" + echo -e "${BLUE}配置文件语法检查:${NC}" + if hysteria server --config "$CONFIG_PATH" --check &>/dev/null; then + echo -e "${GREEN}✓ 配置文件语法正确${NC}" + else + echo -e "${RED}✗ 配置文件语法错误${NC}" + echo "请检查配置文件格式" + fi + + # 显示关键配置信息 + echo "" + echo -e "${BLUE}关键配置信息:${NC}" + + # 监听端口 + local port=$(grep -E "^listen:" "$CONFIG_PATH" | awk '{print $2}' | sed 's/://') + echo "监听端口: ${port:-443}" + + # 认证方式 + local auth_type=$(grep -A 1 "^auth:" "$CONFIG_PATH" | grep "type:" | awk '{print $2}') + echo "认证方式: ${auth_type:-未设置}" + + # 证书配置 + if grep -q "^acme:" "$CONFIG_PATH"; then + echo "证书类型: ACME 自动证书" + local domain=$(grep -A 2 "^acme:" "$CONFIG_PATH" | grep -E "^\s*-" | awk '{print $2}') + echo "域名: ${domain:-未设置}" + elif grep -q "^tls:" "$CONFIG_PATH"; then + echo "证书类型: 手动证书" + local cert_path=$(grep -A 2 "^tls:" "$CONFIG_PATH" | grep "cert:" | awk '{print $2}') + echo "证书路径: ${cert_path:-未设置}" + else + echo "证书类型: 未配置" + fi + + # 混淆配置 + if grep -q "^obfs:" "$CONFIG_PATH"; then + echo -e "${GREEN}✓ 混淆已启用${NC}" + else + echo "混淆配置: 未启用" + fi + + else + echo -e "${RED}✗ 配置文件不存在${NC}" + echo "路径: $CONFIG_PATH" + return 1 + fi + + echo "" +} + +# 检查证书文件 +check_certificates() { + echo -e "${CYAN}=== 证书文件检查 ===${NC}" + echo "" + + local cert_dir="/etc/hysteria" + + if [[ -f "$cert_dir/server.crt" ]]; then + echo -e "${GREEN}✓ 证书文件存在${NC}" + echo "证书路径: $cert_dir/server.crt" + echo "私钥路径: $cert_dir/server.key" + + # 检查证书有效期 + local cert_info=$(openssl x509 -in "$cert_dir/server.crt" -text -noout 2>/dev/null) + if [[ -n "$cert_info" ]]; then + local not_after=$(echo "$cert_info" | grep "Not After" | cut -d: -f2-) + echo "有效期至: $not_after" + + local subject=$(echo "$cert_info" | grep "Subject:" | cut -d= -f2-) + echo "证书主体: $subject" + fi + + # 检查证书权限 + local cert_perms=$(stat -c %a "$cert_dir/server.crt" 2>/dev/null) + local key_perms=$(stat -c %a "$cert_dir/server.key" 2>/dev/null) + echo "证书权限: $cert_perms" + echo "私钥权限: $key_perms" + + else + echo -e "${YELLOW}⚠ 自签名证书不存在${NC}" + echo "这可能是 ACME 模式或证书未生成" + fi + + echo "" +} + +# 检查服务状态 +check_service_status() { + echo -e "${CYAN}=== 服务状态检查 ===${NC}" + echo "" + + # 服务运行状态 + if systemctl is-active --quiet hysteria-server.service; then + echo -e "${GREEN}✓ 服务正在运行${NC}" + else + echo -e "${RED}✗ 服务未运行${NC}" + fi + + # 服务启用状态 + if systemctl is-enabled --quiet hysteria-server.service; then + echo -e "${GREEN}✓ 开机自启已启用${NC}" + else + echo -e "${YELLOW}⚠ 开机自启未启用${NC}" + fi + + # 服务详细状态 + echo "" + echo -e "${BLUE}服务详细状态:${NC}" + systemctl status hysteria-server.service --no-pager -l + + 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}" + echo "" + echo "监听详情:" + netstat -tulnp 2>/dev/null | grep ":$port " + else + echo -e "${RED}✗ 端口 $port 未监听${NC}" + echo "" + echo "可能原因:" + echo "1. 服务未启动" + echo "2. 配置文件错误" + echo "3. 端口被其他程序占用" + fi + + echo "" +} + +# 检查防火墙状态 +check_firewall() { + echo -e "${CYAN}=== 防火墙检查 ===${NC}" + echo "" + + # 检查 UFW + if command -v ufw &> /dev/null; then + echo -e "${BLUE}UFW 状态:${NC}" + local ufw_status=$(ufw status 2>/dev/null | head -1) + echo "$ufw_status" + + if [[ "$ufw_status" == *"active"* ]]; then + echo "" + echo "UFW 规则:" + ufw status numbered 2>/dev/null | grep -E "(443|hysteria)" + fi + fi + + # 检查 firewalld + if command -v firewall-cmd &> /dev/null; then + echo -e "${BLUE}Firewalld 状态:${NC}" + if firewall-cmd --state &>/dev/null; then + echo "运行中" + echo "" + echo "开放端口:" + firewall-cmd --list-ports 2>/dev/null + else + echo "未运行" + fi + fi + + # 检查 iptables + echo "" + echo -e "${BLUE}iptables 规则:${NC}" + if iptables -L INPUT -n 2>/dev/null | grep -q "443"; then + echo "发现端口 443 相关规则:" + iptables -L INPUT -n 2>/dev/null | grep "443" + else + echo "未发现端口 443 相关规则" + fi + + echo "" +} + +# 检查网络连通性 +check_network_connectivity() { + echo -e "${CYAN}=== 网络连通性检查 ===${NC}" + echo "" + + echo -e "${BLUE}DNS 解析测试:${NC}" + if nslookup google.com &>/dev/null; then + echo -e "${GREEN}✓ DNS 解析正常${NC}" + else + echo -e "${RED}✗ DNS 解析失败${NC}" + fi + + echo "" + echo -e "${BLUE}外网连接测试:${NC}" + if curl -s --connect-timeout 5 google.com &>/dev/null; then + echo -e "${GREEN}✓ 外网连接正常${NC}" + else + echo -e "${RED}✗ 外网连接失败${NC}" + fi + + echo "" + echo -e "${BLUE}端口连通性测试:${NC}" + local port="443" + if [[ -f "$CONFIG_PATH" ]]; then + port=$(grep -E "^listen:" "$CONFIG_PATH" | awk '{print $2}' | sed 's/://' || echo "443") + fi + + # 获取公网IP进行测试 + local public_ip=$(curl -s --connect-timeout 5 ipv4.icanhazip.com 2>/dev/null) + if [[ -n "$public_ip" ]]; then + echo "测试端口 $port 连通性..." + if timeout 5 bash -c "/dev/null; then + echo -e "${GREEN}✓ 端口 $port 可连接${NC}" + else + echo -e "${RED}✗ 端口 $port 无法连接${NC}" + fi + else + echo "无法获取公网IP,跳过端口测试" + fi + + echo "" +} + +# 检查日志错误 +check_logs() { + echo -e "${CYAN}=== 日志错误检查 ===${NC}" + echo "" + + echo -e "${BLUE}最近的错误日志:${NC}" + local error_logs=$(journalctl -u hysteria-server.service --since "1 hour ago" --no-pager | grep -i "error\|failed\|fatal" | tail -10) + + if [[ -n "$error_logs" ]]; then + echo "$error_logs" + else + echo -e "${GREEN}✓ 未发现错误日志${NC}" + fi + + echo "" + echo -e "${BLUE}最近的警告日志:${NC}" + local warning_logs=$(journalctl -u hysteria-server.service --since "1 hour ago" --no-pager | grep -i "warn" | tail -5) + + if [[ -n "$warning_logs" ]]; then + echo "$warning_logs" + else + echo -e "${GREEN}✓ 未发现警告日志${NC}" + fi + + echo "" +} + +# 生成诊断报告 +generate_diagnostic_report() { + local report_file="/tmp/hysteria2-diagnostic-$(date +%Y%m%d_%H%M%S).txt" + + echo -e "${BLUE}生成诊断报告...${NC}" + + { + echo "Hysteria2 诊断报告" + echo "生成时间: $(date)" + echo "========================================" + echo "" + + check_system_info + check_hysteria_installation + check_configuration + check_certificates + check_service_status + check_port_listening + check_firewall + check_network_connectivity + check_logs + + } > "$report_file" 2>&1 + + echo -e "${GREEN}诊断报告已生成: $report_file${NC}" + echo "" + echo -n -e "${BLUE}是否查看报告内容? [y/N]: ${NC}" + read -r view_report + if [[ $view_report =~ ^[Yy]$ ]]; then + less "$report_file" + fi +} + +# 主诊断函数 +run_diagnostics() { + while true; do + echo -e "${BLUE}Hysteria2 故障排除和诊断${NC}" + echo "" + echo -e "${GREEN}1.${NC} 系统信息检查" + echo -e "${GREEN}2.${NC} Hysteria2 安装检查" + 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 "${GREEN}9.${NC} 日志错误检查" + echo -e "${GREEN}10.${NC} 生成完整诊断报告" + echo -e "${RED}0.${NC} 返回主菜单" + echo "" + echo -n -e "${BLUE}请选择检查项目 [0-10]: ${NC}" + read -r choice + + case $choice in + 1) check_system_info; read -p "按回车键继续..." ;; + 2) check_hysteria_installation; read -p "按回车键继续..." ;; + 3) check_configuration; read -p "按回车键继续..." ;; + 4) check_certificates; read -p "按回车键继续..." ;; + 5) check_service_status; read -p "按回车键继续..." ;; + 6) check_port_listening; read -p "按回车键继续..." ;; + 7) check_firewall; read -p "按回车键继续..." ;; + 8) check_network_connectivity; read -p "按回车键继续..." ;; + 9) check_logs; read -p "按回车键继续..." ;; + 10) generate_diagnostic_report; read -p "按回车键继续..." ;; + 0) break ;; + *) echo -e "${RED}无效选项${NC}"; sleep 1 ;; + esac + done +} diff --git a/templates/acme-config.yaml b/templates/acme-config.yaml new file mode 100644 index 0000000..ec1ab85 --- /dev/null +++ b/templates/acme-config.yaml @@ -0,0 +1,66 @@ +# Hysteria2 配置文件 - ACME 自动证书模式 +# 此模板用于使用 ACME 自动申请和续期 SSL 证书 +# 需要有效的域名和邮箱地址 + +# 监听地址和端口 +# 默认监听 443 端口,可以修改为其他端口 +listen: :443 + +# ACME 自动证书配置 +acme: + domains: + - your.domain.net # 替换为你的域名 + email: your@email.com # 替换为你的邮箱地址 + # ca: letsencrypt # 可选:指定 CA,默认为 Let's Encrypt + # altHttpPort: 8080 # 可选:HTTP 验证端口 + # altTlsAlpnPort: 8443 # 可选:TLS-ALPN 验证端口 + +# 认证配置 +auth: + type: password + password: Se7RAuFZ8Lzg # 替换为你的密码 + +# 伪装配置 +masquerade: + type: proxy + proxy: + url: https://news.ycombinator.com/ # 伪装网站 URL + rewriteHost: true + +# 可选:混淆配置 +# 取消注释以下配置来启用混淆 +# obfs: +# type: salamander +# salamander: +# password: cry_me_a_r1ver # 混淆密码 + +# 可选:带宽限制 +# bandwidth: +# up: 1 gbps # 上行带宽限制 +# down: 1 gbps # 下行带宽限制 + +# 可选:忽略客户端带宽 +# ignoreClientBandwidth: false + +# 可选:UDP 转发超时 +# udpIdleTimeout: 60s + +# 可选:禁用 UDP +# disableUDP: false + +# 可选:ACL 规则文件 +# acl: /path/to/acl.txt + +# 可选:出站配置 +# outbounds: +# - name: direct +# type: direct +# - name: block +# type: block + +# 可选:路由规则 +# routing: +# rules: +# - outbound: block +# geoip: +# - cn diff --git a/templates/advanced-config.yaml b/templates/advanced-config.yaml new file mode 100644 index 0000000..cc03417 --- /dev/null +++ b/templates/advanced-config.yaml @@ -0,0 +1,126 @@ +# 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 diff --git a/templates/client-config.yaml b/templates/client-config.yaml new file mode 100644 index 0000000..0fb927e --- /dev/null +++ b/templates/client-config.yaml @@ -0,0 +1,91 @@ +# Hysteria2 客户端配置文件示例 +# 请根据服务器配置修改相应参数 + +# 服务器配置 +server: your.server.com:443 # 替换为你的服务器地址和端口 + +# 认证配置 +auth: your_password # 替换为服务器设置的密码 + +# TLS 配置 +tls: + sni: your.server.com # 替换为你的域名 + insecure: false # ACME 证书模式设为 false,自签名证书模式设为 true + +# 混淆配置 (如果服务器启用了混淆) +# obfs: +# type: salamander +# salamander: +# password: obfs_password # 替换为服务器设置的混淆密码 + +# 带宽配置 +bandwidth: + up: 100 mbps # 上行带宽 + down: 100 mbps # 下行带宽 + +# SOCKS5 代理 +socks5: + listen: 127.0.0.1:1080 + +# HTTP 代理 +http: + listen: 127.0.0.1:8080 + +# TUN 模式 (需要管理员权限) +# tun: +# name: hysteria-tun +# mtu: 1500 +# timeout: 5s + +# 路由规则 +# routing: +# rules: +# # 直连中国大陆 IP +# - outbound: direct +# geoip: +# - cn +# # 直连私有 IP +# - outbound: direct +# ipCIDR: +# - 10.0.0.0/8 +# - 172.16.0.0/12 +# - 192.168.0.0/16 +# - 127.0.0.0/8 + +# 出站配置 +# outbounds: +# - name: direct +# type: direct + +# DNS 配置 +# dns: +# servers: +# - addr: 8.8.8.8:53 +# timeout: 5s +# - addr: 1.1.1.1:53 +# timeout: 5s + +# 日志配置 +# log: +# level: info +# output: hysteria-client.log + +# ACL 规则文件 +# acl: client-acl.txt + +# 懒惰模式 (仅在需要时连接) +# lazy: true + +# 快乐眼球 (IPv4/IPv6 双栈) +# happyEyeballs: +# enabled: true +# delay: 300ms + +# 配置说明: +# 1. server: 服务器地址,格式为 host:port +# 2. auth: 认证密码,需与服务器配置一致 +# 3. tls.sni: SNI 域名,通常与服务器域名一致 +# 4. tls.insecure: 是否忽略证书错误,自签名证书需设为 true +# 5. obfs: 混淆配置,需与服务器配置一致 +# 6. socks5/http: 本地代理监听地址 +# 7. bandwidth: 客户端带宽限制 diff --git a/templates/self-cert-config.yaml b/templates/self-cert-config.yaml new file mode 100644 index 0000000..d086ae1 --- /dev/null +++ b/templates/self-cert-config.yaml @@ -0,0 +1,62 @@ +# Hysteria2 配置文件 - 自签名证书模式 +# 此模板用于使用自签名证书,无需域名即可快速部署 +# 适合测试环境或无法使用域名的场景 + +# 监听地址和端口 +# 默认监听 443 端口,可以修改为其他端口 +listen: :443 + +# TLS 证书配置 +tls: + cert: /etc/hysteria/server.crt # 证书文件路径 + key: /etc/hysteria/server.key # 私钥文件路径 + +# 认证配置 +auth: + type: password + password: Se7RAuFZ8Lzg # 替换为你的密码 + +# 伪装配置 +masquerade: + type: proxy + proxy: + url: https://cdn.jsdelivr.net/ # 伪装网站 URL + rewriteHost: true + +# 可选:混淆配置 +# 取消注释以下配置来启用混淆 +# obfs: +# type: salamander +# salamander: +# password: cry_me_a_r1ver # 混淆密码 + +# 可选:带宽限制 +# bandwidth: +# up: 1 gbps # 上行带宽限制 +# down: 1 gbps # 下行带宽限制 + +# 可选:忽略客户端带宽 +# ignoreClientBandwidth: false + +# 可选:UDP 转发超时 +# udpIdleTimeout: 60s + +# 可选:禁用 UDP +# disableUDP: false + +# 可选:ACL 规则文件 +# acl: /path/to/acl.txt + +# 可选:出站配置 +# outbounds: +# - name: direct +# type: direct +# - name: block +# type: block + +# 可选:路由规则 +# routing: +# rules: +# - outbound: block +# geoip: +# - cn