
内网穿透完全指南把本机服务安全暴露到公网1. 先理解原理到底发生了什么内网穿透的本质是借助一台有公网IP的中间服务器在NAT设备上维持一条可用的双向通道。具体流程你的内网机器 公网服务器 外部用户(客户端) (服务端)│ │ ││──1.建立长连接──────→ │ ││ (WebSocket/TCP) │ ││ │──2.监听公网端口 ││ │ ││ │←────3.访问请求────────││ │ example.com:8080 ││ │ ││←──4.通过隧道转发──── │ ││ 请求数据 │ ││ │ ││──5.返回响应────────→ │──6.返回给用户────────→│核心问题是 NAT——网络地址转换。你的机器躲在路由器后面只有内网 IP如 192.168.x.x外网无法直接发起连接。内网穿透通过「主动外联 中继转发」绕过这个限制。2. 方案选型一张表决策场景推荐工具理由临时演示、调试ngrok / bore一行命令零配置长期使用、自定义域名frp自建服务端完全掌控生产环境、高并发租用公网服务器 Nginx 反代无中继损耗性能最优P2P 直连、大流量ZeroTier / Tailscale打洞成功后点对点不限速只暴露 Web 服务Cloudflare Tunnel免费、自带 CDN 和 DDoS 防护3. 方案一frp——自建服务端完全掌控适用场景你有一台公网服务器想长期、稳定地暴露多个内网服务。3.1 架构内网机器 (frpc) ────── 公网服务器 (frps) ────── 用户3.2 服务端部署 (frps)在公网服务器上# 下载 frp替换为最新版本号wgethttps://github.com/fatedier/frp/releases/download/v0.52.3/frp_0.52.3_linux_amd64.tar.gztar-xzffrp_0.52.3_linux_amd64.tar.gzcdfrp_0.52.3_linux_amd64编辑frps.tomlbindPort 7000 # frpc 连接的端口 vhostHTTPPort 8080 # HTTP 虚拟主机端口 vhostHTTPSPort 8443 # HTTPS 虚拟主机端口 # 管理面板可选 webServer.addr 0.0.0.0 webServer.port 7500 webServer.user admin webServer.password your_password_here # 身份验证 auth.token your_secure_token_here启动./frps-cfrps.toml# 或使用 systemd 守护推荐# 自行编写 /etc/systemd/system/frps.service3.3 客户端部署 (frpc)在你的内网机器上同样下载 frp编辑frpc.tomlserverAddr 你的公网服务器IP serverPort 7000 auth.token your_secure_token_here # 示例1暴露本机 3000 端口的 Web 服务 [[proxies]] name my-nextjs-app type http localPort 3000 customDomains [dev.yourdomain.com] # 示例2暴露本机 SSH22端口 [[proxies]] name ssh type tcp localIP 127.0.0.1 localPort 22 remotePort 6000 # 公网服务器上的 6000 端口会映射到你的 SSH启动./frpc-cfrpc.toml现在访问dev.yourdomain.com就会进入你的本地 3000 端口。记得把域名 A 记录指向你的公网服务器。3.4 HTTPS 和自动证书frp 支持自动申请 Let’s Encrypt 证书在frps.toml中追加vhostHTTPSPort 443 # 自动 HTTPS autoTLS true tlsCertFile /path/to/cert.pem tlsKeyFile /path/to/key.pem或者让每个代理单独配置 TLS。4. 方案二Cloudflare Tunnel —— 零运维的 Web 穿透适用场景你不想买服务器只需要暴露 HTTP 服务且有域名。4.1 原理Cloudflare 在你内网机器和它的边缘节点之间建立一条隧道用户请求到边缘节点后通过隧道转发给你整个过程自带 CDN、DDoS 防护和 HTTPS。4.2 实操# 1. 安装 cloudflaredbrewinstallcloudflare/cloudflare/cloudflared# macOS# 或从 GitHub Releases 下载二进制# 2. 登录授权cloudflared tunnel login# 这会打开浏览器授权 Cloudflare 访问你的域名# 3. 创建隧道cloudflared tunnel create my-tunnel# 会生成一个 credentials.json妥善保管# 4. 配置 DNS 指向隧道cloudflared tunnel route dns my-tunnel app.yourdomain.com# 5. 编写配置 config.ymlconfig.ymltunnel:tunnel-idcredentials-file:/path/to/credentials.jsoningress:-hostname:app.yourdomain.comservice:http://localhost:3000-hostname:api.yourdomain.comservice:http://localhost:8080# 默认规则必须-service:http_status:404# 6. 启动隧道cloudflared tunnel run my-tunnel# 守护进程运行cloudflaredserviceinstall5. 方案三Tailscale —— 不是穿透胜似穿透Tailscale 基于 WireGuard 构建 mesh 网络设备间点对点直连没有中心服务器转发流量。这不是传统意义上的内网穿透但效果一样——你可以在任何地方访问你的内网机器。# 各设备安装 Tailscale 并登录同一账号curl-fsSLhttps://tailscale.com/install.sh|shtailscale up之后所有设备都在同一个100.x.y.z的虚拟网段内直连访问不经过中继跑满带宽。缺点访问方也必须装 Tailscale 客户端。6. 安全清单上线前必查在做内网穿透时你实际上是把内网服务暴露了出去。务必frp token 足够强——不要用默认或弱密码限制 IP 访问——frp 支持allowUsers/allowPorts内网服务本身要鉴权——不要把没密码的数据库端口暴露出去使用 HTTPS——避免中间人frp 和 Cloudflare Tunnel 都支持不要把 SSH 端口裸奔——如果暴露 SSH务必使用密钥认证 禁用密码登录审计日志——frp 有logFile配置开启并定期检查最小权限原则——只暴露必要的端口用完即关7. 常见问题排查Qfrpc 连接不上 frps检查公网服务器防火墙是否放行 7000 端口检查 token 是否一致检查服务器是否真的能访问telnet 服务器IP 7000Q域名可以 ping 通但无法访问HTTP 服务需要域名绑定检查customDomains配置检查 DNS 是否解析到正确的服务器 IPQ速度慢frp 受限于公网服务器带宽考虑 P2P 方案Tailscale/ZeroTier或购买更好的服务器QCloudflare Tunnel 延迟高正常现象流量绕了 Cloudflare 边缘节点对延迟敏感的服务建议用 frp 直连这份指南涵盖了从临时代码演示到生产环境部署的全场景选对方案内网穿透其实很简单。