数据库通常在公司内网,而 Cursor、Claude Code、Codex 这类 AI Agent 运行在本地或公网。让 Agent 基于真实数据工作,关键问题不是「AI 会不会写 SQL」,而是「怎么安全地让 AI 触达内网数据库」。
本文给出一个可直接复现的工程方案:数据库 MCP + HTTPS 内网穿透。公网只暴露一个带安全策略的 MCP 入口,数据库本身不暴露。按「方案对比 → 架构 → 五步实操 → 安全边界」展开。
01 方案对比
方案 |
优点 |
风险 / 成本 |
把 3306/5432 映射公网 |
简单直接 |
暴露在全球扫描与暴力破解之下,账号泄露即整库风险 |
VPN 全员接入 |
终端统一接入内网 |
安装、策略与外包账号运维成本高,临时值班 / 外包偏重 |
数据库 MCP + HTTPS 穿透 |
公网只暴露 MCP 入口,数据库仍内网访问 |
需要正确配置安全策略(IP / Basic / 区域) |
核心原则:数据库不暴露,暴露的只是一个带安全策略的 MCP 入口。收益是攻击面大幅缩小,代价是必须认真配置入口安全,不能只建隧道不加策略。
02 架构与安全边界
整体链路:Cursor(本地)→ ZeroNews HTTPS 隧道(公网)→ 内网 MCP Server(mcp-proxy,监听 8002/8003)→ MySQL / PostgreSQL(内网,不暴露端口)。
ZeroNews 内网穿透(零讯)是一个企业级安全内网穿透与反向代理平台,几分钟即可为内网 MCP Server 提供固定 HTTPS 公网端点,用户侧无需安装客户端软件;并支持 IP 黑白名单、BasicAuth、地址围栏等策略叠加,把公网访问范围限制在可控区间。
03 实操:五步接入
前置条件:Linux 服务器一台(以 Ubuntu 为例);内网可访问的 MySQL / PostgreSQL 数据库,建议最小权限只读账号;ZeroNews 账号与客户端;本地 Cursor。
第 1 步:安装 ZeroNews 客户端
在运行 MCP Server 的 Linux 服务器上,登录 ZeroNews 控制台 → 快速开始 → Linux,复制安装命令(Token 替换为你自己的):
curl -SLk https://download.zeronews.cc/linux/zeronews-install.sh | sudo sh -s install <你的安装Token>
后台启动并确认在线:
zeronews service start
第 2 步:安装 Node.js / npx
sudo apt-get update sudo apt-get install -y ca-certificates curl gnupg curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - sudo apt-get install -y nodejs node -v # 应类似 v20.x.x npm -v npx -v
第 3 步:安装并启动 MySQL / PostgreSQL 能力包
MySQL(8002 端口):
npm install -g @benborla29/mcp-server-mysql export MYSQL_HOST=127.0.0.1 export MYSQL_PORT=3306 export MYSQL_USER=readonly_user export MYSQL_PASS='你的密码' export MYSQL_DB=your_database npx -y mcp-proxy --host 127.0.0.1 --port 8002 -- npx -y @benborla29/mcp-server-mysql
PostgreSQL(8003 端口,与 MySQL 并存时用不同端口;该能力包默认只读,带行数上限与语句超时):
npm install -g @database-mcp/postgres export POSTGRES_HOST=127.0.0.1 export POSTGRES_PORT=5432 export POSTGRES_USER=readonly_user export POSTGRES_PASSWORD='你的密码' export POSTGRES_DATABASE=your_database npx -y mcp-proxy --host 127.0.0.1 --port 8003 -- npx -y @database-mcp/postgres
第 4 步:添加固定域名与 HTTPS 隧道
ZeroNews 控制台 → 自定义域名 → 添加域名(如 mydb25、pgdb25);再 → 隧道管理 → 添加隧道,参数:协议 HTTPS,内网 IP 127.0.0.1,内网端口 8002 / 8003,绑定设备选安装 MCP Server 的客户端,公网域名选刚添加的域名,带宽 2M。
完成后即可通过 https://mydb25.hn.takin.cc/sse、https://pgdb25.hn.takin.cc/sse 连接对应 MCP Server。MySQL 与 PostgreSQL 各用一条隧道、各用一个域名,便于分环境使用。
第 5 步:在 Cursor 中配置 MCP
Cursor 设置 → Customize → MCPs → New MCP Server,在 mcp.json 填入隧道地址:
{ "mcpServers": { "mydb25": { "url": "https://mydb25.hn.takin.cc/sse" }, "pgdb25": { "url": "https://pgdb25.hn.takin.cc/sse" } } }
Reload Window 后,mydb25、pgdb25 状态为「已连接 / 绿灯」即正常。
04 查询示例
在对话里写清 MCP 名称,Agent 才会经隧道调内网能力包,而不是在本地编造 SQL:
MySQL 开发与联调:用 mydb25,在 userdb 先 DESCRIBE users 或查 INFORMATION_SCHEMA 看字段与索引;再 SELECT id, username, email, created_at FROM users WHERE id = 10001 LIMIT 1。只读。
MySQL 排障与值班:用 mydb25,按订单号 ORD-20250328-001 联查 orders 与 payments:orders 看 status、updated_at、pay_channel;payments 看同 order_no 的 status、amount、paid_at。不要 UPDATE。
PostgreSQL 轻量统计:用 pgdb25,在 userpgdb 的 login_audit 表统计过去 24 小时 action=login_failed 按 ip 聚合次数,ORDER BY count DESC LIMIT 10。
PostgreSQL 注册趋势:用 pgdb25,按 DATE(created_at) 汇总 users 在 2026-03-28 至 2026-04-01 的注册人数,ORDER BY 日期,LIMIT 31。
05 安全配置与三条边界
MCP Server 映射公网后,任何人都能扫描到入口。上线前至少叠加三项策略:Basic 认证(先认证再连接)、IP 白名单(只允许指定 IP)、区域访问控制(只允许指定国家 / 省份),三项在 ZeroNews 控制台即可配置。
同时记住三条安全边界:「不暴露数据库端口」不等于零风险,账号至少用最小权限只读账号;开发库与生产库不要共用同一入口,隧道、域名、权限分开;对话里写清 MCP 名称,AI 才会真查库。
06 使用场景
排障与值班:用户反馈「订单卡在某状态」,让 Agent 查 orders 表并结合日志一起解释;活动或优惠券异常时,让 Agent 统计失败原因字段分布(LIMIT 100),但要控制结果集大小;怀疑复制延迟时,在账号有权限的前提下查 SHOW REPLICA STATUS,与 Shell MCP 互补。
开发与联调:新同事问表结构,Agent 用 INFORMATION_SCHEMA / DESCRIBE 对照 ORM 与真实表;写复杂 SQL 前先探路 JOIN 关系,基于真实外键生成草稿;联调时确认 staging 库测试用户——这类查询只应对开发库隧道开放,不要对生产复用同一入口。
数据与分析:运营临时要「上周注册用户数按天」,简单 GROUP BY 即可,复杂报表仍走 BI;对账前让 Agent 抽样核对未结算账单字段。
小结
判断一个数据库接入方案能不能用,看三件事:数据库有没有暴露公网、入口有没有访问控制、账号是不是最小权限。三条都满足,才值得放进生产环境。
需要提醒的是,MCP + 内网穿透解决的是「安全可达」问题,不是「权限治理」问题:它把暴露面从数据库端口收窄到 MCP 入口,但入口背后的账号权限、审计与配额仍需按数据库规范管理。方案适合开发联调、值班排障、轻量分析三类场景;复杂报表与高风险写操作,建议仍走 BI 与人工流程。