当前位置: 首页 > news >正文

【Linux网络】内网穿透

内网穿透

基本概念

内网穿透(Port Forwarding/NAT穿透) 是一种网络技术,主要用于解决处于 内网(局域网)中的设备无法直接被公网访问 的问题。

1. 核心原理
  • 内网与公网的隔离:家庭、企业等局域网内的设备通常使用 私有IP地址(如192.168.x.x、10.x.x.x),这些IP无法直接被公网识别和访问。
  • 借助中转服务器:通过在公网搭建或租用一台 具有公网IP的服务器(称为“穿透服务器”或“中转服务器”),在内网设备与公网之间建立一条数据通道。当公网用户访问中转服务器时,服务器将请求转发到内网目标设备,反之亦然。
2. 关键场景
  • 远程访问内网设备:如远程控制家里的电脑、访问公司内网的文件服务器。
  • 搭建个人服务:在内网搭建网站、博客、NAS存储,供公网用户访问。
  • 开发测试:开发人员调试需要公网访问的应用(如微信小程序、API接口)。
  • 游戏联机:部分游戏需通过内网穿透实现局域网外联机。

主要实现方式

根据技术原理和使用场景,内网穿透可分为以下几类:

1. 基于NAT端口映射(传统方式)
  • 适用场景:适合拥有 公网IP的路由器 的用户(需运营商分配公网IP)。
  • 操作步骤
    1. 登录路由器管理界面,找到 端口映射(Port Forwarding) 功能。
    2. 将内网设备的IP地址和端口号映射到路由器的公网IP上。
    3. 公网用户通过“路由器公网IP:映射端口”访问内网设备。
  • 优缺点
    • 优点:无需额外工具,配置简单,传输效率高。
    • 缺点:依赖运营商提供公网IP(多数家庭用户为内网IP),且可能存在安全风险(暴露端口)。
2. 使用内网穿透工具(主流方式)

通过第三方工具或平台实现穿透,无需公网IP,适合普通用户。以下是常见工具分类:

(1)反向代理工具
  • 原理:在内网设备与公网之间建立反向代理通道,公网流量通过代理服务器转发到内网。
  • 典型工具
    • Ngrok:开源工具,支持HTTP/HTTPS/TCP协议,需注册账号并配置Token。
      • 步骤:下载Ngrok客户端 → 连接到官方服务器 → 生成公网访问地址。
    • Frp:开源、高性能工具,支持TCP/UDP/HTTP等协议,可自建服务器降低延迟。
      • 步骤:部署Frp服务端(公网服务器)→ 配置内网客户端 → 建立连接。
    • 花生壳:商业化工具,提供图形化界面,适合非技术用户,部分功能需付费。
(2)云服务商自带穿透功能
  • 适用场景:已使用云服务器(如阿里云、腾讯云)的用户。
  • 典型方案
    • 阿里云内网穿透:通过“云服务器+端口转发”实现,需配置安全组规则。
    • 腾讯云Ngrok服务:集成Ngrok工具,支持一键创建穿透隧道。
(3)P2P直连(无中转服务器)
  • 原理:利用P2P技术(如STUN/TURN协议)直接建立内网设备与公网设备的连接,无需中转服务器,节省流量。
  • 典型工具
    • Netcat:命令行工具,支持TCP/UDP直连,需双方配合。
    • ZeroTier:虚拟局域网工具,通过P2P组网实现设备互联,适合复杂网络环境。

应用场景与案例

1. 远程办公与运维
  • 场景:员工在家访问公司内网的OA系统、数据库。
  • 方案:在公司路由器部署Frp服务端,员工通过Frp客户端连接,访问内网IP+端口。
2. 搭建个人网站/博客
  • 场景:使用本地电脑或树莓派搭建网站,供公网访问。
  • 步骤
    1. 本地运行Web服务(如Nginx、Apache),监听80端口。
    2. 使用Ngrok创建HTTP隧道,生成公网URL(如https://abc.ngrok.io)。
    3. 公网用户通过该URL访问网站。
3. 远程控制设备
  • 场景:远程控制家里的智能摄像头、NAS存储。
  • 方案:在NAS设备上安装花生壳客户端,绑定域名后,通过域名+端口远程访问。
4. 开发测试(如微信小程序调试)
  • 场景:微信小程序需调用公网接口,本地开发环境为内网。
  • 方案:使用Ngrok将本地接口地址(如http://127.0.0.1:3000)映射为公网URL,供微信服务器调用。

安全风险与防护措施

1. 主要风险
  • 端口暴露:映射的端口可能被黑客扫描并攻击(如弱密码爆破)。
  • 数据安全:未加密的传输数据可能被中间人截取(如HTTP协议)。
  • 工具漏洞:第三方穿透工具若存在漏洞,可能被利用入侵内网。
2. 防护建议
  • 使用HTTPS协议:通过Ngrok等工具开启HTTPS加密传输(需配置SSL证书)。
  • 限制访问IP:在路由器或穿透工具中设置白名单,仅允许特定IP访问。
  • 定期更换密码:为内网设备(如路由器、服务器)设置强密码并定期更新。
  • 选择可信工具:优先使用开源工具(如Frp)或知名厂商服务(如花生壳),避免使用未知来源的软件。

内网穿透方案

需求场景推荐方案理由
临时测试、简单HTTP服务Ngrok(免费版)一键启动,无需复杂配置
长期稳定服务、自定义域名花生壳(付费版)图形化界面,支持域名绑定
技术开发者、高性能需求Frp(自建服务器)开源、可定制协议和端口,延迟低
公网IP用户、家庭局域网路由器端口映射无需额外工具,传输效率高
P2P直连、低流量场景ZeroTier/Netcat节省中转服务器成本,适合设备互联

总结

内网穿透是连接内网与公网的桥梁,通过合理选择工具和配置,可以在远程办公、个人服务搭建、开发测试等场景中发挥重要作用。但需注意安全风险,优先选择加密传输和权限控制功能完善的方案。随着云计算和边缘计算的发展,未来内网穿透技术可能进一步集成到云服务中,变得更加便捷和安全。

在这里插入图片描述

内网打洞

基本概念

内网打洞(NAT Hole Punching) 是一种在 NAT(网络地址转换)设备限制下实现内网设备直接通信 的技术,属于 P2P(点对点)通信 的核心技术之一。其核心目标是让两个处于不同内网(或同一内网)的设备,绕过NAT设备的限制,直接建立端到端的连接,避免通过中转服务器转发数据,从而降低延迟、节省带宽。

NAT类型与通信限制

在理解内网打洞前,需先了解NAT的分类及对通信的影响:

1. NAT的四种类型
类型特点对P2P通信的限制
完全圆锥型NAT内网设备任一端口的请求都会被映射到NAT的固定公网IP+端口,所有公网设备均可访问该端口。无需打洞,可直接通信。
地址限制圆锥型NAT仅允许曾主动访问过的公网IP地址反向连接内网设备。需知道对方公网IP,可通过打洞通信。
端口限制圆锥型NAT仅允许曾主动访问过的公网IP+端口反向连接内网设备。需知道对方公网IP+端口,打洞难度较高。
对称型NAT每个不同的公网IP+端口的连接都会映射到NAT的不同端口,且仅允许对应的公网地址反向连接。需中转服务器(STUN/TURN)辅助,打洞成功率低。
2. NAT的限制本质
  • 内网设备无法主动接收公网连接:NAT设备默认会丢弃所有未经内网设备主动发起的入站连接请求。
  • 端口映射动态变化:对称型NAT会为每个外部连接分配不同的端口,导致无法固定映射关系。

内网打洞的核心原理与流程

内网打洞的关键是利用NAT设备的“短暂放行规则”——当内网设备主动向目标设备发送数据时,NAT会临时记录该连接信息,并允许目标设备在短时间内反向回复数据,从而建立双向通信通道。

1. 核心参与者
  • 设备A(内网A):需与设备B通信的内网设备。
  • 设备B(内网B):目标内网设备。
  • 中继服务器(STUN/TURN服务器):用于协助交换双方的公网地址和端口信息(非必须,部分场景可省略)。
2. 打洞流程(以地址限制圆锥型NAT为例)

在这里插入图片描述

  • 步骤1:设备A和设备B分别向中继服务器发送请求,获取各自的公网地址(A’和B’)。
  • 步骤2:双方通过中继服务器交换公网地址。
  • 步骤3:设备A主动向设备B的公网地址B’发送数据,触发A的NAT设备记录B’为“可信任地址”。
  • 步骤4:设备B接收到数据后,立即向A的公网地址A’回复数据,此时B的NAT设备因B曾主动访问过中继服务器,允许向A’发送数据。
  • 步骤5:A的NAT设备因之前主动向B’发送过数据,允许接收B的回复,至此双向连接建立。

关键技术与协议

1. STUN(Session Traversal Utilities for NAT)
  • 作用:用于探测设备的公网地址及NAT类型,协助打洞。
  • 原理:设备向STUN服务器发送请求,服务器返回接收到的源IP和端口(即设备的公网地址)。
  • 典型工具:Coturn(开源STUN/TURN服务器)、Google STUN服务器。
2. TURN(Traversal Using Relays around NAT)
  • 作用:当STUN无法完成打洞时(如对称型NAT),作为中继服务器转发数据( fallback 方案)。
  • 原理:设备先通过STUN尝试打洞,失败后连接TURN服务器,通过服务器中转数据。
  • 优缺点
    • 优点:兼容性强,支持所有NAT类型。
    • 缺点:数据需经服务器中转,延迟较高,消耗服务器资源。
3. ICE(Interactive Connectivity Establishment)
  • 作用:综合STUN和TURN的标准协议,用于在P2P连接中自动选择最优路径(直连或中继)。
  • 流程
    1. 双方收集候选地址(包括内网IP、STUN获取的公网IP、TURN中继地址)。
    2. 交换候选地址,按优先级尝试连接(直连优先,失败则用TURN中继)。
  • 应用场景:WebRTC(浏览器实时通信)、VoIP电话、游戏联机等。

内网打洞的应用场景

1. 实时通信(WebRTC)
  • 场景:浏览器之间的音视频通话(如Skype、微信视频)。
  • 实现:通过ICE协议自动打洞,优先直连,失败则通过TURN中继。
2. 游戏联机(如Steam平台)
  • 场景:玩家无需通过游戏服务器中转数据,直接联机对战。
  • 挑战:需处理对称型NAT的打洞失败问题,部分游戏默认使用TURN中继。
3. 文件传输(如电驴、BitTorrent)
  • 场景:点对点文件共享,减少对中心服务器的依赖。
  • 优化:通过打洞直连传输大文件,提升速度并降低服务器负载。
4. 物联网设备互联
  • 场景:智能家居设备(如摄像头、传感器)直接通信,无需通过云端中转。
  • 优势:降低延迟,保障数据隐私(避免云端存储)。

内网打洞的局限性与挑战

1. NAT类型限制
  • 对称型NAT:打洞成功率低,必须依赖TURN中继,无法完全直连。
  • 多级NAT:若设备位于多层NAT之后(如企业级防火墙),打洞难度极高。
2. 防火墙限制
  • 部分企业防火墙会拦截非标准端口(如UDP 3478)或限制P2P流量,导致打洞失败。
3. 延迟与可靠性
  • 打洞需要多次往返通信(如交换公网地址、触发NAT记录),可能产生几秒延迟。
  • 极端情况下(如网络波动),打洞可能失败,需重试或切换至中继模式。

如何实现内网打洞?

工具推荐

  • 开源库:libnice(实现ICE协议)、coturn(STUN/TURN服务器)。
  • 测试工具:NAT类型检测工具(如Coturn自带检测页面)。

总结

内网打洞是P2P通信的核心技术,通过巧妙利用NAT设备的特性,实现了内网设备间的直接通信,在实时交互场景中具有不可替代的优势。尽管受限于NAT类型和防火墙策略,但其与STUN/TURN/ICE的结合已成为现代网络通信的基础设施。随着IPv6的普及(原生支持端到端通信,无需NAT),内网打洞的需求可能逐渐减少,但在IPv4主导的当前网络环境中,它仍是解决内网通信问题的关键方案。

内网打洞 vs. 内网穿透

对比维度内网打洞内网穿透
核心目标实现内网设备间直接通信(P2P)让公网设备访问内网设备(C/S)
依赖条件需要双方主动参与,依赖NAT类型依赖中转服务器(如Ngrok、Frp)
数据路径直接传输(或通过中继服务器)必须经中转服务器转发
典型场景实时通信、文件共享、游戏联机远程控制、搭建服务、开发测试
延迟与带宽直连时延迟低,节省带宽依赖中转,延迟较高,消耗服务器资源

手动部署并测试内网穿透

Frp 下载:https://github.com/fatedier/frp/releases/tag/v0.58.1

在这里插入图片描述
我们做两个测试

  • ssh 远程登录
  • nginx 远程访问
sudo yum install nginx  # centos 安装
sudo apt install nginx  # ubuntu 安装
#启动
$ nginx#暂停
# nginx -s stop

frpc.toml:客户端配置样例

#配置公网服务器上 frp 服务的 IP 与端口
serverAddr = "x.x.x.x"
serverPort = 8888[[proxies]]
name = "ssh-serivce"  #名称
type = "tcp"  #代理类型
localIP = "127.0.0.1"  #本地 IP
localPort = 22  #内网服务监听的端口
remotePort = 8081  #需要在公网服务器上监听的端口,#其他人未来可以通过这个端口访问
我们的本地的 22 号服务#也就是说 8081 端口会映射到 22 号端口
  • 服务器端配置文件也可以进行复杂配置,但是我们追求简单,服务器只需要配置 bind 端口号就可以

服务器和客户端都可以这样在后台启动


nohup./frpc -c./frpc.toml &> /dev/null &
nohup./frps -c./frps.toml &> /dev/null &
  • &> /dev/null: 这是重定向操作,用于将命令的标准输出(stdout)和标准错误(stderr)都重定向到/dev/null。/dev/null 是一个特殊的设备文件,向它写入的内容都会被丢弃,读取它则会立即返回文件结束。因此,这个操作的作用是忽略命令的所有输出信息。
http://www.xdnf.cn/news/496891.html

相关文章:

  • 当语言模型学会犯错和改正:搜索流(SoS)方法解析
  • 兰亭妙微:用系统化思维重构智能座舱 UI 体验
  • 【Redis】零碎知识点(易忘 / 易错)总结回顾
  • linux标准库头文件解析
  • Go语言实现链式调用
  • vscode用python开发maya联动调试设置
  • 游戏引擎学习第288天:继续完成Brains
  • 98. 验证二叉搜索树
  • 信息系统项目管理师高级-软考高项案例分析备考指南(2023年案例分析)
  • 神经网络与深度学习第六章--循环神经网络(理论)
  • WebXR教学 07 项目5 贪吃蛇小游戏
  • 亲测有效!OGG 创建抽取进程报错 OGG-08241,如何解决?
  • 简单神经网络(ANN)实现:从零开始构建第一个模型
  • 【第二篇】 初步解析Spring Boot
  • 第9讲、深入理解Scaled Dot-Product Attention
  • 【漫话机器学习系列】264.内距(又称四分位差)Interquartile Range
  • 抽奖系统-抽奖
  • uni-app小程序登录后…
  • 数据分析_Python
  • arduino平台读取鼠标光电传感器
  • MATLAB学习笔记(七):MATLAB建模城市的雨季防洪排污的问题
  • Elasticsearch 性能优化面试宝典
  • LabVIEW声音与振动测量分析
  • STM32实战指南:SG90舵机控制原理与代码详解
  • Qt与Hid设备通信
  • 392. Is Subsequence
  • 天拓四方锂电池卷绕机 PLC 物联网解决方案
  • 从零开始认识 Node.js:异步非阻塞的魅力
  • Go语言 GORM框架 使用指南
  • c/c++的opencv模糊