内网穿透到底是什么,必看

协变珊瑚
• 阅读 1275

以神卓互联为例,内网穿透是一种将局域网里的应用端口发布到公网访问的一种技术,这里的局域网是指NAT之后的网络。比如家里有一台笔记本,连接路由器的WIFI,笔记本上有一个Tomcat或者web应用,端口是8080,这个时候只可以通过家庭的局域网打开访问,同学在家里就不能访问你的笔记本上的web应用,而在笔记本上安装一个神卓互联的内网穿透客户端,添加一个需要映射的端口就可以实现同学在外面访问你的笔记本上的web应用,是不是很神奇。

应用场景
提供内网穿透服务
连接内网服务器,在外网演示内网web站点
无需服务器部署,快速调试本地程序,微信公众号开发利器
支持http、https协议站点,省去证书中间件复杂配置,http协议站点直接升级为https站点
支持TCP,UDP协议端口转发。支持数据库、SSH、远程桌面、网络摄像头等等开放到外网 包括但不限于以上场景。
内网穿透协议
标准的内网穿透协议是WanGooeTunnel通信协议

实现的功能
让外网请求通过各种复杂的路由和防火墙访问到内网的设备

成熟的内网穿透产品
目前国内正规的内网穿透产品是神卓互联和花生壳,商业化和成熟度都比较高客户群体有比较大。

实现内网穿透的方法
内网穿透基本上是以C语言实现,因为对性能的要求比较高

如何实现数据包的转发,由于内网穿透支持的协议比较多,这里就写一个简单的数据转发的代码,具体要实现成熟的功能还有很长的路要走

tcp_server* tcp_server::server_ptr = NULL;
tcp_server::tcp_server()
{}
 
tcp_server::tcp_server(const tcp_server&)
{}
 
bool tcp_server::server_listen()
{
    listen_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (listen_fd < 0) {
        perror("socket");
        return false;
    }
    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = INADDR_ANY;
    addr.sin_port = htons(8851);
    int ret = bind(listen_fd,(struct sockaddr*)&addr,sizeof(addr));
    if (ret < 0) {
        perror("bind");
        return false;
    }
    ret = listen(listen_fd,128);
    if (ret < 0) {
        perror("listen");
        return false;
    }
    //创建epoll树
    epoll_tree = epoll_create(1);
    //上epoll树
    struct epoll_event evt;
    evt.data.fd = listen_fd;
    evt.events = EPOLLIN;
    ret = epoll_ctl(epoll_tree, EPOLL_CTL_ADD, listen_fd, &evt);
    if (ret == -1)
    {
        perror("epoll_ctl");
        std::cout << "listen fd:" << listen_fd << std::endl;
        std::cout << "epoll_tree fd:" << epoll_tree << std::endl;
        return false;
    }
    std::cout << "established listen and create epoll tree" << std::endl;
    return true;
}
 
void tcp_server::server_run()
{
    if (!server_listen())
    {
        std::cout << "server listen error" << std::endl;
        server_close();
        return;
    }
    int size = sizeof(epr) / sizeof(epoll_event);
    //将所有主动连接的socket都记录并监听
    std::cout << "main server loop start" << std::endl;
    while(1) {
        epoll_count = epoll_wait(epoll_tree, epr, size, -1);
        for (int i = 0; i < epoll_count; i++) {
            if (epr[i].data.fd == listen_fd) { //判断是不是监听文件,如果监听文件有变化则将对应的通信文件添加到epoll树和vector
                int cfd = accept(listen_fd, NULL, NULL);
                if (cfd < 0){
                    perror("accept");
                    continue;
                }
                epoll_event evt;
                evt.data.fd = cfd;
                evt.events = EPOLLIN;
                int ret = epoll_ctl(epoll_tree, EPOLL_CTL_ADD, cfd, &evt);
                if (ret == -1)
                {
                    perror("epoll_ctl");
                    return ;
                }
                accept_list.push_back(cfd);
                std::cout << "Add a link file" << std::endl;
            }
            else{
                //获取消息并加入消息队列或转发
                char buf[100] = { 0 };
                int count = recv(epr[i].data.fd, buf, sizeof(buf), 0);
                if (count <= 0 ){
                    perror("recv");
                    continue;
                }
                for (auto it : accept_list){
                    //转发数据
                    if (it != epr[i].data.fd){
                        send(it, buf, count, 0);
                        std::cout << "send data: " << buf << " file describes: " << it << std::endl;
                    }
                }
            }
        }
    }
}
 
void tcp_server::server_close()
{
    for (auto it : accept_list){
        close(it);
    }
    close(listen_fd);
    close(epoll_tree);
}
 
tcp_server* tcp_server::getinstance()
{
    if (server_ptr != nullptr){
        return server_ptr;
    }
    server_ptr = new tcp_server;
    return server_ptr;
}

以上是通过epoll来实现高性能的端口数据转发,只支持linux系统,不支持windows,因为windows里没有epoll。

以下是神卓互联内网穿透windows版客户端绑定通道后的截图:
内网穿透到底是什么,必看

Linux版以ubuntu为例,安装之前需要先安装C++环境,

apt-get install g++

如图所示:
内网穿透到底是什么,必看

到此运行环境安装完成

接下来直接安装就可以了

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
6个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Peter20 Peter20
4年前
mysql中like用法
like的通配符有两种%(百分号):代表零个、一个或者多个字符。\(下划线):代表一个数字或者字符。1\.name以"李"开头wherenamelike'李%'2\.name中包含"云",“云”可以在任何位置wherenamelike'%云%'3\.第二个和第三个字符是0的值wheresalarylike'\00%'4\
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Wesley13 Wesley13
3年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
协变珊瑚
协变珊瑚
Lv1
看不清的挽留,正如你执着地向前走
文章
4
粉丝
0
获赞
0