Skip to content

SwartzMss/EasyProxy

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

43 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

EasyProxy

EasyProxy 旨在实现一个基于 HTTPS 的代理服务器,支持用户名和密码校验,通过 Basic Auth 构造安全接入点,便于在内网或个人开发环境中提供代理。

  • 支持 HTTPS 代理
  • 通过用户名/密码进行 Basic Authentication 校验
  • 可自定义校验规则,灵活控制访问权限
  • 适用于需要安全代理或经过中间人服务的情况

环境需求

  • Rust 1.70 或更高版本(若使用 Rust 实现)

适用场景

  • 在需要安全控制的局域网中转发 HTTP/HTTPS 请求
  • 在自定义脚本或测试环境中提供代理服务
  • 当需要通过代理访问外部网络并对请求内容做进一步处理

工作流程示例

从客户端到目标服务器,全程只有两层 TLS:

客户端 ↔ 代理 用于保护 CONNECT 报文和凭据

客户端 ↔ 目标站 正常的业务层 HTTPS

┌──────────────┐ ① TLS 握手  ┌──────────────┐ ③ 纯 TCP 隧道 ┌──────────────┐
│  浏览器/程序 │════════════▶│   代理:8443  │════════════════▶│ 目标服务器  │
└──────────────┘            │  (Rust)      │                │  (443)      │
        ▲                   └──────────────┘                └──────────────┘
        │ ② CONNECT host:port (含 Basic Auth) 在 TLS 内
        │
        │<═══════════════════════════════════════════════════════════>
               “客户端 ↔ 代理” 这一跳始终被 TLS 加密

流程步骤

  1. TLS 握手(客户端 ↔ 代理)
  2. 客户端把代理当作 HTTPS 代理连接,验证代理证书。
  3. 发送 CONNECT 报文(已在 TLS 通道中)
  4. CONNECT www.example.com:443 HTTP/1.1
  5. Proxy-Authorization: Basic …(用户名/密码)
  6. 代理校验凭据并回复 200 Connection Established。
  7. 建立透明隧道:代理创建到 www.example.com:443 的 TCP 连接。
  8. 从此之后,代理只做字节级转发,不解析任何业务内容。
  9. 客户端与目标站自行完成第二层 TLS(正常 HTTPS)。

这样既能保护用户名/密码不裸奔,又保持代理"只转发、不解密"的纯隧道角色。

环境变量配置

代理的证书路径、监听地址以及认证信息均通过环境变量进行配置。可将这些变量写 入 .env 文件并在运行前加载。以下示例给出了全部变量及默认值:

# .env.example
# 使用 acme.sh (DNS-01) 签发的 EC 证书(安装在用户目录 _ecc 路径)
CERT=/home/<your-user>/.acme.sh/proxy.your-domain.example_ecc/fullchain.cer
KEY=/home/<your-user>/.acme.sh/proxy.your-domain.example_ecc/proxy.your-domain.example.key
USER=user
PASSWD=pass
ADDRESS=0.0.0.0:8443
RUST_LOG=info

# 可选:上游代理设置
# 如果设置了这些变量,EasyProxy 将通过指定的代理连接目标网站
HTTP_PROXY=http://127.0.0.1:7890
HTTPS_PROXY=http://127.0.0.1:7890

使用方法:

cp .env.example .env
cargo run        # 运行代理,自动加载 .env

使用 DNS-01 自动签发(推荐)

当无法开放 80/443 或需要自动化签发/续期时,建议使用 DNS-01 挑战。下面以 DNSPod + acme.sh 为例(域名均为占位示例,已屏蔽)。同一张证书可在同一域名的多个端口/多个进程中复用。

适用场景

  • 不能开放 80/443,但希望自动签发与续期。
  • 多端口/多进程共享同一证书与私钥。

步骤(DNSPod + acme.sh)

  1. 安装 acme.sh(非 root 安装,无需停机)
  • curl https://get.acme.sh | sh
  • ~/.acme.sh/acme.sh --upgrade --auto-upgrade
  1. 准备 DNSPod API(在 DNSPod 控制台创建 API ID 与 Token)
  • export DP_Id="YOUR_DNSPOD_ID"
  • export DP_Key="YOUR_DNSPOD_TOKEN"
  1. 设定默认 CA 并注册账户(以 Let's Encrypt 为例)
  • ~/.acme.sh/acme.sh --set-default-ca --server letsencrypt
  • ~/.acme.sh/acme.sh --register-account -m you@example.com --server letsencrypt
  1. 使用 DNS-01 签发证书(统一采用 EC 方案)
  • 单域名:
    • ~/.acme.sh/acme.sh --issue --dns dns_dp -d proxy.your-domain.example --keylength ec-256
  • 泛域名(可同时覆盖根域名):
    • ~/.acme.sh/acme.sh --issue --dns dns_dp -d '*.your-domain.example' -d your-domain.example --keylength ec-256
  1. 安装到固定路径(用户目录,无需 sudo,续期后自动覆盖)
  • ~/.acme.sh/acme.sh --install-cert -d proxy.your-domain.example --key-file ~/.acme.sh/proxy.your-domain.example_ecc/proxy.your-domain.example.key --fullchain-file ~/.acme.sh/proxy.your-domain.example_ecc/fullchain.cer

提示:可追加 --reloadcmd "<你的重启命令>" 实现续期后自动重载(例如 systemctl --user restart easyproxy 或你的自定义脚本)。

  1. 在 EasyProxy 中使用(同一普通用户运行即可)
  • .env 中:
    • CERT=/home/<your-user>/.acme.sh/proxy.your-domain.example_ecc/fullchain.cer
    • KEY=/home/<your-user>/.acme.sh/proxy.your-domain.example_ecc/proxy.your-domain.example.key
  1. 权限与安全
  • 全流程使用同一普通用户,无需 sudo/改权限;确保运行 EasyProxy 的用户即为上述证书文件的拥有者。
  1. 验证(主机名与证书必须匹配;证书与端口无关)
  • openssl s_client -connect proxy.your-domain.example:8443 -servername proxy.your-domain.example -showcerts
  • 同一张证书可用于 https://proxy.your-domain.example:8443https://proxy.your-domain.example:9443 等多个端口。

说明

  • 证书绑定“域名”,不绑定端口;同一域名的一张证书可同时用于多个端口与进程。
  • 若你的 DNS 提供商不是 DNSPod,可参考 acme.sh 的其它 DNS 插件,命令形式类似(将 dns_dp 换为对应插件)。

通过 systemd 部署与日志

使用随仓库提供的脚本快速安装为“系统级”服务(需 sudo)。脚本会:

  • 构建二进制(如未存在 target/release/easyproxy)。
  • 写入单元 /etc/systemd/system/easyproxy.service,设置 WorkingDirectory 指向仓库目录,EnvironmentFile 指向仓库下 .env

安装

sh scripts/install-easyproxy-system-service.sh

提示:安装脚本会检查 .env 是否存在;如缺失,会提示是否创建一个模板 .env。若拒绝创建将中止安装,以避免安装后服务立即失败。

管理

# 查看状态
sudo systemctl status easyproxy.service

# 重启 / 停止
sudo systemctl restart easyproxy.service
sudo systemctl stop easyproxy.service

日志查看

# 实时跟随
sudo journalctl -u easyproxy.service -f

# 查看最近 200 行
sudo journalctl -u easyproxy.service -n 200

卸载

sh scripts/uninstall-easyproxy-system-service.sh

更新代码后

# 在仓库内重新编译并重启服务
cargo build --release
sudo systemctl restart easyproxy.service

注意

  • .env 必须存在且配置正确;当前程序在找不到 .env 时会退出。
  • 证书与私钥路径必须对运行该服务的用户可读(脚本默认使用当前用户运行服务,非 root)。
  • 如在 WSL,需先启用 systemd:在 /etc/wsl.conf 增加
    • [boot]systemd=true,然后在 Windows 执行 wsl --shutdown 后重新进入。
  • 监听端口默认为非特权端口 8443。若需监听 <1024 端口,请另行配置能力(例如 setcap 'cap_net_bind_service=+ep' <binary>),不在本文档展开。

About

Https代理服务器

Resources

License

Stars

Watchers

Forks

Packages

No packages published