当前位置: 首页 > news >正文

多服务器IP白名单配置(使用redis stream实现)

应用背景

现在我有一个管理平台,可以通过代理连接到内网网站,但是这个代理服务器没有设置密码,所以需要IP白名单让指定用户才可以使用代理。

添加白名单流程图

在这里插入图片描述

流程描述:

  1. 登录管理平台成功后,管理平台的后台将这个登录的IP地址添加到redis,并设置过期时间为24小时
  2. redis通过stream将这个IP分发给每台代理服务器
  3. 代理服务器通过redis客户端接收到消息后,更新白名单
  4. 如果IP地址过期了,管理平台也会发送消息通知每台代理服务器,将过期的IP地址从每台代理服务器上移除

使用Python实现

  • 管理平台端

    1. redis客户端基本配置

      import asyncio
      from typing import AsyncIterator
      import aioredisfrom src.redis_client.redis_config import redis_config
      from src.redis_client.log import logclass AsyncRedisClient:def __init__(self):self.db = redis_config.dbself.password = redis_config.passwordself.port = redis_config.portself.host = redis_config.hostself.connect_pool = aioredis.ConnectionPool.from_url(f"redis://{self.host}:{self.port}",db=self.db,password=self.password,decode_responses=True,)self._stream_key = "ip_whitelist_stream"  # Stream消息队列键名async def connect(self):self.client = aioredis.Redis(connection_pool=self.connect_pool)async def close(self):await self.client.close()
      
    2. 添加IP到白名单,并通过Stream通知所有客户端

          async def add_ip_to_whitelist(self, ip: str, expire_seconds: int = 3600 * 24) -> bool:"""添加IP到白名单,并通过Stream通知所有客户端:param ip: IP地址:param expire_seconds: 过期时间(秒):return: 是否添加成功"""# 1. 使用Set存储IP(确保唯一性)added = await self.client.sadd("ip_whitelist", ip)if not added:return False  # IP已存在# 2. 设置TTL(通过单独的键实现精确过期控制)await self.client.setex(f"ip_whitelist_ttl:{ip}", expire_seconds, "active")# 3. 发送Stream消息通知其他客户端(包含操作类型和过期时间)await self.client.xadd(self._stream_key,{"ip": ip, "action": "add", "expire": str(expire_seconds)},maxlen=1000,  # 限制Stream长度防止内存溢出)log.info(f"发布消息到Stream: {ip}")return True
      
    3. 移除代理IP并发送通知

          async def remove_ip_from_whitelist(self, ip: str) -> bool:"""移除代理IP并发送通知"""removed = await self.client.srem("ip_whitelist", ip)if removed:await self.client.delete(f"ip_whitelist_ttl:{ip}")await self.client.xadd(self._stream_key, {"ip"
http://www.lryc.cn/news/575172.html

相关文章:

  • 神经网络的运作方式类比讲解
  • 【EI会议征稿】东北大学主办第三届机器视觉、图像处理与影像技术国际会议(MVIPIT 2025)
  • Arm架构下麒麟V10桌面版安装MySQL
  • Android14音频子系统-Linux音频子系统ASoC-ALSA
  • Linux size命令详解
  • Android14音频子系统-Linux音频子系统ALSA
  • MFC对话框启动时就隐藏窗口
  • 开疆智能CCLinkIE转ModbusTCP网关连接脉冲计数器配置案例
  • matlab机器人工具箱(Robotics Toolbox)安装及使用
  • 分布式系统 - 分布式缓存及方案实现
  • python网络自动化-数据格式与数据建模语言
  • 如何快速将iPhone中的文本保存到电脑上
  • 基于SSM框架+mysql实现的监考安排管理系统[含源码+数据库+项目开发技术手册]
  • PHP爬虫实战:轻松获取京东商品SKU信息
  • 计算机网络-----详解HTTP协议
  • 【编程基本功】Win11中Git安装配置全攻略,包含Git以及图形化工具TortoiseGit
  • 芯谷科技--升压/升降压DC-DC转换器D5209
  • 无人船:科技驱动,快速发展,前景广阔
  • 云计算产业链
  • pscc系统如何部署,怎么更安全更便捷?
  • 【EDA软件】【应用功能子模块网表提供和加载编译方法】
  • 【番外篇】TLS指纹
  • sentinel与seata组件在微服务中的基本作用
  • 文档处理控件Aspose.Words教程:在.NET中将多页文档转换为单个图像
  • AES加密:为你的PDF文档加上一道钢铁防线
  • 用Rust写平衡三进制乘法器
  • C++ GDB 调试
  • 局域网环境下浏览器安全限制的实用方法
  • MAC、IP地址、TCP、UDP、SSL、OSI模型
  • SpringCloud系列(36)--SpringCloud Gateway简介