内网穿透介绍
2025-10-13
1340 字约 5 分钟
...
1. 简要概念与为什么需要内网穿透
大多数家庭/公司网络在私有网(RFC1918)后面,通过 NAT 共享一个公网 IP。NAT 允许内网对外发起连接,但阻止公网主动连入。内网穿透就是建立从公网到内网的可达通道,常用于:Webhook 回调、远程演示、远程管理、IoT 设备接入、远程调试等。
2. 核心原理(三行总结)
- 反向连接:内网主动连到公网穿透服务器,建立一条"回路"。
- 中继/代理:穿透服务器把外部流量中继到内网。
- P2P 打洞:尝试直接建立点对点(WebRTC/STUN),失败再回退到中继(TURN)。
3. 方案速览(对比 + 场景)
- 路由器端口转发 — 最简单;需路由器权限;适合单机/家用。
- 反向 SSH(ssh -R) — 简单、安全、适合临时演示/调试。
- ngrok / localtunnel / cloudflared — 零运维,快速分享;生产慎用(限流/隐私)。
- frp / gost / 自建隧道 — 可控、可扩展;需运维。
- WireGuard / Tailscale / ZeroTier — VPN 风格,长期、稳定、像局域网访问。
- WebRTC (STUN/TURN) — P2P 实时场景(音/视频、低延迟),实现复杂。
4. 可复制实战配置(关键代码与解释)
下面的配置都直接可复制粘贴到终端或配置文件,按注释替换域名/IP/用户名即可。
4.1 反向 SSH(临时 + systemd 自动重连)
- 场景:开发演示、Webhook 测试、小规模临时暴露。
- 要点:确保
bastion(公网服务器)/etc/ssh/sshd_config中GatewayPorts yes。
在内网机器上直接运行(后台保持):
ssh -N -o ServerAliveInterval=60 -o ServerAliveCountMax=3 -R 0.0.0.0:9000:localhost:3000 ubuntu@bastion.example.com
systemd 自动重连示例(/etc/systemd/system/reverse-ssh.service):
[Unit]
Description=Reverse SSH tunnel to bastion
After=network-online.target
[Service]
User=youruser
Environment="REMOTE_USER=ubuntu"
Environment="REMOTE_HOST=bastion.example.com"
Environment="REMOTE_PORT=9000"
Environment="LOCAL_PORT=3000"
ExecStart=/usr/bin/ssh -N -o ServerAliveInterval=60 -o ServerAliveCountMax=3 -R 0.0.0.0:${REMOTE_PORT}:localhost:${LOCAL_PORT} ${REMOTE_USER}@${REMOTE_HOST}
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
启用:
sudo systemctl daemon-reload
sudo systemctl enable --now reverse-ssh.service
4.2 frp(自建穿透 — 推荐自托管)
- 场景:长期自托管、映射多个服务、需要域名映射与性能可控。
- 组件:
frps(公网服务器),frpc(内网客户端)。
frps.ini(放在公网服务器)
[common]
bind_port = 7000
vhost_http_port = 8080
dashboard_port = 7500
dashboard_user = admin
dashboard_pwd = strongpassword
# 为安全建议使用 token 或 TLS(见文档)
启动:
./frps -c ./frps.ini
frpc.ini(放在内网主机)
[common]
server_addr = <FRPS_PUBLIC_IP>
server_port = 7000
token = your-secret-token
[web]
type = http
local_port = 3000
custom_domains = demo.example.com
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000
运行:
./frpc -c ./frpc.ini
4.3 Cloudflare Tunnel(cloudflared)
cloudflared tunnel --url http://localhost:3000 --hostname demo.example.com
4.4 ngrok / localtunnel
ngrok http 3000
npx localtunnel --port 3000
4.5 WireGuard(VPN 风格)
# 服务端
[Interface]
Address = 10.0.0.1/24
ListenPort = 51820
PrivateKey = <SERVER_PRIVATE_KEY>
# 客户端
[Interface]
Address = 10.0.0.2/24
PrivateKey = <CLIENT_PRIVATE_KEY>
[Peer]
PublicKey = <SERVER_PUBLIC_KEY>
Endpoint = <SERVER_PUBLIC_IP>:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25
5. 后端获取真实客户端 IP
func RealClientIP(c *gin.Context) string {
if xff := c.Request.Header.Get("X-Forwarded-For"); xff != "" {
parts := strings.Split(xff, ",")
return strings.TrimSpace(parts[0])
}
if rip := c.Request.Header.Get("X-Real-IP"); rip != "" {
return rip
}
return c.ClientIP()
}
6. 故障排查要点
- 检查端口、DNS、防火墙
- 检查本地服务是否监听
- 检查代理层转发头是否正确
- 启用 keepalive 与自动重连
7. 安全与运维必读清单
- ✅ 使用认证(SSH key / token / mTLS)
- ✅ 使用加密(TLS / WireGuard)
- ✅ 最小暴露(仅开放必要端口)
- ✅ 启用日志与监控
- ✅ 自动重连与证书轮换
8. 场景化选择建议
场景 推荐方案
临时演示 / Webhook ssh -R / ngrok / cloudflared 长期自托管 frp + Nginx/Traefik 多设备长期访问 Tailscale / WireGuard 实时音视频 WebRTC (STUN/TURN)
9. 常见误区
- ❌ 端口暴露 = 安全漏洞入口
- ❌ X-Forwarded-For 可伪造
- ❌ 免费隧道 ≠ 稳定可控
- ✅ 自动化 + 加密 + 限权 才是安全基础
如果您觉得这篇文章有帮助,请点个赞吧~
相关文章
更多文章 →http-网络2025-10-27
frp-内网穿透详解
1\. 简介与工作原理 frp(Fast Reverse Proxy)是一个高性能的反向代理 / 内网穿透工具。典型部署模式: 在 公网 VPS 上运行 (服务端),监听来自 的 出站持久连接 (控制端口,通常 7000)。 在 内网机器 上运行 (客户端),与 frps 建立长连接并注册若干映射(如 tcp/http)。 当外部请求到达 frps(公网),frps 根据路由规则把流量转发回对应的 frpc 连接,再由 frpc 转发到...
学习
http-网络2025-08-06
按下回车后网页是怎么出来的
当你在浏览器中输入一个网址,比如 ,然后按下回车键,几秒钟后页面就完整地呈现在你眼前。这个看似简单的操作,背后其实是一整套精密协作的网络机制在起作用。本文将带你从基础讲起,理解 Web 开发中最重要的网络知识,帮助你搞清楚: 数据是如何从服务器传到你的电脑,并最终变成网页的? 一、互联网通信的分层模型:OSI 七层模型 为了管理复杂的网络通信,工程师们提出了一个通用的参考模型—— OSI 七层模型 。它把整个通信过程划分为七个层次,每一...
学习面试
http-网络2025-06-20
MQTT与HTTP在物联网中的比较:为什么MQTT是更好的选择
简介: 通过上述分析,可以看出MQTT在物联网应用中的确是更好的选择。其高效的通信模型、低带宽消耗、稳定的连接保持机制以及可靠的消息质量保证,使其在各种物联网场景中都能表现出色。开发者在设计和实现物联网系统时,应优先考虑采用MQTT协议,以充分发挥其在资源受限环境下的优势,提升系统的整体性能和可靠性。 【杂谈】 MQTT与HTTP在物联网中的比较:为什么MQTT是更好的选择 在物联网(IoT)应用中,选择合适的通信协议是实现高效、可靠数...
学习
http-网络2025-03-04
网络代理详解
一、 的基础概念 1\. 什么是代理? 代理是一种通过中间服务器来帮助 访问目标服务器的技术。代理服务器位于客户端与服务器之间,充当两者的中介,从而实现客户端和服务器之间的隔离。用户的所有请求经过代理后,再发往目标服务器,而目标服务器的响应则返回代理,再由代理传递给用户。 2\. 网络代理的工作流程 在基本的网络代理工作流程中, 扮演了“请求转发者”和“响应返回者”的角色: 1. 客户端请求 :客户端将请求发送到代理服务器,而不是直接发...
学习面试
http-网络2024-11-29
没有koa的cors你怎么处理跨域?
关联问题: JSONP有何局限性 CORS如何处理复杂请求 代理在生产环境效果如何 前言 “金九银十”的秋招,就像是落进池塘的羽毛,连点水花都没砸起来。已读不回是常态,能给面试已是情分,能拿offer的更是少之又少。可怜我在寒潮来临的深秋之际,也只得哀叹一句“越来越冷了啊...” 不过人总是要吃饭的,所以再怎么冷,卖炭翁也得卖炭,牛马攻城狮也得“攻城”,既是为了填饱肚子,也是为了“春天”做准备。所以今天为各位前端工程狮细聊一下前端面试中...
学习面试
http-网络2024-09-11
面试常客系列之跨域前言
跨域?什么是跨域呢?我们先来看看一个url的组成, ,这一个url我们可以分成四部分来看 是协议, 是域名, 是端口, 是路径.在浏览器中,我们从一个域名发送请求到另一个域名,如果两个域名的协议,域名,端口三部分只要存在一部分不同就会发生跨域,也就是说只有两个域名的协议,域名,端口都相同才会不会发生跨域,所以我们又如何解决跨域的问题呢?在下文中会给大家介绍几种方法去解决跨域问题. 那么要解决跨域就不得不谈及 ,同源策略是一种安全措施,用...
学习面试
评论
请登录后发表评论
去登录