{"id":33899860,"url":"https://github.com/sesame2/gotun","last_synced_at":"2026-03-13T11:01:20.886Z","repository":{"id":315745829,"uuid":"1056173001","full_name":"Sesame2/gotun","owner":"Sesame2","description":"一个基于 SSH 的正向代理工具，让你的 HTTP/HTTPS 请求从远程主机的网络环境中发出，实现对其可达资源的透明访问。An SSH-powered forward proxy CLI that makes your network requests originate from the remote host.","archived":false,"fork":false,"pushed_at":"2025-12-29T16:31:48.000Z","size":417,"stargazers_count":110,"open_issues_count":2,"forks_count":7,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-01-01T17:32:53.403Z","etag":null,"topics":["cli","forward-proxy","go","network","ssh"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Sesame2.png","metadata":{"files":{"readme":"README-CN.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-09-13T14:41:53.000Z","updated_at":"2025-12-29T09:27:56.000Z","dependencies_parsed_at":"2025-09-20T13:27:25.860Z","dependency_job_id":"dfd7cf10-a42a-4cef-9d89-ef5ead60dec4","html_url":"https://github.com/Sesame2/gotun","commit_stats":null,"previous_names":["sesame2/gotun"],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/Sesame2/gotun","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Sesame2%2Fgotun","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Sesame2%2Fgotun/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Sesame2%2Fgotun/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Sesame2%2Fgotun/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Sesame2","download_url":"https://codeload.github.com/Sesame2/gotun/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Sesame2%2Fgotun/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30466310,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-13T11:00:43.441Z","status":"ssl_error","status_checked_at":"2026-03-13T11:00:23.173Z","response_time":60,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cli","forward-proxy","go","network","ssh"],"created_at":"2025-12-11T22:12:35.172Z","updated_at":"2026-03-13T11:01:20.862Z","avatar_url":"https://github.com/Sesame2.png","language":"Go","readme":"# gotun\n\n[English](README.md) | 简体中文\n\n[![Go Reference](https://pkg.go.dev/badge/github.com/Sesame2/gotun.svg)](https://pkg.go.dev/github.com/Sesame2/gotun)\n[![Go Report Card](https://goreportcard.com/badge/github.com/Sesame2/gotun)](https://goreportcard.com/report/github.com/Sesame2/gotun)\n[![Release](https://img.shields.io/github/v/release/Sesame2/gotun)](https://github.com/Sesame2/gotun/releases)\n[![Downloads](https://img.shields.io/github/downloads/Sesame2/gotun/total.svg)](https://github.com/Sesame2/gotun/releases)\n[![Homebrew](https://img.shields.io/homebrew/v/gotun)](https://formulae.brew.sh/formula/gotun)\n![Go Version](https://img.shields.io/github/go-mod/go-version/Sesame2/gotun)\n[![License](https://img.shields.io/github/license/Sesame2/gotun.svg)](LICENSE)\n\n\u003e 🚀 基于 SSH 的轻量级 HTTP 代理工具，使用 Go 编写，跨平台开箱即用。\n\n---\n\n## ✨ 项目简介\n\n`gotun` 是一个 HTTP-over-SSH 的命令行代理工具。它通过 SSH 协议连接远程主机，利用该主机作为 **网络出口**，将本地发起的 HTTP 请求安全地通过远程主机访问目标地址。你可以使用它来访问：\n\n- 内网中的路由器、服务器、API 等资源\n- 仅远程主机可访问的网络（公司内网、隔离网段等）\n- 任意 HTTP 网站，使用远程主机作为「中转代理」\n\n## 🎨 工作原理示意图\n\n### 使用前：无法直接访问内网资源\n```\n你的电脑                    防火墙/NAT                    内网环境\n┌─────────┐                ┌─────────┐                 ┌─────────────┐\n│         │    ❌ 直接访问   │         │                 │  📱 路由器   │\n│  💻 PC  │ ──────────────▶│  🔥🚫   │                 │  📺 NAS     │\n│         │    被阻止/拒绝   │         │                 │  🖥️ 服务器   │\n└─────────┘                └─────────┘                 │  📟 IoT设备  │\n                                                       └─────────────┘\n```\n\n### 使用后：通过SSH跳板访问所有内网资源\n```\n你的电脑              SSH连接(22端口)           跳板机              内网环境\n┌─────────┐          ┌─────────────┐         ┌─────────┐          ┌─────────────┐\n│         │   🔐     │             │  🌐     │         │   ✅     │  📱 路由器   │\n│  💻 PC  │◀────────▶│ gotun代理隧道│◀───────▶│ 🖥️ 跳板机 │◀───────▶│  📺 NAS     │\n│         │  HTTP请求 │   (加密传输) │  SSH    │         │  内网访问 │  🖥️ 服务器   │\n└─────────┘          └─────────────┘         └─────────┘          │  📟 IoT设备  │\n    ↑                                                             └─────────────┘\n    └── 浏览器设置代理: 127.0.0.1:8080\n```\n\n### 🔑 核心优势\n\n| 传统方案 | gotun |\n|---------|-----------|\n| ❌ 需要复杂的端口转发配置 | ✅ 仅需一个SSH连接 |\n| ❌ 每个服务需要单独映射端口 | ✅ 访问所有内网资源无需额外配置 |\n| ❌ 容易暴露内网服务到公网 | ✅ 流量全程加密，安全可靠 |\n| ❌ 管理多个连接复杂 | ✅ 一条隧道解决所有问题 |\n\n**简单来说**: gotun 让你的电脑就像\"坐在\"跳板机旁边一样，可以访问跳板机能访问的任何资源！\n\n---\n\n## 🧱 项目特点\n\n- ✅ 无需在远程主机部署任何代理服务\n- ✅ 全部请求自动通过 SSH 加密隧道传输\n- ✅ 支持访问任何远程主机可访问的地址（含内网）\n- ✅ 支持多级跳板机 (Jump Host)，轻松穿透复杂网络\n- ✅ 支持跨平台运行（Windows / Linux / macOS）\n- ✅ 支持作为系统 HTTP 代理（可选扩展）\n- ✅ 支持 TUN 模式: 支持所有基于 TCP 协议的应用代理\n- ✅ 自定义路由规则: 支持通过自定义的规则文件进行流量分流\n- ✅ 命令行自动补全: 支持 Bash, Zsh, Fish, PowerShell\n\n---\n\n## 🚀 快速开始\n\n### 安装\n\n#### 使用安装脚本\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/Sesame2/gotun/main/scripts/install.sh | sh\n```\n\n脚本会将 `gotun` 安装到 `~/.local/bin` 或 `/usr/local/bin`。安装完成后，请确保安装目录已添加到您的 `PATH` 环境变量中。\n\n#### 使用Homebrew安装 ( macOS / Linux )\n\n```bash\nbrew install gotun\n```\n\n#### 下载预编译二进制文件\n\n前往 [Releases](https://github.com/Sesame2/gotun/releases) 页面下载适合你系统的预编译版本。\n\n#### 从源码编译\n\n```bash\ngit clone https://github.com/Sesame2/gotun.git\ncd gotun\nmake build\n```\n\n编译后的可执行文件位于 `build/` 目录下。\n\n#### 使用 go install 安装\n\nGo 1.17 及以上版本可直接通过以下命令安装：\n\n```bash\ngo install github.com/Sesame2/gotun/cmd/gotun@latest\n```\n\n\u003e **⚠️ 注意**: 使用 `go install` 安装的版本可能无法通过 `--version` 参数正确显示版本号，因为它直接从源码编译，缺少版本信息的注入。为了显示正确的版本信息，推荐使用安装脚本。\n\n安装后，请确保你的 `$GOPATH/bin` 或 `$GOBIN` 目录已添加到系统 `PATH` 环境变量中。\n\n### 基本使用\n\n```bash\n# 基本用法：连接到SSH服务器并启动系统代理\ngotun user@example.com\n\n# 指定SSH端口\ngotun -p 2222 user@example.com\n\n# 使用私钥认证\ngotun -i ~/.ssh/id_rsa user@example.com\n\n# 自定义代理监听端口\ngotun --listen :8888 user@example.com\n\n# 自动设置系统代理（默认开启）\n# 若你希望启动时不修改系统代理，请显式关闭：\ngotun --sys-proxy=false user@example.com\n\n# 开启 SOCKS5 代理 (默认 :1080)\ngotun --socks5 :1080 user@example.com\n```\n\n\u003e **注意**: 使用 SOCKS5 代理配合自定义路由规则时，建议在客户端（如浏览器或代理插件）中开启 \"Proxy DNS when using SOCKS5\" (远程DNS解析) 选项。否则客户端可能会在本地解析域名为 IP，导致基于域名的路由规则失效。\n\n### 在浏览器中使用\n\n启动代理后，在浏览器中配置HTTP代理：\n\n- **代理地址**: `127.0.0.1`\n- **端口**: `8080` (默认，或你指定的端口)\n\n---\n\n## 📖 操作手册\n\n### 命令行参数\n\n| 参数 | 简写 | 说明 | 默认值 |\n|------|------|------|--------|\n| `--http` | | 本地 HTTP 代理监听地址 (别名 `--listen`) | `:8080` |\n| `--listen` | `-l` | [已废弃] 同 `--http` | `:8080` |\n| `--socks5` | | SOCKS5 代理监听地址 | `:1080` |\n| `--port` | `-p` | SSH 服务器端口 | `22` |\n| `--pass` | | SSH 密码 (不安全, 建议使用交互式认证) | |\n| `--identity_file` | `-i` | 用于认证的私钥文件路径 | |\n| `--jump` | `-J` | 跳板机列表,用逗号分隔 (格式: user@host:port) | |\n| `--http-upstream` | | 强制将所有 HTTP 请求转发到此上游 (格式: host:port) | |\n| `--target` | | [已废弃] 同 `--http-upstream` | |\n| `--timeout` | | 连接超时时间 | `10s` |\n| `--verbose` | `-v` | 启用详细日志 | `false` |\n| `--log` | | 日志文件路径 | 输出到标准输出 |\n| `--sys-proxy` | | 自动设置/恢复系统代理 | `true` |\n| `--rules` | | 代理规则配置文件路径 | |\n| `--tun` | | 启用 TUN 模式 (VPN 模式) | `false` |\n| `--tun-global` | `-g` | 启用全局 TUN 模式 (转发所有流量) | `false` |\n| `--tun-ip` | | TUN 设备 CIDR 地址 | `10.0.0.1/24` |\n| `--tun-route` | | 添加静态路由到 TUN (CIDR格式, 可多次使用) | |\n| `--tun-nat` | | NAT 映射规则 (格式: LocalCIDR:RemoteCIDR) | |\n\n### 使用场景\n\n#### 1. 访问内网服务\n\n假设 `jumpserver.company.com` 可以访问内网IP `192.168.1.100`。\n\n```bash\n# 连接到跳板机，启动代理服务\ngotun admin@jumpserver.company.com\n```\n\n启动后，浏览器和其他支持系统代理的应用将自动通过 `gotun` 访问网络。现在可以直接在浏览器中打开 `http://192.168.1.100:8080` 等内网地址。\n\n#### 2. 开发调试\n\n在本地开发时，需要连接到远程开发服务器才能访问数据库或API。\n\n```bash\n# 启用详细日志进行调试，并指定监听端口\ngotun --listen :8888 -v developer@dev-server.com\n```\n\n`gotun` 会自动设置系统代理（指向 `127.0.0.1:8888`）。开发工具如果支持系统代理，将能直接访问远程资源。如果不想影响系统其他应用的联网，可以禁用系统代理并手动配置开发工具：\n`gotun --sys-proxy=false --listen :8888 -v developer@dev-server.com`\n\n#### 3. 作为网络出口\n\n将远程服务器作为你当前网络的出口，适合需要固定IP或访问特定网络资源的场景。\n\n```bash\n# 启动并自动配置为系统代理\ngotun user@proxy-server.com\n```\n\n### 跳板机 (Jump Host)\n\n当目标服务器无法直接访问，需要先登录一台或多台机器进行中转时，可以使用跳板机功能。\n\n#### 工作原理示意图\n```\n你的电脑             SSH隧道             第一跳板机            SSH隧道             最终服务器\n┌─────────┐         ┌───────────┐         ┌──────────┐         ┌───────────┐         ┌──────────┐\n│         │   🔐    │           │    🔐   │          │    🔐   │           │   🌐   │          │\n│  💻 PC  │◀───────▶│  gotun隧道 │◀───────▶│ 堡垒机/跳板机│◀───────▶│gotun隧道 │◀───────▶│ 目标主机 │\n│         │  HTTP请求│ (加密)     │         │          │         │ (加密)     │        │          │\n└─────────┘         └───────────┘         └──────────┘         └───────────┘         └──────────┘\n```\n\n#### 单级跳板机\n\n通过 `jump.host.com` 连接到 `target.server.com`。\n\n```bash\ngotun -J user1@jump.host.com user2@target.server.com\n```\n\n#### 多级跳板机\n\n通过 `jump1` -\u003e `jump2` -\u003e `target` 的顺序连接。\n\n```bash\ngotun -J user1@jump1.com,user2@jump2.com user3@target.com\n```\n\n`gotun` 会依次建立SSH隧道，最终连接到目标服务器。\n\n### 认证方式\n\n#### SSH私钥认证（推荐）\n\n```bash\n# 使用指定私钥文件\ngotun -i ~/.ssh/id_rsa user@example.com\n\n# 使用默认私钥（自动检测 ~/.ssh/ 目录下的密钥）\ngotun user@example.com\n```\n\n#### 密码认证\n\n```bash\n# 交互式输入密码（推荐）\ngotun user@example.com\n# 程序会提示输入密码\n\n# 命令行指定密码（不安全，不推荐）\ngotun --pass yourpassword user@example.com\n```\n\n### 系统代理设置\n\n默认情况下 (`--sys-proxy=true`)，`gotun` 会自动管理您操作系统的 HTTP 代理。如果您不希望 `gotun` 修改您的系统设置，可以在启动时使用 `--sys-proxy=false` 参数来禁用此功能。\n\n当系统代理功能开启时，程序会：\n\n1. **启动时**: 保存当前系统代理设置，然后设置为使用 gotun 代理\n2. **运行中**: 所有系统网络流量通过 gotun 代理\n3. **退出时**: 自动恢复原始的系统代理设置\n\n支持的操作系统：\n\n- ✅ **macOS**: 通过 `networksetup` 命令配置\n- ✅ **Windows**: 通过注册表配置\n- ✅ **Linux**: 通过 GNOME 设置和环境变量配置\n\n### 自定义路由规则 (高级)\n\n`gotun` 支持通过一个兼容 Clash 格式的 YAML 规则文件，来精细化地控制哪些网络请求通过 SSH 代理，哪些则直接连接。这对于希望同时访问内网资源（直连）和外部资源（代理）的场景非常有用。\n\n#### 1. 创建规则文件\n\n首先，创建一个规则文件，例如 `rules.yaml`：\n\n```yaml\n# rules.yaml\n# 模式: rule (规则模式), global (全局代理), direct (全局直连)\nmode: rule\n\n# 规则列表 (从上到下匹配，第一个匹配的规则生效)\nrules:\n  # 规则：让公司内网和常用国内网站直连\n  - DOMAIN-SUFFIX,internal.company.com,DIRECT\n  - IP-CIDR,10.0.0.0/8,DIRECT\n  - IP-CIDR,192.168.0.0/16,DIRECT\n  - DOMAIN-SUFFIX,cn,DIRECT\n  - DOMAIN-SUFFIX,qq.com,DIRECT\n\n  # 规则：让特定服务走代理\n  - DOMAIN-SUFFIX,google.com,PROXY\n  - DOMAIN-SUFFIX,github.com,PROXY\n\n  # 规则：所有其他未匹配的流量都走代理\n  - MATCH,PROXY\n```\n\n#### 2. 启动 gotun\n\n使用 `--rules` 参数指定规则文件的路径来启动 `gotun`。\n\n```bash\ngotun --rules ./rules.yaml user@your_ssh_server.com\n```\n\n现在，当您访问 `internal.company.com` 时，流量会直接发送；而访问 `google.com` 时，流量则会通过 SSH 隧道代理。\n\n\n### TUN 模式 (高级)\n\ngotun 可以在本地创建一个虚拟网卡，将所有（或指定）TCP 流量拦截并通过 SSH 隧道透明传输。这使得不支持代理设置的软件也能通过 SSH 隧道访问远程资源。\n\n#### 为什么使用 TUN 模式？\n\n- **全应用代理**: 完美支持 **RDP 远程桌面**、**数据库连接** (MySQL/PostgreSQL)、**Redis** 等基于 TCP 的应用层协议。\n- **无需配置**: 启用全局模式后，所有 TCP 流量自动走代理，无需在软件中逐个配置代理。\n- **网络映射**: 可以将远程内网的整个网段映射到本地，解决本地与远程网段冲突的问题。\n\n\u003e **⚠️ 注意**: 当前版本的 TUN 模式仅支持 **TCP 协议**。不支持 UDP 流量和 ICMP 协议（因此无法使用 `ping` 命令测试连通性，请使用 `telnet` 或 `nc -vz` 测试 TCP 端口）。\n\n#### 核心参数\n\n| 参数 | 简写 | 说明 |\n|------|------|------|\n| `--tun` | | 显式启用 TUN 模式 (通常配合路由参数自动启用，可省略) |\n| `--tun-global` | `-g` | **全局模式**：接管本机所有网络流量 (自动处理网关防止 SSH 断连) |\n| `--tun-route` | | **指定网段代理**：仅将指定网段路由到 TUN (支持 CIDR，可多次使用) |\n| `--tun-nat` | | **NAT 网段映射**：将本地网段映射到远程网段 (格式 `LocalCIDR:RemoteCIDR`) |\n| `--tun-ip` | | 指定 TUN 设备的内部 IP (默认 `10.0.0.1/24`) |\n\n#### 使用示例\n\n**1. 全局模式**\n\n将本机所有流量通过远程服务器转发。\n\n\u003e **⚠️ 警告**: 启动虚拟网卡可能会与 Clash、ZeroTier 等同样操作网卡或路由表的软件产生冲突。请谨慎使用全局 TUN 模式，建议优先使用指定网段代理模式。\n\n```bash\n# -g 自动启用 TUN 模式\nsudo gotun -g user@server.com\n```\n\n**2. 指定网段代理**\n\n仅将指定网段的流量放入隧道，其他流量直连。例如，只有访问 `10.0.0.0/24` 网段的流量才通过 SSH 隧道：\n\n```bash\n# 访问 10.0.0.x 的流量走 SSH，其他走本地\nsudo gotun --tun-route 10.0.0.0/24 user@server.com\n```\n\n**3. NAT 网段映射**\n\n解决网段冲突问题。例如：你需要访问的远程目标网段为 `192.168.0.0/24`，但你本地也有物理网卡或其他网络环境使用了 `192.168.0.0/24`。为了避免冲突，可以将远程的 `192.168.0.0/24` 映射到本地的一个无冲突网段（如 `10.0.0.0/24`）。\n\n```bash\n# 访问本地 10.0.0.1 -\u003e 自动 NAT 到远程 192.168.0.1\nsudo gotun --tun-nat 10.0.0.0/24:192.168.0.0/24 user@server.com\n```\n\n\u003e **注意**: \n\u003e - **权限**: TUN 模式需要 `sudo` (macOS/Linux) 或管理员权限 (Windows)。\n\u003e - **Windows 用户**: 首次运行时会自动释放 `wintun.dll`，无需手动安装驱动。\n\n**4. RDP 远程桌面连接示例**\n\n场景：你需要远程桌面连接到位于 `192.168.2.0/24` 网段的 Windows 机器（IP: `192.168.2.1`），但该网段无法直接访问。你有一台位于同一网段的 Linux 服务器（IP: `192.168.2.2`）开启了 SSH 服务。\n\n```bash\n# 将 192.168.2.0/24 网段的流量通过 SSH 隧道转发\nsudo gotun --tun-route 192.168.2.0/24 user@192.168.2.2\n```\n\n启动后，你就可以直接打开 Windows 远程桌面客户端，输入 `192.168.2.1` 进行连接，就像你在同一个局域网内一样。\n\n\n---\n\n\n## 🎯 功能状态\n\n- [x] **HTTP 代理**: 完整的 HTTP 请求代理\n- [x] **HTTPS 代理**: 支持 CONNECT 方法的 HTTPS 隧道\n- [x] **SSH 私钥认证**: 支持多种私钥格式\n- [x] **自动配置系统代理**: 跨平台系统代理设置\n- [x] **交互式密码输入**: 安全的密码认证方式\n- [x] **详细日志记录**: 支持调试和故障排除\n- [x] **跨平台支持**: Windows/Linux/macOS\n- [x] **命令行界面**: 完整的 CLI 参数支持\n- [x] **跳板机 (Jump Host)**: 支持单级和多级SSH跳板机\n- [x] **自定义路由规则**: 支持自定义的规则文件进行流量分流\n- [x] **命令行自动补全**: 基于 Cobra 的智能提示\n- [x] **SOCKS5 代理支持**: 更广泛的协议支持\n- [x] **TUN 模式**: L3 级 VPN 支持 (全局/规则/NAT)\n- [ ] **托盘 GUI 界面**: 图形化用户界面\n- [ ] **配置文件导出/导入**: 配置管理功能\n- [ ] **连接池优化**: 提升性能和稳定性\n- [ ] **统计和监控**: 流量统计和连接监控\n\n---","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsesame2%2Fgotun","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsesame2%2Fgotun","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsesame2%2Fgotun/lists"}