Skip to content

Redis 防火墙配置

防火墙简介

什么是防火墙?

防火墙是一种网络安全设备,根据预设的安全规则监控和控制进出网络的流量。对于Redis,防火墙提供:

  • 访问控制:限制哪些IP地址可以连接到Redis
  • 端口保护:保护Redis端口免受未授权访问
  • 网络分段:将Redis与不可信网络隔离
  • 威胁防护:阻止针对Redis的恶意流量

为什么要为Redis配置防火墙?

  • Redis没有内置的网络级访问控制
  • 默认Redis配置不安全(无密码,绑定到所有接口)
  • Redis是攻击者的高价值目标
  • 合规要求通常强制要求防火墙保护
  • 防止未授权的数据访问和操作

Redis默认端口

端口描述用途
6379默认Redis服务器端口标准客户端连接
6380默认Redis SSL端口SSL加密的客户端连接
26379默认Redis Sentinel端口Sentinel监控和故障转移
26380默认Redis Sentinel SSL端口SSL加密的Sentinel通信
16379默认Redis Cluster总线端口集群节点间通信
16380默认Redis Cluster SSL总线端口SSL加密的集群通信

防火墙配置

Linux防火墙(iptables)

基本Redis端口允许

bash
# 允许环回连接
iptables -A INPUT -i lo -j ACCEPT

# 允许已建立的连接
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# 允许特定IP访问Redis默认端口
iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 6379 -j ACCEPT
iptables -A INPUT -p tcp -s 10.0.0.0/8 --dport 6379 -j ACCEPT

# 允许特定IP访问Redis SSL端口
iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 6380 -j ACCEPT

# 允许Redis Sentinel端口
iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 26379 -j ACCEPT

# 允许Redis Cluster总线端口
iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 16379 -j ACCEPT

# 丢弃所有其他入站流量
iptables -P INPUT DROP

保存iptables规则

bash
# 在Debian/Ubuntu上
iptables-save > /etc/iptables/rules.v4

# 在CentOS/RHEL上
iptables-save > /etc/sysconfig/iptables

Linux防火墙(firewalld)

启用并启动firewalld

bash
sudo systemctl enable firewalld
sudo systemctl start firewalld

向firewalld添加Redis端口

bash
# 允许特定IP访问Redis默认端口
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="6379" accept'
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.0.0/8" port protocol="tcp" port="6379" accept'

# 允许Redis SSL端口
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="6380" accept'

# 允许Redis Sentinel端口
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="26379" accept'

# 允许Redis Cluster总线端口
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="16379" accept'

# 重新加载firewalld以应用更改
sudo firewall-cmd --reload

验证firewalld配置

bash
sudo firewall-cmd --list-all

Windows防火墙

使用Windows Defender高级安全防火墙

  1. 打开Windows Defender高级安全防火墙
  2. 点击入站规则 > 新建规则
  3. 选择端口 > 下一步
  4. 选择TCP并输入Redis端口(例如:6379) > 下一步
  5. 选择允许连接 > 下一步
  6. 选择何时应用规则 > 下一步
  7. 输入名称(例如:"Redis Port 6379") > 完成
  8. 右键单击新规则 > 属性 > 作用域
  9. 远程IP地址下,选择这些IP地址 > 添加
  10. 输入允许的IP地址 > 确定 > 应用

使用PowerShell

powershell
# 允许特定IP访问Redis端口
New-NetFirewallRule -DisplayName "Redis Port 6379" -Direction Inbound -Protocol TCP -LocalPort 6379 -Action Allow -RemoteAddress 192.168.1.0/24,10.0.0.0/8

# 允许Redis SSL端口
New-NetFirewallRule -DisplayName "Redis SSL Port 6380" -Direction Inbound -Protocol TCP -LocalPort 6380 -Action Allow -RemoteAddress 192.168.1.0/24

# 允许Redis Sentinel端口
New-NetFirewallRule -DisplayName "Redis Sentinel Port 26379" -Direction Inbound -Protocol TCP -LocalPort 26379 -Action Allow -RemoteAddress 192.168.1.0/24

# 允许Redis Cluster总线端口
New-NetFirewallRule -DisplayName "Redis Cluster Bus Port 16379" -Direction Inbound -Protocol TCP -LocalPort 16379 -Action Allow -RemoteAddress 192.168.1.0/24

云提供商防火墙

AWS安全组

bash
# 使用AWS CLI
aws ec2 authorize-security-group-ingress \
  --group-id sg-12345678 \
  --protocol tcp \
  --port 6379 \
  --cidr 192.168.1.0/24

aws ec2 authorize-security-group-ingress \
  --group-id sg-12345678 \
  --protocol tcp \
  --port 6380 \
  --cidr 192.168.1.0/24

Azure网络安全组

bash
# 使用Azure CLI
az network nsg rule create \
  --resource-group myResourceGroup \
  --nsg-name myNSG \
  --name RedisPort \
  --protocol Tcp \
  --direction Inbound \
  --source-address-prefixes 192.168.1.0/24 \
  --destination-port-ranges 6379 \
  --access Allow \
  --priority 100

Google Cloud防火墙规则

bash
# 使用gcloud CLI
gcloud compute firewall-rules create allow-redis \
  --network my-network \
  --direction ingress \
  --priority 1000 \
  --source-ranges 192.168.1.0/24 \
  --allow tcp:6379,tcp:6380,tcp:26379 \
  --target-tags redis-server

适合防火墙的Redis配置

绑定到特定接口

txt
# 仅绑定到环回和私有接口
bind 127.0.0.1 192.168.1.100

# 仅绑定到环回(仅本地访问)
bind 127.0.0.1

修改默认端口

txt
# 修改默认Redis端口
port 16379

# 修改Redis SSL端口
tls-port 16380

# 修改Sentinel端口
port 126379

# 修改Cluster总线端口
cluster-announce-bus-port 116379

最佳实践

最小权限原则

  • 只允许必要的IP地址访问Redis
  • 限制访问仅对你的设置所需的特定端口
  • 除测试外,避免使用0.0.0.0/0(允许所有IP)
  • 定期审查和更新防火墙规则

网络分段

  • 将Redis放在单独的网络段中
  • 使用专用网络进行Redis通信
  • 将Redis与公共互联网访问隔离
  • 使用VPC/VNet对等连接进行跨区域Redis通信

多层安全

  • 将防火墙与Redis认证结合使用
  • 启用SSL/TLS进行加密通信
  • 使用Redis ACL进行细粒度访问控制
  • 实施网络级加密(VPN、IPsec)
  • 监控网络流量异常

文档和变更管理

  • 记录所有防火墙规则及其用途
  • 为防火墙规则修改实施变更管理
  • 在部署到生产前测试防火墙规则
  • 维护防火墙规则变更的审计日志

监控和告警

  • 监控防火墙日志中的未授权访问尝试
  • 为Redis端口的失败连接尝试设置告警
  • 使用入侵检测/防御系统(IDS/IPS)
  • 定期扫描暴露在互联网上的开放Redis端口

常见防火墙问题及解决方案

从授权IP无法连接到Redis

问题:授权客户端无法连接到Redis

解决方案

  • 验证防火墙规则是否正确配置
  • 检查Redis是否绑定到预期接口
  • 验证允许的IP地址范围是否正确
  • 检查中间防火墙(例如:网络基础设施防火墙)
  • 使用telnet redis-server 6379nc -zv redis-server 6379测试连接性

Redis端口暴露在互联网上

问题:Redis端口可从互联网访问

解决方案

  • 检查Redis服务器的公网IP地址
  • 使用nmap -p 6379 your-public-ip测试外部可访问性
  • 更新防火墙规则以禁止公共访问
  • 仅将Redis绑定到私有接口
  • 启用认证和SSL/TLS作为额外层

防火墙阻止集群通信

问题:Redis Cluster节点无法相互通信

解决方案

  • 允许所有Cluster节点之间的Cluster总线端口(默认16379)
  • 确保所有Cluster节点可以通过Redis端口和总线端口相互访问
  • 检查Cluster节点是否使用预期的IP地址
  • 验证防火墙规则允许所有Cluster节点IP之间的通信

防火墙性能影响

问题:防火墙导致Redis连接延迟

解决方案

  • 优化防火墙规则(简化、删除不必要的规则)
  • 使用有状态防火墙规则减少处理
  • 对于高流量环境考虑使用硬件防火墙
  • 将防火墙处理卸载到专用硬件
  • 监控防火墙CPU/内存使用

防火墙测试

测试防火墙规则

bash
# 从允许的IP测试连接
nc -zv redis-server 6379
# 预期:Connection to redis-server 6379 port [tcp/*] succeeded!

# 从被阻止的IP测试连接
nc -zv redis-server 6379
# 预期:Connection refused

# 使用telnet测试
telnet redis-server 6379
# 预期:Connected或Connection refused

# 使用redis-cli测试
redis-cli -h redis-server -p 6379 ping
# 预期:PONG或Could not connect to Redis at redis-server:6379: Connection refused

扫描开放端口

bash
# 扫描Redis端口
nmap -p 6379,6380,26379,16379 redis-server

# 扫描所有端口
nmap -p- redis-server

# 从外部网络扫描
nmap -p 6379 your-public-ip

防火墙日志分析

Linux iptables日志

bash
# 启用iptables对丢弃数据包的日志记录
iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables DROP: " --log-level 7

# 查看iptables日志
tail -f /var/log/kern.log | grep iptables

Windows防火墙日志

  1. 打开Windows Defender高级安全防火墙
  2. 点击属性
  3. 日志记录下,配置入站/出站连接的日志设置
  4. %windir%\System32\LogFiles\Firewall\pfirewall.log查看日志

常见问题(FAQ)

Q1: 我应该允许所有IP地址访问Redis吗?

A1: 不,在生产环境中,您永远不应该允许所有IP地址访问Redis。这会将Redis暴露给整个互联网,使其成为攻击者的主要目标。始终将访问权限限制在仅需要访问Redis的IP地址上。

Q2: 在云环境中保护Redis的最佳防火墙方式是什么?

A2: 在云环境中,使用云提供商的原生防火墙解决方案(例如:AWS安全组、Azure NSG、GCP防火墙规则)来限制对Redis实例的访问。此外,将Redis放在没有公共IP地址的私有子网中。

Q3: 如果Redis绑定到localhost,我还需要防火墙吗?

A3: 如果Redis仅绑定到localhost(bind 127.0.0.1),则只能从本地机器访问,因此严格来说不需要网络防火墙。但是,实施基于主机的防火墙作为额外的安全层仍然是良好的实践。

Q4: 我应该多久审查一次Redis的防火墙规则?

A4: 您应该至少每季度审查一次Redis的防火墙规则,或者在Redis部署、网络架构或应用程序需求发生变化时进行审查。定期审查有助于确保只允许必要的访问,并且不存在过时的规则。

Q5: 我可以使用反向代理代替Redis的防火墙吗?

A5: 虽然反向代理可以提供一些访问控制,但它不能替代防火墙。防火墙在网络级别运行,提供更强的保护,防止未授权访问。为了获得最佳安全性,如果需要,同时使用防火墙和反向代理。

Q6: Redis Cluster需要开放哪些端口?

A6: 对于Redis Cluster,您需要开放:

  • Redis服务器端口(默认6379)用于客户端连接
  • Cluster总线端口(默认16379)用于节点间通信
  • 确保所有Cluster节点可以通过这两个端口相互通信
  • 仅将这些端口的访问权限限制在必要的IP地址上

Q7: 如何为Redis Sentinel配置防火墙?

A7: 为Redis Sentinel配置防火墙:

  • 允许所有Sentinel节点和Redis实例访问Sentinel端口(默认26379)
  • 将Sentinel端口的访问权限限制在仅必要的IP地址上
  • 确保Sentinel节点可以与所有Redis实例通信
  • 对Redis服务器端口使用相同的安全原则