本篇来聊一下内网穿透中流量转发的问题

内网穿透和核心逻辑是根据流量的路由信息准确地将公网流量路由到指定的机器端口上,从而完成一次流量的内网穿透。

这里有一个核心问题,路由信息从哪里获取?

常见的有将路由信息跟内网穿透服务器端口进行绑定的,称之为端口路由;另外的还有将路由信息放在应用层协议中,由内网穿透服务解析应用层协议,拿到路由信息,这种方式称之为协议路由

这两种路由方式都有哪些特点呢?下面对它们进行展开讨论。

端口路由

端口路由,顾名思义,就是将路由信息与端口进行绑定。将这个端口收到的流量统统转发到指定内网的指定服务器的指定端口。

这种路由方式最大的特点就是协议无关。

不管被代理的服务是常见的Http接口还是Redis、MySQL,或者是RocketMQ等服务,使用方只需要将请求发送到内网穿透-用户服务端口上,内网穿透服务器都能够把接收到的流量准确的代理路由到指定的服务端口上。

在使用方式上也很简单,使用方只需要将真实后端服务ip替换成内网穿透服务ip,原始服务端口替换成内网穿透服务端口即可。

简单理解端口路由就是内网穿透服务会将用户端口接收到的流量镜像到内网指定的ip和端口上。

端口路由的应用场景为真实的服务地址和网络都不变,只需要简单的将网络打通的场景。

如本地开发调试需要连接内网的某个服务(如MySQL、Redis)。

协议路由

协议路由指的是内网穿透服务通过解析应用层协议获取真实的内网路由数据。

举一个场景例子,假设有两个相同的Http服务分别部署到两个内部网络中,在公网的服务需要根据不用的业务逻辑将请求打到不同的内网。此时就可以把路由信息放在Http请求的Header上,由内网穿透服务解析Http请求的Header部分,拿到路由信息,从而决定路由到哪个内网的哪个服务上。

协议路由可以在同一个端口根据用户参数路由到不同的网络上,灵活性非常好,但是它也牺牲了侵入性,对使用者代码会有轻微的侵入:使用者需要根据不同的应用层协议开发相应的路由信息解析代码。

需要根据业务逻辑将流量转发到不同的网络是协议路由的主要应用场景。

端口路由 vs 协议路由

总结一下端口路由跟协议路由各自的优缺点:

端口路由 协议路由
灵活性
侵入性 无侵入 有轻微侵入
安全性 无安全校验 可做安全校验
接入工作量 有少许代码改动

最后

端口路由牺牲了灵活性,换来了无侵入的好处;而协议路由强调灵活性,在代码侵入性上做出了妥协。两种路由方式各有不同适用的应用场景,但是都想要怎么办?

QuantumTunnel表示没问题,两种协议都支持。并且不管是端口路由还是协议路由两行命令就能够把内网穿透服务启动,非常方便。

可以下载jar包通过命令直接启动:查看最新发布的版本

# 启动内网穿透服务端
java -jar quantum-tunnel-server.jar -proxy_server_port 9090 -user_server_port 8090 # 启动内网穿透客户端
java -jar quantum-tunnel-client.jar -network_id localTest -proxy_server_host 127.0.0.1 -proxy_server_port 9090

服务启动后,可以访问百度验证一下:

curl --location --request GET '127.0.0.1:8090/' \
--header 'Host: www.baidu.com' \
--header 'network_id: localTest' \
--header 'target_host: www.baidu.com' \
--header 'target_port: 80' \
--header 'Cookie: BDSVRTM=11; BD_HOME=1'

仓库地址

当然也可以clone仓库进行更加个性化的开发,

欢迎一起打造基于Java最好的内网穿透工具:QuantumTunnel

  1. Gitee:乐天派 / quantum-tunnel
  2. GitHub:liumian97/quantum-tunnel

QuantumTunnel:协议路由 vs 端口路由的更多相关文章

  1. 【转载】可被路由的协议 & 路由协议 & 不可被路由的协议 的区别

    原文地址:可被路由的协议 & 路由协议 & 不可被路由的协议 的区别 术语routed protocol(可被路由的协议)和routing protocol(路由协议)经常被混淆.可被 ...

  2. ip route rule 路由策略 高级路由 捆绑 网桥

    http://lwfs.net/2005/11/28/10/ #!/bin/bash IP0= IP1= GW0= GW1= NET0= NET1= DEV0=eth0 DEV1=eth1 # com ...

  3. 网络工程实训_4RIP路由(动态路由)

    实验4:RIP路由.包括RIPv1:RIPv2 动态路由协议包括距离向量路由协议和链路状态路由协议.RIP(Routing Information Protocol,路由信息协议)是使用最广泛的距离向 ...

  4. python网络编程01 /C/S架构|B/S架构、网络通信原理、五层协议、七层协议简述、端口映射技术

    python网络编程01 /C/S架构|B/S架构.网络通信原理.五层协议.七层协议简述.端口映射技术 目录 python网络编程01 /C/S架构|B/S架构.网络通信原理.五层协议.七层协议简述. ...

  5. CCNA - Part12 - 路由协议 (1) - 静态路由,动态路由 RIP

    路由器 在之前关于路由器的介绍中,我们知道它是网络互联的核心设备,用于连接不同的网络,在网络之间转发 IP 数据报.对于路由器来说,路由表是其内部最为重要的构成组件.当路由器需要转发数据时,就会按照路 ...

  6. CCNP路由实验(3) -- 路由控制

    1.用distribute-list过滤路由在不同协议里的用法 在RIP里 在EIGRP里 在OSPF里 只接收奇数路由 只接收偶数路由 只接收被4整除的路由2.offset-list在不同协议里的用 ...

  7. IP路由及静态路由配置

    IP路由及静态路由配置 qianghaohao(CodingNutter) 链接来源:http://www.cnblogs.com/codingnutter/p/5654271.html 一.IP路由 ...

  8. BGP:我们不生产路由,而是路由的搬运工

    1.BGP协议自身不能生产路由,它主要通过配置来将本地路由进行发布或者引入其他路由协议产生的路由. 有两种方法, 方法一.在BGP视图下,通过network命令将本地路由发布到BGP路由表中, 通过本 ...

  9. 第6章 静态路由和动态路由(3)_RIP动态路由协议

    5. RIP动态路由协议 5.1 RIP协议(Routing Information Protocol) (1)是一个距离矢量路由选择协议.选择最佳路径的标准是跳数,如果到达目标网络经过的路由器最少, ...

随机推荐

  1. 记一次k8s pod频繁重启的优化之旅

    关键词:k8s.jvm.高可用 1.背景 最近有运维反馈某个微服务频繁重启,客户映像特别不好,需要我们尽快看一下. 听他说完我立马到监控平台去看这个服务的运行情况,确实重启了很多次.对于技术人员来说, ...

  2. Docker系列(3)- 配置阿里云镜像加速

    step-1 登录阿里云找到容器服务 step-2 找到镜像加速地址 step-3 配置使用 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon ...

  3. Shell系列(25)- 条件判断之文件权限

    按照文件权限进行判断 读.写.执行等选项权限,只要有,就返回真 不会按照所属者,所属用户组,其他用户进行区分 先判断文件是否存在,再去判断选项权限 测试选项 作用(标红熟记) -r 文件 判断该文件是 ...

  4. lightweight openpose 入门实操笔记(pytorch环境)

    最近有个小项目要搞姿态识别,简单调研了一下2D的识别: 基本上是下面几种 (单人)single person 直接关键点回归 heatmap,感觉其实就是把一个点的标签弄成一个高斯分布 (多人)mul ...

  5. windows2012安装django

    第一步:下载python3.6.8或者到(https://www.python.org/downloads/release/python-368/)官网下载(Windows x86-64 execut ...

  6. SSA

    wikipedia上关于SSA的定义如下: In compiler design, static single assignment form (often abbreviated as SSA fo ...

  7. 启用 Spring-Cloud-OpenFeign 配置可刷新,项目无法启动,我 TM 人傻了(上)

    本篇文章涉及底层设计以及原理,以及问题定位,比较深入,篇幅较长,所以拆分成上下两篇: 上:问题简单描述以及 Spring Cloud RefreshScope 的原理 下:当前 spring-clou ...

  8. 5-基本的sql查询以及函数的使用

    基本SQL查询语句以及函数的使用 格式元素 描述 YYYY 四位的年份 MONTH 月份的英文全称 MON 月份的英文简写 MM 月份的数字表示 DD 日起的1-31数字表示 D 星期几的数字表示1- ...

  9. xshell连接VMware中的Linux

    [前言]最近想压测一下ITOO的考试系统,所以想在自己电脑上安装一下linux,然后安装一下jmeter进行压测一下. 不过为什么要连接xshell呢,因为在虚拟机上总是会和主机切换鼠标,而且也不能粘 ...

  10. 【UE4 材质】一些小功能

    利用材质实现物体自转 物体外轮廓高亮 使用postprocess+custom depth(防遮挡) https://www.tomlooman.com/soft-outlines-in-ue4/ h ...