Gitea 私有仓库外网访问方案:不暴露端口、不装 VPN,安全管理代码仓库(gitea 代码托管平台) szthrk.cn

着企业对代码安全的重视,越来越多公司选择在内网部署 Gitea 私有仓库,将代码托管在自己的服务器上,避免代码泄露风险。

但内网部署也带来了新的问题:员工离开公司办公网后,就无法访问代码仓库了。居家办公、出差、临时值班时,想查看某个 PR 的审批进度、最近几次提交改了什么、Issue 是否已分配,都变得非常不便。

传统解决方案要么是全员 VPN,要么是直接将 Gitea 端口映射到公网,但这两种方案都有明显的痛点。

一、传统方案的痛点

1. 直接暴露 Gitea 端口

将 Gitea 的 Web 端口(3000)或 SSH 端口(22)直接映射到公网,虽然访问方便,但安全风险极高。代码托管服务暴露在公网上,会持续面临扫描器探测、暴力破解、撞库等攻击。一旦账号或 Token 泄露,整个代码库都可能面临被拖库的风险。

2. 全员 VPN 方案

通过 VPN 让员工接入内网后访问 Gitea,安全性确实更高,但运维成本也更高。客户端配置复杂、权限管理粒度粗、客户端版本兼容问题多,对于临时值班人员、外包人员来说,为了看一眼代码记录就要装 VPN,门槛太高。而且 VPN 一旦接入,相当于开放了整个内网的访问权限,安全粒度不够精细。

有没有一种方案,既能让员工在外网方便地访问代码仓库信息,又不需要暴露整个 Gitea 服务,也不需要配置 VPN?

答案是有的:通过 MCP 协议 + 内网穿透,只开放受控的 API 查询入口,而不是暴露整个仓库服务。

二、方案原理

这套方案的核心思路是:不开放整个 Gitea 服务,只暴露一个受控的查询接口。

具体来说,在内网服务器上部署 Gitea 官方的 MCP Server(gitea-mcp),它通过 Gitea REST API 提供仓库查询、分支管理、PR 操作等能力。然后通过 ZeroNews 内网穿透平台,给这个 MCP Server 分配一个固定的公网 HTTPS 地址。

整体架构如下:

外网用户(Cursor客户端)

↓ HTTPS加密连接

ZeroNews公网端点

↓ 加密隧道

内网MCP Server(127.0.0.1:8004)

↓ 本地回环调用

内网Gitea API(127.0.0.1:3000)

在这个架构中:

  • Gitea 的 Web 端口和 SSH 端口全程不对公网开放,只在内网运行
  • 公网能访问到的只有 MCP Server 的 HTTPS 端点
  • MCP Server 只监听本机回环地址,外部无法直接访问
  • 所有公网访问都经过 ZeroNews 的安全策略过滤

三、配置步骤

第一步:安装 ZeroNews 客户端

在安装内网 Gitea 的 Ubuntu 服务器上安装 ZeroNews 客户端

登录 ZeroNews 控制台,在快速开始页面选择 Linux,复制在线安装命令:

curl -SLk https://download.zeronews.cc/linux/zeronews-install.sh | sudo sh -s install <你的AuthToken>

再以系统服务方式后台启动:

sudo zeronews service start

安装完成后,登录 ZeroNews 控制台确认客户端状态为在线。

第二步:Gitea 生成访问令牌

登录内网 Gitea,进入「设置」→「应用」页面,生成新的访问令牌。权限需勾选仓库、Issue、Pull Request 相关权限,保存好生成的 Token。

第三步:安装并启动 Gitea MCP Server

在 Ubuntu 上依次安装 Node.js(mcp-proxy)和 gitea-mcp 二进制:

sudo apt-get update sudo apt-get install -y ca-certificates curl tar # 1. Node.js 20.x curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - sudo apt-get install -y nodejs node -v && npx -v npx -y mcp-proxy --help # 2. 官方 gitea-mcp curl -fsSL -o /tmp/gitea-mcp.tgz \ "https://gitea.com/gitea/gitea-mcp/releases/download/v1.8.0/gitea-mcp_Linux_x86_64.tar.gz" sudo tar -xzf /tmp/gitea-mcp.tgz -C /usr/local/bin gitea-mcp sudo chmod +x /usr/local/bin/gitea-mcp gitea-mcp --help

配置 Token 并以 HTTP(SSE)启动

安装完成后,通过系统变量配置 Gitea Token 。

export GITEA_ACCESS_TOKEN='你的只读Token'

利用 npx 启动 gitea-mcp, gitea-mcp 通过 Gitea REST API 查询仓库、提交、分支、PR、Issue 等;mcp-proxy 在前端监听 8004。

# 在 8004 端口暴露 gitea-mcp npx -y mcp-proxy --host 127.0.0.1 --port 8004 -- \ gitea-mcp -transport stdio -host http://127.0.0.1:3000

mcp-proxy 的 8004 都只监听本机:127.0.0.1。gitea-mcp 经回环地址调 Gitea API;Gitea 不必对公网或办公网其他网段开放 3000。

第四步: 在 ZeroNews 控制台上添加 Gitea MCP Server 隧道

登录 ZeroNews 控制台:

在「自定义域名」页面添加一个域名,例如 giteamcp

在「隧道管理」页面新建 HTTPS 隧道,参数如下:

配置完成后,即可通过 https://giteamcp.你的域名/sse 访问内网 MCP 服务。

第五步:Cursor 客户端配置

打开 Cursor,进入 Settings → MCPs → New MCP Server,在配置文件中添加:

{ "mcpServers": { "giteamcp": { "url": "https://giteamcp.你的域名/sse", "type": "sse" } } }

gitea mcp 配置好后,就可以通过 Cursor 中连接使用了

四、使用示例

配置完成后,在 Cursor 的 Agent 对话框中,通过自然语言即可查询和操作内网仓库:

  • 查看仓库列表:用 giteamcp,列出 gitea 中的所有仓库

  • 查看提交记录:用 giteamcp,查看 nkos 仓库 main 分支最近 10 条提交

  • 提交 PR:用 giteamcp,将 nkos 仓库的 test 分支合并到 main,提一个 PR

  • 新建分支:用 giteamcp,在 nkos 仓库基于 test 分支新建 test-1010 分支

全程无需打开 Gitea 网页,无需连接 VPN,在外网即可完成常规的仓库查询和操作。

五、安全加固措施

MCP 服务通过隧道映射到公网后,虽然攻击面远小于直接暴露 Gitea,但仍需配置访问控制策略。ZeroNews 提供了多层安全防护,可以叠加使用:

Basic 认证:连接 MCP 隧道前需输入账号密码验证,通过后方可调用接口

IP 白名单:只允许指定 IP 地址(如公司出口 IP、家庭固定 IP)访问,其他来源直接拒绝

区域访问控制:可限制只允许特定国家或省份的 IP 访问,过滤大部分海外扫描流量

这三层防护叠加后,公网暴露的风险可降至极低水平。更何况,即使攻击者突破了 MCP 入口,也只能通过 API 做有限操作,无法直接克隆仓库或遍历文件系统,Gitea 本体依然安全。

六、方案总结

这套方案的核心价值在于:在不暴露 Gitea 服务、不配置 VPN 的前提下,实现了外网对内网代码仓库的安全访问。

特别适合以下场景:

  • 中小企业团队,没有专职运维搭建 VPN 网关
  • 有居家办公或远程协作需求的团队
  • 有外包人员或临时项目,需要精细控制访问权限
  • 对代码安全要求高,不愿将 Git 仓库暴露在公网

通过 MCP 协议将仓库操作抽象为 API 调用,再通过企业级内网穿透平台提供受控的公网访问入口,安全与效率终于可以兼得。