一个场景:目前越来越多的业务需要远程读写Redis,而Redis 本身不提供 SSL/TLS 的支持,在需要安全访问的环境下。

这时候就需要额外的手段进行加密认证,这里有两种手段:spiped 和 ngx stream proxy

现在服务端起一个监听在127 的 Redis server

1、使用spiped

  1. [root@ ~]# wget http://www.tarsnap.com/spiped/spiped-1.6.0.tgz
  2. [root@ ~]# tar xf spiped-1.6.0.tgz
  3. [root@ ~]# cd spiped-1.6.0
  4. [root@ ~]# tar xf spiped-1.6.0.tgz
  5. [root@ ~]# cd spiped-1.6.0
  6. [root@ spiped-1.6.0]# make && make install
  7. [root@ spiped-1.6.0]# /usr/local/bin/spiped -h
  8. spiped: illegal option -- -h
  9. usage: spiped {-e | -d} -s <source socket> -t <target socket> -k <key file>
  10. [-DFj] [-f | -g] [-n <max # connections>] [-o <connection timeout>]
  11. [-p <pidfile>] [-r <rtime> | -R]
  12. spiped -v

创建key,并将key分发到代理客户端

  1. [root@ ~]# dd if=/dev/urandom bs=32 count=1 of=/var/spiped/redis_proxy.key

启动服务端和客户端代理:

  1. #服务端:
  2. [root@ ~]# /usr/local/bin/spiped -d -s '[0.0.0.0]:6010' -t '[127.0.0.1]:6379' -k /var/spiped/redis_proxy.key -p /var/spiped/redis_proxy_srv.pid
  3. #客户端代理:
  4. [root@ ~]# /usr/local/bin/spiped -e -s '[127.0.0.1]:6379' -t '[x.x.x.x]:6010' -k /var/spiped/redis_proxy.key -p /var/spiped/redis_proxy_cli.pid

客户端测试:

  1. [root@ ~]# /usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 6379 -a redis@passwd ping
  2. PONG

参考:http://www.tarsnap.com/spiped.html

2、使用ngx stream proxy

配置自签证书,略。

证书和key可以同时给服务端代理和客户端代理使用

ngx_stream_ssl_module模块(1.9.0)为流代理服务器提供必要的支持,以使用SSL / TLS协议。 默认情况下不构建此模块,应使用--with-stream_ssl_module配置参数启用它。

编译nginx需要加入--with-stream --with-stream_ssl_module 选项

服务端代理配置:

  1. upstream redis_server{
  2. server 127.0.0.1:6379 max_fails=3 fail_timeout=10s;
  3. }
  4. server{
  5. listen 6010 ssl;
  6. ssl_certificate /data/ssl/stream_proxy/stream_proxy.crt; #服务端证书
  7. ssl_certificate_key /data/ssl/stream_proxy/stream_proxy.key; #服务端key
  8. ssl_verify_client on; #开启对客户端的认证
  9. ssl_client_certificate /data/ssl/stream_proxy/cacert.pem; #用于认证客户端ca证书
  10. ssl_session_timeout 10m;
  11. ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  12. ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
  13. proxy_connect_timeout 5s;
  14. proxy_timeout 5s;
  15. proxy_pass redis6001_server;
  16. error_log /data/logs/redis_sslproxy_srv.log debug;
  17. }

客户端代理配置:

  1. upstream redis_server{
  2. server x.x.x.x:6010 max_fails=3 fail_timeout=10s;
  3. }
  4. server{
  5. listen 127.0.0.1:6379;
  6. proxy_ssl_name stream_proxy; #与证书中的hostname一致,覆盖用于验证后端的hostname,并通过SNI在与后端建立连接时传递,默认proxy_pass地址的host部分会被使用。
  7. proxy_ssl on;
  8. proxy_ssl_certificate /data/ssl/stream_proxy/stream_proxy.crt; #客户端证书
  9. proxy_ssl_certificate_key /data/ssl/stream_proxy/stream_proxy.key; #客户端key
  10. proxy_ssl_verify on; #开启对服务端的认证
  11. proxy_ssl_trusted_certificate /data/ssl/stream_proxy/cacert.pem; #用于认证服务端ca证书
  12. ssl_session_timeout 10m;
  13. proxy_ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  14. proxy_ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
  15. proxy_connect_timeout 5s;
  16. proxy_timeout 5s;
  17. proxy_pass redis_server;
  18. error_log /data/logs/redis_sslproxy_cli.log debug;
  19. }

如果仅仅是实现ngx stream proxy加密不认证的话,只需要在服务端代理配置好证书,客户端代理配置proxy_ssl on即可

参考链接:

1、https://blog.lyz810.com/article/2016/06/ngx_stream_proxy_module_doc_zh-cn/

2、https://blog.lyz810.com/article/2016/06/ngx_stream_ssl_module_doc_zh-cn/

3、https://my.oschina.net/foreverich/blog/1517128?utm_medium=referral

如何对tcp流认证并加密的更多相关文章

  1. Kcptun 是一个非常简单和快速的,基于KCP 协议的UDP 隧道,它可以将TCP 流转换为KCP+UDP 流

    本博客曾经发布了通过 Finalspeed 加速 Shadowsocks 的教程,大家普遍反映能达到一个非常不错的速度.Finalspeed 虽好,就是内存占用稍高,不适合服务器内存本来就小的用户:而 ...

  2. TCP 流模式与UDP数据报模式(转)

    TCP流模式与UDP数据报模式http://blog.csdn.net/s3olo/article/details/7914717 数据报(datagram)通常是指起始点和目的地都使用无连接网络服务 ...

  3. 自学Zabbix11.4 Zabbix SNMP认证与加密配置 SNMPv3

    点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 自学Zabbix11.4 Zabbix SNMP认证与加密配置 SNMPv3 1. 增加snmp ...

  4. SNMP学习笔记之SNMPv3的报文格式以及基于USM的认证和加密过程

    下面我们就主要讲解SNMPv3的报文格式以及基于USM的认证和加密过程! 1.SNMPv3的消息格式 如下图1: 图 1 其中,整个SNMPv3消息可以使用认证机制,并对EngineID.Contex ...

  5. TCP流嗅探和连接跟踪工具tcpick

    TCP流嗅探和连接跟踪工具tcpick   由于网络通信协议众多,TCP连接状态众多,所以TCP分析较为复杂.Kali Linux提供一款专用工具tcpick.该工具支持在线实时嗅探和离线文件嗅探.它 ...

  6. TCP系列31—窗口管理&流控—5、TCP流控与滑窗

    一.TCP流控 之前我们介绍过TCP是基于窗口的流量控制,在TCP的发送端会维持一个发送窗口,我们假设发送窗口的大小为N比特,网络环回时延为RTT,那么在网络状况良好没有发生拥塞的情况下,发送端每个R ...

  7. Socket 编程中,TCP 流的结束标志与粘包问题

    因为 TCP 本身是无边界的协议,因此它并没有结束标志,也无法分包. socket和文件不一样,从文件中读,读到末尾就到达流的结尾了,所以会返回-1或null,循环结束,但是socket是连接两个主机 ...

  8. 使用同一个目的port的p2p协议传输的tcp流特征相似度计算

    结论: (1)使用同一个目的port的p2p协议传输的tcp流特征相似度高达99%.如果他们是cc通信,那么应该都算在一起,反之就都不是cc通信流. (2)使用不同目的端口的p2p协议传输的tcp流相 ...

  9. [TCP/IP] TCP流和UDP数据报之间的区别

    TCP流和UDP数据报之间的区别 1.TCP本身是面向连接的协议,S和C之间要使用TCP,必须先建立连接,数据就在该连接上流动,可以是双向的,没有边界.所以叫数据流 ,占系统资源多 2.UDP不是面向 ...

随机推荐

  1. Jedis自己整理比较全的API

    package com.tebon.ams.utils; import com.alibaba.fastjson.JSON;import com.tebon.ams.util.ObjectUtil;i ...

  2. 关于vue页面多了之后,webpack热更新速度慢的解决办法

    vue项目大了之后,每次热更新都要10多秒的时间, 网上找了一大堆发现一个有用的办法 "env": { "development":{ "plugin ...

  3. Java第四次实践作业

    1 编写“电费管理类”及其测试类.  第一步 编写“电费管理”类 1)私有属性:上月电表读数.本月电表读数 2)构造方法:无参.2个参数 3)成员方法:getXXX()方法.setXXX()方法 4 ...

  4. ARM-linux与Ubuntu开发工具NFS及流程

    Linux虚拟机的型号是:Ubuntu 12.04 VMware:workstation 14 pro   author: Xianghai Ding Date:2019.01.04  板端:Hi35 ...

  5. thinkphp ckeditor与ckfinder

    thinkphp ckeditor与ckfinder 下载 ckeditor下载地址 ckfinder下载地址 整合 将ckeditor与findeditor下载完成后,放到public目录下,配置c ...

  6. 内网gitlab11.2升级至11.4.5

    当前gitlab版本 宿主机是一台ubuntu 运行备份命令 sudo gitlab-rake gitlab:backup:create STRATEGY=copy 升级命令 sudo apt-get ...

  7. Github上36893颗星!这个被称为下一代企业级应用首选技术你学了么?

    ​ 用一句话概括:这个技术,是JAVA后端框架的龙头老大,执牛耳者.这个技术就是: Spring Boot春靴. Spring Boot到底凭什么成为Java社区最具影响力的项目?说直白点,他爹Spr ...

  8. 对int类型的数据,如何让获取长度

    下面为大家写一个列子   int a = 124;<br> Integer a1 = a;//转换为包装类Integer<br> System.out.println(a1.t ...

  9. org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [app2.xml]: Instantiation of bean failed; nested exception is org.spr

    在学习spring整合hubernate时遇到的问题.c3p0遇到了一个问题,老连不上,显示java.lang.NoClassDefFoundError:com.mchange.v2.ser.Indi ...

  10. pygame 游戏舞台搭建典型应用

    #两个文件要放在同一目录中,包括图片 一.搭建游戏舞台主程序 #!/usr/bin/env python3#_*_coding:utf-8_*_ author ==$ VACyp import sys ...