外观
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/iptablesLinux防火墙(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-allWindows防火墙
使用Windows Defender高级安全防火墙
- 打开Windows Defender高级安全防火墙
- 点击入站规则 > 新建规则
- 选择端口 > 下一步
- 选择TCP并输入Redis端口(例如:6379) > 下一步
- 选择允许连接 > 下一步
- 选择何时应用规则 > 下一步
- 输入名称(例如:"Redis Port 6379") > 完成
- 右键单击新规则 > 属性 > 作用域
- 在远程IP地址下,选择这些IP地址 > 添加
- 输入允许的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/24Azure网络安全组
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 100Google 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 6379或nc -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 iptablesWindows防火墙日志
- 打开Windows Defender高级安全防火墙
- 点击属性
- 在日志记录下,配置入站/出站连接的日志设置
- 在
%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服务器端口使用相同的安全原则
