标签 smtp-tunnel-proxy 下的文章

项目介绍

https://github.com/x011/smtp-tunnel-proxy

smtp-tunnel-proxy 是一个开源的 Python 项目(GitHub: x011/smtp-tunnel-proxy),其核心目的是创建一个隐蔽的 TCP 隧道,通过将任意 TCP 流量伪装成标准的 SMTP(电子邮件)通信来绕过深度包检测(DPI)防火墙。

它的工作原理是:

  • 利用 SMTP 协议的合法特性(EHLO、AUTH、STARTTLS 等命令),让初始连接看起来像普通的邮件服务器交互(模仿 Postfix 等真实 MTA)。
  • 在 STARTTLS 建立 TLS 加密后,切换到自定义的二进制流协议,进行高效的 TCP 数据多路复用传输。
  • 客户端提供标准的 SOCKS5 代理接口,应用程序(如浏览器、curl 等)可以将流量路由到本地 SOCKS5 端口,从而通过隧道转发到服务器端出口。

关键特点

  • DPI 规避:初始 SMTP 握手高度仿真真实邮件流量。
  • 高性能:TLS 加密后使用二进制协议, overhead 低,支持多路复用。
  • 多用户支持:服务器可管理多个用户,每个用户有独立密钥、IP 白名单、日志控制。
  • 安全机制:强制 TLS 1.2+、HMAC-SHA256 认证、CA 证书验证、IP 白名单。
  • 接口:仅提供 SOCKS5(不支持 HTTP 代理)。
  • 最新版本:v1.3.0(2026 年 1 月发布),GPL-3.0 许可。

项目明确设计用于在受 DPI 限制的网络环境中建立 covert channel,技术上可用于将受限网络的流量转发到无限制的服务器出口(即常见的“代理/隧道”场景)。

技术部署指南

1. 前提条件

  • 服务器:一台位于无网络限制地区的 VPS(Linux,Python 3.8+),开放端口(默认 587)。
  • 域名:推荐使用动态域名(如 DuckDNS)指向 VPS IP(TLS 证书验证需要域名)。
  • 客户端:Windows/macOS/Linux 机器,Python 3.8+。

2. 服务器部署(一键安装推荐)

curl -sSL https://raw.githubusercontent.com/x011/smtp-tunnel-proxy/main/install.sh | sudo bash
  • 安装过程会:

    • 提示输入域名。
    • 自动生成 TLS 证书(server.crt、server.key、ca.crt)。
    • 安装到 /opt/smtp-tunnel/,配置放到 /etc/smtp-tunnel/。
    • 创建 systemd 服务(smtp-tunnel.service)。
    • 提供管理命令(如 smtp-tunnel-adduser)。

添加用户(为每个客户端生成配置):

sudo smtp-tunnel-adduser <username>
  • 这会生成随机密钥、在 users.yaml 中添加用户、并打包 <username>.zip(包含客户端所需的所有文件:config.yaml、ca.crt、启动脚本)。

服务管理

sudo systemctl restart smtp-tunnel      # 重启服务
sudo journalctl -u smtp-tunnel -f      # 查看日志

配置文件示例(/etc/smtp-tunnel/config.yaml):

host: 0.0.0.0
port: 587
hostname: mail.yourdomain.com   # 必须与证书匹配
cert_file: server.crt
key_file: server.key
users_file: users.yaml
log_users: true

3. 客户端部署(推荐使用管理员提供的 ZIP 包)

  1. 从服务器管理员处获取 <username>.zip。
  2. 解压后:

    • Windows:双击 start.bat
    • Linux/macOS:执行 ./start.sh
  • 脚本会自动安装依赖(requirements.txt),启动客户端。
  • 默认在 127.0.0.1:1080 监听 SOCKS5 代理。

手动运行(如果不使用 ZIP):

git clone https://github.com/x011/smtp-tunnel-proxy.git
cd smtp-tunnel-proxy
pip install -r requirements.txt
python client.py -c config.yaml

客户端配置示例(config.yaml):

client:
  server_host: "mail.yourdomain.com"
  server_port: 587
  socks_port: 1080
  socks_host: 127.0.0.1
  username: "your_username"
  secret: "your_secret_from_adduser"
  ca_cert: "ca.crt"   # 必须包含服务器提供的 CA 证书

4. 使用方式(技术测试)

  • 将应用程序配置为使用 SOCKS5 代理:

    • 主机:127.0.0.1
    • 端口:1080
    • 启用“远程 DNS 解析”(socks5h)。
  • 测试命令:

    curl -x socks5h://127.0.0.1:1080 https://ifconfig.me

    返回结果应为服务器(VPS)的公网 IP。

  • 系统级代理示例:

    export ALL_PROXY=socks5://127.0.0.1:1080

5. 注意事项与限制

  • 必须使用提供的 ca.crt 验证服务器证书(防止中间人攻击)。
  • 服务器时间需同步。
  • 仅支持 SOCKS5,需要应用支持该协议。
  • 性能取决于网络条件和 VPS 带宽。
  • IP 白名单可限制客户端来源 IP。

此项目纯粹是网络协议层的技术实现,适合用于研究 SMTP 协议扩展、隧道技术或 DPI 规避机制。