加密隧道技术

news2024/11/18 23:49:39

        在现在的互联网上传输数据,首要考虑的就是安全。这关乎到你的隐私,个人信息,财产安全等等重大问题。如果你的程序本身传输的信息没有加密,也可以通过其他辅助方式让你的通信加密。一些工具的就是为了解决这样的场景的,即数据先通过源端代理,让你的所有通信数据都加密,然后到达目的后再使用目的端代理进行解密后转发给目标进程。即加密隧道的简单示意图如下所示:

       加密隧道的始末即为源端代理和目的端代理。其中数据发送进程和源端代理可以是同在一个主机的不同进程,也可以是分属不同的主机。目的端代理和数据接收进程也一样。如果你也不希望你的数据有任何的明文信息在互联网上传输,你就可以使用加密隧道技术。当然,如果你的数据发送进程和数据接收进程之间的网络通信本身就是加密的,那就不用借助中间的代理环节。

        这种独立于应用本身的加密隧道技术,有一个很明显的优点是它对收发数据的双方完全透明,收发数据的双方不需要任何的变更。另外收发数据的应用因为不用处理加解密数据,应用本身的开发的难度和复杂度也会降低,间接达到解耦的目的。

加密隧道的应用        

        这种加密隧道的一个典型应用是是对http代理的数据进行加密。http代理本身是可以既代理http协议数据,也可以代理https数据的,但是http代理协议的头部还是明文传输的。比如你的浏览器需要通过http代理访问www.bing.com,那么,浏览器发给http代理的协议数据是下面这样的:

Ncat: Connection from 192.168.56.1:51472.
CONNECT www.bing.com:443 HTTP/1.1
Host: www.bing.com:443
Proxy-Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0

        你会发现这完全是明文传输,只要在中间传输的环节截获你这个报文,就知道你要访问的是哪个网址,如果你要访问的地址被认为非法,那么你的报文会直接被丢弃。上面的http头部和普通的http头部有点区别的就是使用的CONNECT方法,这个方法指示代理服务器,让其代理访问目标主机。所以这种也称为CONNECT代理。

        此时就可以使用加密隧道技术,把处于浏览器到代理服务器之间的数据都加密传输。 例如可以在本地局域网的网关部署一个加密隧道源端代理,在http代理服务器机器上或者在其局域网内部署一个加密隧道的目的端代理,目的代理解密后的数据全部转发给http代理服务器。那样我们浏览器的数据就不会在因特网上明文传输了。

加密隧道技术的实现

      这种独立于应用本身的加密隧道技术,还是有不少的。

1、stunnel

        第一种加密隧道技术,当选stunel。stunnel应该能达到企业级的应用标准,stunnel的设计初衷就是为了单纯的建立加密隧道,当然可以覆盖所有场景。stunnel这个我目前还在使用。具体的应用可以参考我的另一篇博文:stunnel 配置(contos7 windows) - 知乎 (zhihu.com)

2、nginx建立加密隧道

        nginx作为网关,我们做IT的一般都知道。完全能满足企业级的应用需求。同时支持高并发和高可靠性。我们用ngixn建立加密隧道也很简单,下面介绍一下使用nginx建立加密隧道的配置

(1)nginx源端代理(客户端)

        配置文件nginx.conf如下:

user root;
worker_processes  4;

events {
    worker_connections  100000;
}

stream {
    server {
        listen 9999;  # 监听9999端口
        proxy_pass 2.2.2.2:9999;  # 将流量加密后转发到2.2.2.2:9999
        proxy_ssl on;  # 启用SSL代理
        #proxy_ssl_verify on;  # 启用SSL验证,这里不验证上游服务的证书,默认是off不验证
        #proxy_ssl_trusted_certificate ../certs/ca.crt;  # 指定可信的CA证书,既然不验证服务端证书,这里也就不需要CA证书
        proxy_ssl_protocols TLSv1.2 TLSv1.3;  # 指定SSL协议版本
        proxy_ssl_session_reuse on;  # 启用SSL会话复用
        proxy_ssl_certificate ../certs/client.crt;  # 客户端SSL证书
        proxy_ssl_certificate_key ../certs/client.key;  # 客户端SSL证书私钥
        proxy_ssl_verify_depth 2;  # SSL验证深度
    }
}

        上面的客户端和服务端配置,需要自己生成各种证书,如果有现成的就可以拿来用。上面作为客户端的nginx配置没有校验服务端的证书,如果要更高的安全要求可以加上。 

 (2)nginx目的端代理(服务端)

         服务端的配置nginx.conf如下:

#user  nobody;
user root;
worker_processes  4;

events {
    worker_connections  65535;
}

stream {
    server {
        listen 9999 ssl;  # 监听8080端口并启用SSL
		server_name ssl-tunnel-server;
        ssl_certificate ../certs/server.crt;  # SSL证书路径
        ssl_certificate_key ../certs/server.key;  # SSL证书私钥路径
        ssl_client_certificate ../certs/ca.crt;  # 指定可信的CA证书
        ssl_verify_client on;  # 启用客户端SSL验证,那么就需要配置ca证书,就是上面的ssl_client_certificate指定的ca证书
        proxy_pass 127.0.0.1:4433;  # 将流量代理到本地端口
    }
}

        

3、ssh加密隧道 

        我们常用的ssh命令,很多人都只是用来做远程登录工具的。其实它还有一个作用是给我们建立一条加密隧道,从而让我们通过这条加密隧道,安全的访问远程主机。并且ssh加密隧道的建立不需要我们做任何额外的配置,只需要一条命令就能完成。命令如下:

ssh -f -L 0.0.0.0:9999:113.104.189.18:6379 root@1.1.1.1 -N -g

-f是让ssh命令能在后台运行,直到有连接到来才转入前台运行

-L后面跟本地监听端口以及将数据转发到达的远程主机的ip端口,即两组ip端口,即local_ip:local_port:remote_ip:remote_port的格式,如果本地绑定任意ip,0.0.0.0也可以不写出来,只用9999:113.104.189.18:6379.其中remote_ip:port是想访问的任意远程主机ip和端口,也可以是ssh服务器端所在主机的ip端口

-N 是告诉远程主机,只负责转发隧道数据,不执行任何命令。没有这个参数,ssh对端收到后一般是要执行这个命令的,也就是正常的远程shell的功能。

-g 参数,是为了使当前ssh隧道能被除本机外的进程使用,没有该选项,默认只有本地数据包可以通过该隧道,也是一种安全机制,防止在非授权的情况下被其他主机使用

root@1.1.1.1是远程主机的ip和用户名,也可以在后面用":port"添加端口,默认都是22端口。

假设ssh客户端所在主机的ip是192.169.56.2,则执行完成后建立的加密隧道示意图如下:

        数据发送主机和ssh客户端主机可以是在同一台,数据接收主机和ssh服务端主机也可以是同一台 。图中用***表示的是系统随机分配的端口。这时候你会发现这个ssh隧道还有一个很好的用处,就是能绕过防火墙。假如ssh服务端主机防火墙只开放了22端口(这个是ssh端口,一般服务器都会开放),但是你要访问该主机的其他端口,怎么办,用这个ssh隧道,就能做一个端口转发,将22端口的数据转发给其他端口,比如80端口。

        用ssh建立加密隧道,只是用作暂时的,一旦某个时候连接断开后,就不会重连了,需要重新执行这个命令。这就不能作为提供长久通道的服务,这就是有很大的局限性

        另外VPN也可以作为加密隧道,其实VPN本身和外部的通信就是加密的,我们可以借助这个加密通道做任何事而不用担心被别人窥探到。比如你浏览器访问的任何地址,如果你都是通过VPN服务器作为出口的话,别人即使在中途截获了你的请求数据,只知道是这台VPN服务器访问了某个网址,而无法得知是这个VPN网络中的哪一个用户,因为明文的http头部信息只能在VPN服务器到目标网址之间被截获,而不可能在你的主机到VPN服务器之间被截获。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1484971.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【二分】第k个缺失的数

第K个缺失的数 链接 . - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/kth-missing-positive-number/ 题目 题解 二段…

【GPU驱动开发】-mesa简介

前言 不必害怕未知,无需恐惧犯错,做一个Creator! 一、mesa介绍 Mesa 是一个开源的3D图形库,它实现了多种图形API,包括 OpenGL、Vulkan 和 OpenCL。Mesa 的目标是提供一个开源、跨平台的图形库,使得开发者…

Qt/自定义控件的封装

新建文件,选择Qt设计师界面类 创建空界面 这是自己控件封装的文件,双击跳转到设计界面进行设计 跳转到其他的ui界面,创建一个widget 右键,选择提升为 在提升的类名称输入刚刚创建的类名,添加后选择提升,勾选…

WINDOWS内存管理 - 返回状态值

DDK大部分函数的返回值类型是NTSTATUS类型。查看DDK.h文件,可以看到 typedef LONG NTSTATUS; NTSTATUS的定义和LONG等价。为了函数的形式统一,所有函数的返回值都是NTSTATUS类型。NTSTATUS就是一个32位的整数,其每位有着不同的含义&#xf…

FCIS 2023网络安全创新大会:洞察前沿技术,探索安全新境界(附大会核心PPT下载)

随着信息技术的飞速发展,网络安全问题日益凸显,成为全球关注的焦点。作为网络安全领域的重要盛会,FCIS 2023网络安全创新大会如期而至,汇聚了全球网络安全领域的顶尖专家、学者、企业家和政策制定者,共同探讨网络安全的…

并查集学习: leetcode 2368. 受限条件下可到达节点的数目

现有一棵由 n 个节点组成的无向树,节点编号从 0 到 n - 1 ,共有 n - 1 条边。 给你一个二维整数数组 edges ,长度为 n - 1 ,其中 edges[i] [ai, bi] 表示树中节点 ai 和 bi 之间存在一条边。另给你一个整数数组 restricted 表示…

LeetCode_Java_动态规划系列(2)(题目+思路+代码)

131.分割回文串 给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。 回文串 是正着读和反着读都一样的字符串。 示例 1: 输入:s "aab" 输出:[["a&qu…

Redis的高性能之道

前言:做码农这么多年,我也读过很多开源软件或者框架的源码,在我看来,Redis是我看过写得最优美、最像一件艺术品的软件,正如Redis之父自己说的那样,他宁愿以一个糟糕的艺术家身份而不是一名好程序员被别人记…

【双指针】删除有序数组中重复元素,双指针原地修改数组

删除有序数组中重复元素 链接 . - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/remove-duplicates-from-sorted-array/…

Programming Abstractions in C阅读笔记:p308-p311

《Programming Abstractions in C》学习第76天&#xff0c;p308-p311总结&#xff0c;总计4页。 一、技术总结 1.快速排序伪代码 #include <stdbool.h>static int Partition(int array[], int n);/** Implementation notes: SortIntegerArray* ----------------------…

实践航拍小目标检测,基于YOLOv8全系列【n/s/m/l/x】参数模型开发构建无人机航拍场景下的小目标检测识别分析系统

关于无人机相关的场景在我们之前的博文也有一些比较早期的实践&#xff0c;感兴趣的话可以自行移步阅读即可&#xff1a; 《deepLabV3Plus实现无人机航拍目标分割识别系统》 《基于目标检测的无人机航拍场景下小目标检测实践》 《助力环保河道水质监测&#xff0c;基于yolov…

Django后端开发——中间件

文章目录 参考资料中间件注册中间件settings.pymiddleware/mymiddleware.pymysite3/views.pymysite3/urls.py 练习 参考资料 B站网课&#xff1a;点击蓝色字体跳转 或复制链接至浏览器&#xff1a;https://www.bilibili.com/video/BV1vK4y1o7jH?p39&vd_source597e21cf34f…

嵌入式Linux中GPIO设置的一些基本指令和步骤

一、GPIO的介绍 嵌入式Linux中的GPIO&#xff08;General Purpose Input/Output&#xff0c;通用输入/输出&#xff09;是一种常用的接口&#xff0c;允许开发者直接控制硬件设备的某些引脚&#xff0c;进行诸如LED控制、传感器读取、设备状态监测等任务。 二、设置步骤和示例…

08 yum和git

什么是软件包 安装软件&#xff0c;一个通常的办法就是下载程序的源代码进行编译。这种太麻烦&#xff0c;于是一些人把常用软件编译好&#xff0c;做成软件包放在服务器上&#xff0c;通过包管理器可以很方便的得到这个软件包安装&#xff0c;就好比手机上的应用商店 yum&am…

LeetCode 刷题 [C++] 第121题.买卖股票的最佳时机

题目描述 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易中获取的…

基于springboot+vue的中国陕西民俗网

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

ASUS华硕ROG冰刃6双屏GX650RX工厂模式原厂Windows11系统 带MyASUS WinRE恢复重置功能 恢复出厂开箱状态

华硕冰刃6笔记本电脑oem预装Win11系统&#xff0c;适用型号&#xff1a; NR2202RX_GX650RX、NR2202RW_GX650RW NR2202RM_GX650RM、NR2202RS_GX650RS 链接&#xff1a;https://pan.baidu.com/s/1nnGlmnqJ_YZIOX7RQXjhuQ?pwd79hm 提取码&#xff1a;79hm 原装出厂系统带有A…

大数据技术(一)

大数据技术概述 大数据技术层面及其功能 数据采集与预处理 利用ETL(extract-transform-load)工具将分布的、异构数据源中的数据&#xff0c;如关系数据、平面数据文件等&#xff0c;抽取到临时中间层后进行清洗、转换、集成&#xff0c;最后加载到数据仓库或数据集市中&…

【leetcode】用栈实现队列

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家刷题&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 点击查看题目 思路: 在做此题之前&#xff0c;我们先要实现栈&#xff0c;这在上个博客中已经写过&#xf…

Doris【数据模型】

一、数据模型简介 在 Doris 中&#xff0c;数据以表&#xff08;Table&#xff09;的形式进行逻辑上的描述。 一张表包括行&#xff08;Row&#xff09;和列&#xff08;Column&#xff09;。Row 即用户的一行数据。Column 用于描述一行数据中不同的字段。 Column 可以分为两…