首页 > 其他分享 >CPP在内网穿透技术的思考

CPP在内网穿透技术的思考

时间:2024-09-13 14:02:00浏览次数:12  
标签:asio socket io tcp 穿透 context CPP 思考 boost

概述

内网穿透是一种技术,用于在私有局域网(LAN)中的设备与外部网络(如互联网)之间建立通信通道,使得外部设备可以访问内网中的服务。由于内网设备通常位于防火墙或 NAT(网络地址转换)设备之后,外部网络无法直接访问它们。因此,内网穿透技术旨在解决这一问题。本文将讨论如何使用 C++ 实现内网穿透技术,并介绍一些常见的实现方式。

一、内网穿透的基本原理

内网穿透的核心思想是通过一个中间服务器(通常位于公网中)来中转内网的请求。内网设备与外网设备通过这个中间服务器进行通信,避开防火墙或 NAT 设备的限制。具体流程包括以下步骤:

  1. 内网设备主动连接到中间服务器:由于 NAT 设备允许内部设备主动发起外部连接,因此内网设备可以与位于公网的中间服务器建立连接。
  2. 外网设备向中间服务器发出请求:外网设备通过公网 IP 地址访问中间服务器,请求访问内网中的服务。
  3. 中间服务器转发请求:中间服务器将外网设备的请求转发给已经连接的内网设备,内网设备响应后再通过中间服务器返回给外网设备。

二、常见的内网穿透技术实现手段

  1. 反向代理(Reverse Proxy) 反向代理是一种常见的内网穿透方式。使用反向代理时,内网设备主动与中间服务器建立连接,并保持连接的持续性。外网设备通过访问中间服务器获取内网服务。

    • 实现思路
      • 使用 C++ 开发的客户端程序在内网设备上运行,主动连接位于公网的中间服务器(该服务器可以使用 C++ 通过 socket 实现)。
      • 中间服务器充当代理,将外网的请求通过内网设备返回。
    • C++ 示例: 下面展示了一个简单的反向代理服务器的基本结构:  
      #include <iostream>
      #include <boost/asio.hpp>
      
      using boost::asio::ip::tcp;
      
      void start_server(boost::asio::io_context& io_context, short port) {
          tcp::acceptor acceptor(io_context, tcp::endpoint(tcp::v4(), port));
          while (true) {
              tcp::socket socket(io_context);
              acceptor.accept(socket);
              std::string message = "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\n\r\nHello from the proxy!";
              boost::asio::write(socket, boost::asio::buffer(message));
          }
      }
      
      int main() {
          boost::asio::io_context io_context;
          start_server(io_context, 8080);
          return 0;
      }
      

        

  2. TCP 隧道(TCP Tunneling) TCP 隧道是一种通过中间服务器将外网请求直接转发到内网设备的方法。外网设备与内网设备之间的数据流通过中间服务器进行封装和转发,内网设备将其解封装后处理请求。

    • 实现思路

      • 使用 C++ 实现 TCP 隧道的功能,内网设备和外网设备同时与中间服务器保持连接。
      • 外网设备发送请求时,中间服务器将数据包转发给内网设备处理。
    • C++ 示例

       
      #include <iostream>
      #include <boost/asio.hpp>
      
      using boost::asio::ip::tcp;
      
      void start_server(boost::asio::io_context& io_context, short port) {
          tcp::acceptor acceptor(io_context, tcp::endpoint(tcp::v4(), port));
          while (true) {
              tcp::socket socket(io_context);
              acceptor.accept(socket);
              std::string message = "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\n\r\nHello from the proxy!";
              boost::asio::write(socket, boost::asio::buffer(message));
          }
      }
      
      int main() {
          boost::asio::io_context io_context;
          start_server(io_context, 8080);
          return 0;
      }
      

        

  3. UDP 打洞(UDP Hole Punching) UDP 打洞是一种广泛使用于 P2P 网络的技术。该技术通过让两个处于不同 NAT 后面的设备同时向一个中间服务器发送 UDP 数据包,从而建立起两者之间的直接通信。

    • 实现思路

      • 使用 C++ 开发内网设备的 UDP 客户端,同时向中间服务器和目标设备发送数据包。
      • 中间服务器在收到来自两个设备的请求后,向双方告知彼此的公网 IP 和端口号,进而双方可以通过该信息直接进行通信。
    • C++ 示例

       
      #include <iostream>
      #include <boost/asio.hpp>
      
      using boost::asio::ip::tcp;
      
      void tunnel_data(tcp::socket& in_socket, tcp::socket& out_socket) {
          char data[1024];
          boost::system::error_code error;
          size_t length = in_socket.read_some(boost::asio::buffer(data), error);
          if (!error) {
              boost::asio::write(out_socket, boost::asio::buffer(data, length));
          }
      }
      
      int main() {
          boost::asio::io_context io_context;
      
          // Connect to the external client
          tcp::acceptor acceptor(io_context, tcp::endpoint(tcp::v4(), 8888));
          tcp::socket client_socket(io_context);
          acceptor.accept(client_socket);
      
          // Connect to the internal server (i.e., device inside the LAN)
          tcp::resolver resolver(io_context);
          tcp::resolver::results_type endpoints = resolver.resolve("localhost", "80");
          tcp::socket server_socket(io_context);
          boost::asio::connect(server_socket, endpoints);
      
          // Start tunneling data between client and server
          tunnel_data(client_socket, server_socket);
      
          return 0;
      }
      

        

       

三、总结

内网穿透技术通过各种手段使得外部设备能够访问位于内网中的服务。通过反向代理、TCP 隧道和 UDP 打洞等技术,我们可以根据不同的网络环境和需求,选择最合适的内网穿透方案。C++ 提供了高效的网络编程支持,可以用来实现这些方案中的每一种。

标签:asio,socket,io,tcp,穿透,context,CPP,思考,boost
From: https://www.cnblogs.com/thinkingmore/p/18412083

相关文章

  • SOCKS5代理实现穿透与端口映射的终极指南
    在如今这个数字化信息时代,网络代理技术已经成为了许多互联网用户的必备工具。尤其是SOCKS5代理,它不仅能帮助我们实现穿透,还能进行端口映射。今天,我们就来深入探讨一下如何通过SOCKS5代理实现这些功能。什么是SOCKS5代理?SOCKS5代理是一种网络代理协议,它能够在客户端与服务器......
  • AI新时代揭幕 会“思考解题逻辑”的OpenAI推理大模型登场
    北京时间周五凌晨1时许,AI时代迎来崭新的起点——能够进行通用复杂推理的大模型终于走到台前。OpenAI在官网发布公告称,开始向全体订阅用户开始推送OpenAIo1预览模型——也就是此前被广泛期待的“草莓”大模型。OpenAI表示,对于复杂推理任务而言,新模型代表着人工智能能力的崭......
  • 本地Linux服务器安装Nginx流程结合内网穿透实现无公网IP远程连接
    文章目录前言1.安装Docker2.使用Docker拉取Nginx镜像3.创建并启动Nginx容器4.本地连接测试5.公网远程访问本地Nginx5.1内网穿透工具安装5.2创建远程连接公网地址5.3使用固定公网地址远程访问前言在开发人员的工作中,公网远程访问内网是其必备的技术需求之一......
  • 成长的底层逻辑:why-how-what 思考顺序
    为什么明明知道,却改不了?为什么别人听不明白我说的啥?如何让自己的成长更快速,而非像网游里打怪攒经验线性升级。why、how、what的思考方式,让我在这些问题上看到了答案。不仅如此,使用了这个思考方式之后,我对阳明心学、西方个人发展类书籍也有了更深层次的理解。我认为它是非常强......
  • 架构师备考的一些思考(三)
    前言这个考题的大部分内容,我感觉都是我们会的,但所有的考题都穿上了马甲,穿上马甲我们就不好认了,而且如果是一个两个人穿马甲,还好推断,如果1000人穿马甲,你识别的概率就会急速下降。有些题的内容则是即无法识别,也无法背,因为它也没有个前因后果,完全是出题人拍脑袋想的,所以,这种题我们......
  • redis的雪崩、击穿和穿透
    redis是一种缓存工具,可以大大减少对数据库访问时数据库的压力,同时也可以让我们在对数据的读取时更方便,但由于某些因素,redis也可能会存在雪崩、击穿和穿透的风险:(引用自https://blog.csdn.net/wangxuanyang_zer/article/details/134420084)1、雪崩:是指在某一时间内大量的缓存失效或......
  • Java中的缓存穿透与雪崩问题:解决方案与设计模式
    Java中的缓存穿透与雪崩问题:解决方案与设计模式大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在分布式系统中,缓存是提高性能的重要手段。然而,缓存系统在实际应用中常常会遇到缓存穿透和缓存雪崩这两种问题。本文将探讨这两种问题的成因以及在Java中......
  • NATAPP实现内网穿透简易教程
    NATAPP是什么NATAPP是一个十分容易上手的内网穿透工具,可以把本机的ip和端口映射到公网,将本机暴露在公网中供他人访问。这在进行一些回调接口的本地测试(如支付宝微信支付的回调接口)时十分好用,同时也可以用来搭建服务器私服,和朋友一起畅快联机。NETAPP提供了两条免费隧道供注册用......
  • 架构师备考的一些思考(二)
    前言以我的视野来看,部长或技术总监这种岗位还是比较难竞争的,换言之,程序员的上升空间比较窄,如果想要拿到高级岗位,最好的是工作三五年后就转项目经理,然后再往上爬。架构师倒是也能晋升高级岗位,但就效率而言,是非常低的。就我的经验而言,架构师系的高级职位通常是技术管理一手抓,但这......
  • 【最新华为OD机试E卷-支持在线评测】通过软盘拷贝文件(200分)多语言题解-(Python/C/Ja
    ......