隧道顾名思义让不通的地方变通。SSH隧道技术也是同样的道理,借用SSH这个工具,通过SSHClient和SSHServer之间建立一条TCP通道,从而打通二台设备,于此同时分别监听各自的一个端口号,如果端口号复合就把该数据加密并且发到对端,对端解密后根据配置的命令再做出相对应的操作。SSH有正向代理与反向代理之说,下面将分别介绍。

SSH正向代理(也叫本地转发):

先来看看第一个例子,实验室里有台机子D,其上有一个IPv4的TCPServer进程,监听端口为5555。在我们的外网上有机子A、B、C,可以通过路由器互通,在A机子上有一个IPv4的TCPClient进程。由于机子D和外网是不通的,但是D所能到的机子C和外网却是可以进行通讯。因此我们会想,能不能把机子C当作一座连接D和外网的桥呢?

答案无疑是本地端口转发了,它的命令格式是:

ssh -gNfL <local port>:<remote host>:<remote port> <SSH hostname>
-N 告诉SSH客户端,这个连接不需要执行任何命令。仅仅做端口转发
-g 告诉SSH客户端,这个GatewayPorts=yes。即开启端口转发(别的主机发送过来的数据包只要端口匹配了,那就会送到SSHServer)
-f 告诉SSH客户端在后台运行
-L 做本地映射端口,
被冒号分割的三个部分含义分别是
需要使用的本地端口号
需要访问的目标机器IP地址(IP: 192.168.1.2)
需要访问的目标机器端口(端口: 5555)
最后一个参数是我们用来建立隧道的SSHServer的IP地址(IP: 172.16.163.213)

在机子B上执行如下命令即可建立一个SSH的本地端口转发,例如:

#ssh -gNfL 6666:192.168.1.100:5555 172.16.163.213

命令说明:

该命令建立了一个SSHClient和SSHServer,当SSHClient收到一个目的端口是6666的报文,就会通过建立的这条隧道把数据转到SSHServer这边,SSHServer在收到这个报文,会进行解包,并把之前配置的目的IP和目的端口写到报文里,然后转发给192.168.1.100:5555这个地址。这样双方就能进行通讯了。

这是SSHServer和目标机器不是同一台机器的情况,如果是同一台,那SSH hostname跟remote host填的是一样的。比较常见的是下面这种情况:

在机子A上执行如下命令即可

#ssh -NfL 6666:localhost:5555 172.16.163.213

该命令告诉机子A转发本本机上发往6666端口的报文到SSHServer端,随后SSHServer在收到包以后把这个包发往localhost的5555端口。localhost也可以用172.16.163.213来代替。

SSH反向代理(也叫远程转发):

在理解了正向代理,咱们在来理解下反向代理,同理我们也是用一个例子来理解这么一过程。

在实验室有下面这么一套环境,D机子能直接连接外网,这个例子虽然跟其它的资料说的不一样,但是其原理是一样,只要你能理解它。

这里跟正向代理的区别在与SSHClient跟SSHServer发生了位置交换,也就是说现在的主动权在机子C上了,是机子C主动建立了一个隧道,让外网可以来访问机子D。

ssh -NfR <remote port>:<local host>:<local port> <SSH hostname>
-N 告诉SSH客户端,这个连接不需要执行任何命令。仅仅做端口转发
-f 告诉SSH客户端在后台运行
-R 做远程映射端口,
被冒号分割的三个部分含义分别是
需要使用的远程端口号
需要访问的本地机器IP地址(IP: 192.168.1.2)
需要访问的本地机器端口(端口: 5555)
最后一个参数是我们用来建立隧道的SSHServer的IP地址(IP: 172.16.25.210)

在机子C上执行如下命令即可建立一个SSH的远程端口转发,例如:

#ssh -NfR 6666:192.168.1.100:5555 172.16.25.210

该命令告诉SSHServer在收到6666这个端口的报文时,转发到SSHClient这边,SSHClient根据配置的地址,把该报文转发到192.168.1.100:5555。

下面是IPv4的TCP 服务端和客户端的测试代码,其中对于正向代理,TCP的客户端运行在机子A上,对于反向代理,TCP的客户端运行在机子B上。TCP的服务端都是运行在机子D上。

//ipv4tcpclient.c

#include <stdio.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <string.h>int main (int argc, const char * argv[])
{struct sockaddr_in server_addr;//server_addr.sin_len = sizeof(struct sockaddr_in);server_addr.sin_family = AF_INET;server_addr.sin_port = htons(5555);server_addr.sin_addr.s_addr = inet_addr("172.16.25.210");bzero(&(server_addr.sin_zero),8);int server_socket = socket(AF_INET, SOCK_STREAM, 0);if (server_socket == -1) {perror("socket error");return 1;}char recv_msg[1024];char reply_msg[1024];if (connect(server_socket, (struct sockaddr *)&server_addr, sizeof(struct sockaddr_in))==0)     {//connect 成功之后,其实系统将你创建的socket绑定到一个系统分配的端口上,且其为全相关,包含服务器端的信息,可以用来和服务器端进行通信。while (1) {bzero(recv_msg, 1024);bzero(reply_msg, 1024);long byte_num = recv(server_socket,recv_msg,1024,0);recv_msg[byte_num] = '\0';printf("server said:%s\n",recv_msg);printf("reply:");scanf("%s",reply_msg);if (send(server_socket, reply_msg, 1024, 0) == -1) {perror("send error");}}}// insert code here...printf("Hello, World!\n");return 0;
}

//ipv4tcpserver.c

#include <stdio.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <string.h>int main (int argc, const char * argv[])
{struct sockaddr_in server_addr;//server_addr.sin_len = sizeof(struct sockaddr_in);server_addr.sin_family = AF_INET;//Address families AF_INET互联网地址簇server_addr.sin_port = htons(5555);server_addr.sin_addr.s_addr = htonl(INADDR_ANY);bzero(&(server_addr.sin_zero),8);//创建socketint server_socket = socket(AF_INET, SOCK_STREAM, 0);//SOCK_STREAM 有连接if (server_socket == -1) {perror("socket error");return 1;}//绑定socket:将创建的socket绑定到本地的IP地址和端口,此socket是半相关的,只是负责侦听客户端的连接请求,并不能用于和客户端通信int bind_result = bind(server_socket, (struct sockaddr *)&server_addr, sizeof(server_addr));if (bind_result == -1) {perror("bind error");return 1;}//listen侦听 第一个参数是套接字,第二个参数为等待接受的连接的队列的大小,在connect请求过来的时候,完成三次握手后先将连接放到这个队列中,直到被accept处理。如果这个队列满了,且有新的连接的时候,对方可能会收到出错信息。if (listen(server_socket, 5) == -1) {perror("listen error");return 1;}struct sockaddr_in client_address;socklen_t address_len;int client_socket = accept(server_socket, (struct sockaddr *)&client_address, &address_len);//返回的client_socket为一个全相关的socket,其中包含client的地址和端口信息,通过client_socket可以和客户端进行通信。if (client_socket == -1) {perror("accept error");return -1;}char recv_msg[1024];char reply_msg[1024];while (1) {bzero(recv_msg, 1024);bzero(reply_msg, 1024);printf("reply:");scanf("%s",reply_msg);send(client_socket, reply_msg, 1024, 0);long byte_num = recv(client_socket,recv_msg,1024,0);recv_msg[byte_num] = '\0';printf("client said:%s\n",recv_msg);}return 0;
}

老戚的黑科技之SSH隧道技术相关推荐

  1. 老戚的黑科技之ssh无密码登录

    在使用ssh这个工具的时候,很多时候都需要输入密码,除了ssh,scp也远程拷贝文件时也需要输入密码,当操作的次数多了,免掉输密码的环节也就成了我一直想要实现的目标,以前实现过过一次,但那次之成功了一 ...

  2. 老戚的黑科技之gdb与gdbServer的使用

    一.调试原理 有很多时候我们需要把编译出来的进程运行在另外一台机子上,可能是嵌入式开发板,也可能是另一台linux虚拟机,由于某种原因,在起gdb单步调试的时候关联不到源码,这会让我们很不爽.今天将会 ...

  3. Android最强保活黑科技的最强技术实现

    大家好,我是老玩童.今天来跟大家分享TIM最强保活思路的几种实现方法.这篇文章我将通过ioctl跟binder驱动交互,实现以最快的方式唤醒新的保活服务,最大程度防止保活失败.同时,我也将跟您分享,我 ...

  4. 小米盒子4 android版本,安卓系统越用越卡,曾学忠:小米 10 至尊纪念版搭载黑科技 MITurbo 4.0 技术...

    IT之家10月31日消息 昨日,小米集团副总裁.手机部总裁曾学忠谈及了 "Android 系统为什么越用越卡"的问题 曾学忠表示,Android 系统越用越卡是因为用户长时间使用手 ...

  5. SSH隧道技术----端口转发,socket代理

    原文的原始出处不详,本文也是在复制引用了某篇转载,并做了必要的整理与编辑. 本文的受众 如果你遇到了以下问题,那么你应该阅读这篇文章 我听说过这种技术,我对它很感兴趣 我想在家里访问我在公司的机器(写 ...

  6. 未来会有哪些黑科技推动区块链技术的发展

    最近以太坊创始人Vitalik在他的社交媒体上做了一个的投票调查,调查的主题是关于未来有哪些黑科技下一步会推动区块链大发展甚至是产生新的突破,这些选项包括网状网络Mesh Networking.口碑和 ...

  7. 微软黑科技:DNA存储技术催生方糖大小的数据中心

    凤凰科技讯 北京时间4月12日消息,据科技网站Computerworld报道,微软和华盛顿大学研究人员已经展示了利用人工合成DNA作为数据存储介质的技术. 研究人员表示,如果这一技术成熟到适合主流应用 ...

  8. SSH隧道技术及端口映射与转发

    拓扑图 假定攻击机已拿下web服务器且无法访问数据库服务器,以下未说明的ssh命令均在web服务器上完成 ssh正向连接 ssh -CNfL 0.0.0.0:5555:10.10.10.124:80 ...

  9. Android最强保活黑科技的最强技术实现!

    作者:小顽童 https://juejin.cn/post/6844904110219608078 大家好,我是老玩童.今天来跟大家分享TIM最强保活思路的几种实现方法.这篇文章我将通过ioctl跟b ...

最新文章

  1. Powershell管理Active Directory 复制和拓扑
  2. 模式设计概述:反应器(Reactor)模式
  3. MIT类人机器人开始耍杂技了,看这个后空翻它漂亮吗?
  4. 架构师之路 — API 经济 — API 实现方式
  5. Firebug 1.7正式版发布,支持Firefox 4
  6. windows下程序开机自启动(任务计划程序)
  7. 内核虚拟机原理|网络可编程
  8. Linux vim 的编码格式,linux下的文件编码,vim编码
  9. 【python零基础入门学习】Python入门,带你快速学习,Python 环境搭建
  10. PAT乙级(1014 福尔摩斯的约会)
  11. 潮流海报模板|2021渐变流体必备
  12. Android 解决通过自定义设置打开热点后手机搜索不到热点的问题。
  13. 机器学习面试--决策树
  14. Linux 操作系统下的指纹开发
  15. uniapp 复制剪贴板
  16. android蓝牙历史发送记录,蓝牙发送历史记录
  17. VISUAL STUDIO INSTALLER下载速度过慢的解决办法
  18. [Android]按阶段编译Android kernel中的代码
  19. (附源码)spring boot物联网智能管理平台 毕业设计 211120
  20. 两性关系的50个经典客观规律

热门文章

  1. WPF 4 TextBox 笔刷特效
  2. wxpython收费吗_有学习wxpython的同好吗
  3. 10.5k Star!可快速搭建私人网盘的开源项目
  4. 佳能80d有人脸识别吗_3250万像素+10张/秒连拍!佳能90D单反曝光
  5. Linux---进程和计划任务管理
  6. Mybatis #和$获取参数值的区别以及@param的使用场景
  7. 找到 问世间、情为何物的出处
  8. 计算机退出程序的四种方法,退出windows10系统账户的四种方法
  9. linux 之 ps命令介绍
  10. 《编码:隐匿在计算机软硬件背后的语言(Code:The Hidden Language of Computer Hardware and Software)》读书笔记