想象这样一个应用场景,公司有两个机房。因为一个紧急需求 , 需要跨机房读 取 Redis 数据。应用部署在 A 机房,存储部署在 B 机房。如果使用普通 tcp 直接访问, 因为跨机房所以传输数据会暴露在公网上,这非常不安全,客户端服务器交互的数 据存在被窃昕的风险,如图 4-11 所示。

Redis本身并不支持 SSL安全链接,不过有了 SSL代理软件,我们可以让通信 数据得到加密,就好像 Redis 穿上了一层隐身外套一样,如图 4-12 所示。 spiped 就 是这样的一款 SSL 代理软件,它是 Redis 官方推荐的代理软件

spiped 原理

左边 的 spiped 进程负责接受来自 Redis Client 发送过来的请求数 据 , 加密后传送到右边的 叩iped 进程 。 右边的 spiped 进程将接收到的数据解密后传递 至1J Redis Server。然后 Redis Server再走一个反向的流程将响应回复给 Redis Client。

左边的 spiped 进程 A 负责接受来自 Redis Client 发送过来的请求数据,加密 后传送到右边的 spiped 进程 B。spiped B 将接收到的数据解密后传递到 Redis Server。然后 Redis Server 再走一个反向的流程将响应回复给 Redis Client。

每一个 spiped 进程都会有一个监听端口 (server socket) 用来接收数据,同时 还会作为一个客户端 (socket client) 将数据转发到目标地址。

spiped 进程需要成对出现,相互之间需要使用相同的共享密钥来加密消息。

spiped 使用入门

安装 spiped,我用的是 Mac。

> brew install spiped

如果是 Linux,可以使用 apt-get 或者 yum 安装:

  > apt-get install spiped> yum install spiped

1. 使用 Docker 启动 redis-server,注意要绑定本机的回环 127.0.0.1 ;

> docker run -d -p127.0.0.1:6379:6379 --name redis-server-6379 redis

2. 生成随机的密钥文件;

# 随机的 32 个字节
> dd if=/dev/urandom bs=32 count=1 of=spiped.key
1+0 records in
1+0 records out
32 bytes transferred in 0.000079 secs (405492 bytes/sec) > ls -l
rw-r–r-- 1 qianwp staff 32 7 24 18:13 spiped.key

3. 使用密钥文件启动服务器 spiped 进程, 172.16.128.81 是我本机的公网 IP 地址;

# -d 表示 decrypt(对输入数据进行解密),-s 为源监听地址,-t 为转发目标地址
> spiped -d -s ‘[172.16.128.81]:6479’ -t ‘[127.0.0.1]:6379’ -k spiped.key
> ps -ef|grep spiped
501 30673 1 0 7:29 下午 ?? 0:00.04 spiped -d -s [172.16.128.81]:6479 -t [127.0.0.1]:6379 -k spiped.key

这个 spiped 进程监听公网 IP 的 6479 端口接收公网上的数据,将数据解密后转 发到本机回环地址的 6379 端口,也就是 redis-server 监听的端口。

4. 使用密钥文件启动客户端 spiped 进程, 172.16.128.81 是我本机的公网 IP 地址;

# -e 表示 encrypt,对输入数据进行加密
> spiped -e -s ‘[127.0.0.1]:6579’ -t ‘[172.16.128.81]:6479’ -k spiped.key
> ps -ef|grep spiped
501 30673 1 0 7:29 下午 ?? 0:00.04 spiped -d -s [172.16.128.81]:6479 -t [127.0.0.1]:6379 -k spiped.key

501 30696 1 0 7:30 下午 ?? 0:00.03 spiped -e -s [127.0.0.1]:6579 -t [172.16.128.81]:6479 -k spiped.key

客户端 spiped 进程监听了本地回环地址的 6579 端口,将该端口上收到的数据 加密转发到服务器 spiped 进程

5. 启动客户端链接,因为 Docker 里面的客户端不好访问宿主机的回环地址, 所以 Redis 的客户端我们使用 Python 代码来启动;

​ >> import redis
>> c=redis.StrictRedis(host=“localhost”, port=6579)
>> c.ping()
>> c.info(‘cpu’)
{‘used_cpu_sys’: 4.83,
‘used_cpu_sys_children’: 0.0,
‘used_cpu_user’: 0.93,
‘used_cpu_user_children’: 0.0}

可以看出客户端和服务器已经通了,如果我们尝试直接链接服务器 spiped 进程 (加密的端口 6379),看看会发生什么。

>>> import redis

c=redis.StrictRedis(host=“172.16.128.81”, port=6479)
c.ping()
Traceback (most recent call last):
File “”, line 1, in
File “/Users/qianwp/source/animate/juejin-redis/.py/lib/python2.7/site-packages/redis/client.py”
return self.execute_command(‘PING’)
File “/Users/qianwp/source/animate/juejin-redis/.py/lib/python2.7/site-packages/redis/client.py”
return self.parse_response(connection, command_name, **options)
File “/Users/qianwp/source/animate/juejin-redis/.py/lib/python2.7/site-packages/redis/client.py”
response = connection.read_response()
File “/Users/qianwp/source/animate/juejin-redis/.py/lib/python2.7/site-packages/redis/connection.py”
response = self._parser.read_response()
File “/Users/qianwp/source/animate/juejin-redis/.py/lib/python2.7/site-packages/redis/connection.py”
response = self._buffer.readline()
File “/Users/qianwp/source/animate/juejin-redis/.py/lib/python2.7/site-packages/redis/connection.py”
self._read_from_socket()
File “/Users/qianwp/source/animate/juejin-redis/.py/lib/python2.7/site-packages/redis/connection.py”
(e.args,))
redis.exceptions.ConnectionError: Error while reading from socket: (‘Connection closed by server.’ ,)

从输出中可以看出来请求是发送过去了,但是却出现了读超时,要么是服务器在
默认的超时时间内没有返回数据,要么是服务器没有返回客户端想要的数据。

spiped 可以同时支持多个客户端链接的数据转发工作,它还可以通过参数来限 定允许的最大客户端连接数。但是对于服务器 spiped,它不能同时支持多个服器之间的转发。意味着在集群环境下,需要为每一个 server 节点启动一个 spiped 进程来代收消息,在运维实践上这可能会比较繁琐。

Redis知识梳理(25)[ Redis 安全通讯 ]相关推荐

  1. 思维导图系列之Redis知识梳理

    从Redis的基础.分布式锁.缓存雪崩.缓存击穿.缓存穿透.持久化.高可用.内存淘汰机制等方面去罗列主要知识点,以思维导图的方式进行呈现,可以让读者更条理清晰的在最短的时间内掌握Redis的主要知识 ...

  2. [redis]知识回顾之redis主从+哨兵搭建简要记录

    1.先准备环境 家里的万年老爷机(120G的SSD,300G硬盘 ),手机热点下载,所以只能少利用空间资源,用virtualBox装centos7纯净版 其中要点: 1.virtualbox创建新机要 ...

  3. 思维导图系列之MySQL知识梳理

    上一系列:思维导图系列之Redis知识梳理 从MySQL的基础.存储引擎.索引.锁.事务.分库分表.性能分析.使用规范及优化方面去罗列主要知识点,以思维导图的方式进行呈现,可以让读者更条理清晰的在最短 ...

  4. Redis高性能原理:Redis为什么这么快?

    前言:Redis 为了高性能,从各方各面都进行了优化.学习一门技术,通常只接触了零散的技术点,没有在脑海里建立一个完整的知识框架体系.这样会很吃力,而且会出现一看好像自己会,过后就忘记的懵逼情况.知识 ...

  5. Redis知识总结[一]

    目录 Redis安装及基本操作 Redis数据类型 key键 五大数据类型 String(字符串) List(列表) set(集合) Hash(哈希) Zset(有序集合) 新数据类型 Bitmaps ...

  6. 知识体系之Redis

    目录 1.Redis数据结构 2.底层数据结构 2.1.简单动态字符串SDS 2.2.哈希表 2.3.压缩列表ziplist 2.4.跳跃表skipList 3.过期删除与内存淘汰 3.1.Redis ...

  7. Redis知识总结(四万字)

    一.Redis的概述 1.1 NoSQL的简介 1.1.1 NoSQL为什么会出现 从功能角度来讲,出现了各种编程语言 c语言,c++, java,scala,php,python等 从扩展角度来讲, ...

  8. 面试官最爱问的Redis(三)Redis的基本知识

    面试官最爱问的redis,继续整理了Redis的学习笔记,动力节点的redis视频,13个小时搞定redis,笔记分享给大家. 视频资源:https://www.bilibili.com/video/ ...

  9. 25 Redis的缓存中的数据和数据库中的不一致问题

    25 Redis的缓存中的数据和数据库中的不一致问题 前言 一.缓存和数据库的数据不一致是如何发生的? 二.解决Redis 和数据库数据不一致的方法 总结 前言 Redis 缓存经常会遇到有 4 个方 ...

最新文章

  1. 论文: Data-Driven Evolutionary Optimization: An Overview and case studies(1) 数据驱动概念,文章结构,大数分类
  2. 从无头单链表中删除节点 结构之法 4
  3. java获取数据库的列名,类型等信息
  4. hdu4821 字符串hash(有多少(M*L长的,M个不相同)子串))
  5. Jmeter服务器监控插件使用
  6. JAVA 常用框架和工具
  7. java注解中可使用对象_Java注解(二):实战 - 直接使用对象列表生成报表...
  8. client中周期性边界_(整理)周期性边界条件.
  9. DBN【深度置信网络】【受限玻尔兹曼机深层】详解
  10. Option,Some,None
  11. Anaconda——conda换源可以直接通过conda命令来实现
  12. java怎么做界面设计_11-Java 界面设计
  13. 垃圾大学,想自学 Java 可以吗?难吗?毕业后能找到一份 6k左右的工作吗?
  14. 神鬼世界更新完了为什么显示与服务器断开连接,全新服务器构架 神鬼世界6月23日数据互通公告...
  15. 9个国外最佳免费编程学习一站式网站,谁用谁知道!
  16. numpy之多维数组
  17. 【转载】CSS3之Clip(裁剪)拓展阅读
  18. labelme标注结果可视化(持续补充)
  19. 链接脚本(一)基本概念和格式
  20. 倍分法DID:一组参考文献

热门文章

  1. 苹果真伪查询_苹果自研M1芯片Mac电脑开启预售!该不该冲?
  2. 1002-过河卒-洛谷-luogu-动态规划dp
  3. mac软件卸载不干净?你没用对工具!!试试这款mac卸载神器!
  4. oracle表连接查询逗号隔开_Oracle多表连接查询
  5. SEM纳米颗粒图像粒径分析 基于ImageJ
  6. iOS Workspace内多project开发
  7. 投资银行业务过关必做1500题
  8. 深度学习图像分类(六):Stochastic_Depth_Net
  9. php-emoji使用微信,微信开发中emoji表情的问题
  10. 简单的数据库连接测试方法