Redis知识梳理(25)[ Redis 安全通讯 ]
想象这样一个应用场景,公司有两个机房。因为一个紧急需求 , 需要跨机房读 取 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.key501 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 安全通讯 ]相关推荐
- 思维导图系列之Redis知识梳理
从Redis的基础.分布式锁.缓存雪崩.缓存击穿.缓存穿透.持久化.高可用.内存淘汰机制等方面去罗列主要知识点,以思维导图的方式进行呈现,可以让读者更条理清晰的在最短的时间内掌握Redis的主要知识 ...
- [redis]知识回顾之redis主从+哨兵搭建简要记录
1.先准备环境 家里的万年老爷机(120G的SSD,300G硬盘 ),手机热点下载,所以只能少利用空间资源,用virtualBox装centos7纯净版 其中要点: 1.virtualbox创建新机要 ...
- 思维导图系列之MySQL知识梳理
上一系列:思维导图系列之Redis知识梳理 从MySQL的基础.存储引擎.索引.锁.事务.分库分表.性能分析.使用规范及优化方面去罗列主要知识点,以思维导图的方式进行呈现,可以让读者更条理清晰的在最短 ...
- Redis高性能原理:Redis为什么这么快?
前言:Redis 为了高性能,从各方各面都进行了优化.学习一门技术,通常只接触了零散的技术点,没有在脑海里建立一个完整的知识框架体系.这样会很吃力,而且会出现一看好像自己会,过后就忘记的懵逼情况.知识 ...
- Redis知识总结[一]
目录 Redis安装及基本操作 Redis数据类型 key键 五大数据类型 String(字符串) List(列表) set(集合) Hash(哈希) Zset(有序集合) 新数据类型 Bitmaps ...
- 知识体系之Redis
目录 1.Redis数据结构 2.底层数据结构 2.1.简单动态字符串SDS 2.2.哈希表 2.3.压缩列表ziplist 2.4.跳跃表skipList 3.过期删除与内存淘汰 3.1.Redis ...
- Redis知识总结(四万字)
一.Redis的概述 1.1 NoSQL的简介 1.1.1 NoSQL为什么会出现 从功能角度来讲,出现了各种编程语言 c语言,c++, java,scala,php,python等 从扩展角度来讲, ...
- 面试官最爱问的Redis(三)Redis的基本知识
面试官最爱问的redis,继续整理了Redis的学习笔记,动力节点的redis视频,13个小时搞定redis,笔记分享给大家. 视频资源:https://www.bilibili.com/video/ ...
- 25 Redis的缓存中的数据和数据库中的不一致问题
25 Redis的缓存中的数据和数据库中的不一致问题 前言 一.缓存和数据库的数据不一致是如何发生的? 二.解决Redis 和数据库数据不一致的方法 总结 前言 Redis 缓存经常会遇到有 4 个方 ...
最新文章
- 论文: Data-Driven Evolutionary Optimization: An Overview and case studies(1) 数据驱动概念,文章结构,大数分类
- 从无头单链表中删除节点 结构之法 4
- java获取数据库的列名,类型等信息
- hdu4821 字符串hash(有多少(M*L长的,M个不相同)子串))
- Jmeter服务器监控插件使用
- JAVA 常用框架和工具
- java注解中可使用对象_Java注解(二):实战 - 直接使用对象列表生成报表...
- client中周期性边界_(整理)周期性边界条件.
- DBN【深度置信网络】【受限玻尔兹曼机深层】详解
- Option,Some,None
- Anaconda——conda换源可以直接通过conda命令来实现
- java怎么做界面设计_11-Java 界面设计
- 垃圾大学,想自学 Java 可以吗?难吗?毕业后能找到一份 6k左右的工作吗?
- 神鬼世界更新完了为什么显示与服务器断开连接,全新服务器构架 神鬼世界6月23日数据互通公告...
- 9个国外最佳免费编程学习一站式网站,谁用谁知道!
- numpy之多维数组
- 【转载】CSS3之Clip(裁剪)拓展阅读
- labelme标注结果可视化(持续补充)
- 链接脚本(一)基本概念和格式
- 倍分法DID:一组参考文献