通过windows ip转发连接redis集群,随时都可以删库跑路

发布时间 2023-07-17 15:34:54作者: 伊丽莎白菜

背景

假设redis集群部署地址如下,从本地pc只能访问公网地址,内网地址不通。

公网地址 内网地址 端口
114.252.41.111 192.168.0.184 8001
114.252.41.111 192.168.0.184 8002
114.252.41.135 192.168.0.182 8001
114.252.41.135 192.168.0.182 8002
114.252.41.241 192.168.0.59 8001
114.252.41.241 192.168.0.59 8002

而由于redis集群的机制,通过hash算法得出slot和节点后,会直接通过节点的内网地址进行重定向,内网地址不通导致我没法从pc直接连接集群。给我删除跑路造成了很大的不便。于是我决定解决这个问题。

总体方案

  1. 把所有内网地址都添加到本地,此时本机具有多个内网ip;
  2. 利用windows ip转发,把内网tcp地址上的请求,转发到公网地址。

实施过程

添加内网地址

  1. 更改网络适配器设置 -> TCP/IPv4
  2. 使用静态ip地址,然后选择“高级”
  3. 添加更多ip地址
  4. 使用ipconfig查看

添加ip转发规则

以管理员身份运行:

netsh interface portproxy add v4tov4 listenaddress=192.168.0.184 listenport=8001 connectaddress=114.252.41.111 connectport=8001
netsh interface portproxy add v4tov4 listenaddress=192.168.0.184 listenport=8002 connectaddress=114.252.41.111 connectport=8002
netsh interface portproxy add v4tov4 listenaddress=192.168.0.182 listenport=8001 connectaddress=114.252.41.135 connectport=8001
netsh interface portproxy add v4tov4 listenaddress=192.168.0.182 listenport=8002 connectaddress=114.252.41.135 connectport=8002
netsh interface portproxy add v4tov4 listenaddress=192.168.0.59 listenport=8001 connectaddress=114.252.41.241 connectport=8001
netsh interface portproxy add v4tov4 listenaddress=192.168.0.59 listenport=8002 connectaddress=114.252.41.241 connectport=8002

查看:

 netsh interface portproxy show all

输出如下:

侦听 ipv4:                 连接到 ipv4:

地址            端口        地址            端口
--------------- ----------  --------------- ----------
192.168.0.184   8001        114.252.41.111  8001
192.168.0.59    8001        114.252.41.241  8001
192.168.0.59    8002        114.252.41.241  8002
192.168.0.184   8002        114.252.41.111  8002
192.168.0.182   8001        114.252.41.135  8001
192.168.0.182   8002        114.252.41.135  8002

验证

以任意redis客户端(如redis-cli, RedisInsight, Another Redis Desktop Manager)连接redis集群:

如图,已经连接成功。