Skip to content

Memcached DDoS 防护

DDoS 攻击的威胁

分布式拒绝服务(DDoS)攻击是 Memcached 面临的主要安全威胁之一。由于 Memcached 默认配置下缺乏认证机制且监听在公网时,攻击者可以利用 Memcached 服务器发动反射放大攻击,对目标系统造成严重的网络拥塞和服务中断。

Memcached 相关 DDoS 攻击类型

反射放大攻击(Reflection Amplification)

反射放大攻击是最常见的 Memcached DDoS 攻击类型。攻击者利用伪造的源 IP 地址向 Memcached 服务器发送请求,服务器将大量响应数据发送到伪造的目标 IP 地址,从而实现攻击放大效果。

  • 攻击原理:利用 Memcached 无认证机制的特点,向服务器发送特定命令(如 stats、get 大对象)
  • 放大倍数:可达 10,000 倍以上,即发送 1 字节的请求可以产生 10,000 字节的响应
  • 攻击特点:攻击流量大、难以溯源、防护难度高

直接连接攻击(Direct Connection Flood)

攻击者通过大量并发连接耗尽 Memcached 服务器的连接资源,导致合法客户端无法连接。

  • 攻击原理:利用 Memcached 连接数限制,发送大量连接请求
  • 攻击特点:消耗服务器连接资源、影响合法客户端连接

命令风暴攻击(Command Storm)

攻击者向 Memcached 服务器发送大量恶意命令,消耗服务器 CPU 和内存资源。

  • 攻击原理:发送大量 set、get 等命令,消耗服务器资源
  • 攻击特点:消耗 CPU 和内存资源、影响服务器性能

大对象攻击(Large Object Attack)

攻击者向 Memcached 服务器存储大量大对象,耗尽服务器内存资源。

  • 攻击原理:存储超大键值对,消耗服务器内存
  • 攻击特点:消耗内存资源、导致缓存淘汰率增加

基础防护措施

网络隔离

网络隔离是防止 Memcached DDoS 攻击的第一道防线。

  • 禁止公网访问:将 Memcached 服务器部署在私有网络中,禁止公网直接访问
  • 限制访问 IP:通过防火墙规则,只允许特定 IP 地址访问 Memcached 服务
  • 绑定内部 IP:使用 -l 参数将 Memcached 绑定到内部 IP 地址
bash
# 仅绑定到本地回环地址
memcached -l 127.0.0.1:11211

# 绑定到内部网络 IP
memcached -l 192.168.1.100:11211

禁用 UDP 协议

Memcached 默认同时监听 TCP 和 UDP 端口,但 UDP 协议更容易被用于反射放大攻击。

  • 禁用 UDP 协议:使用 -U 0 参数禁用 UDP 监听
bash
# 禁用 UDP 协议,仅使用 TCP
memcached -U 0 -l 192.168.1.100:11211

配置连接限制

限制 Memcached 服务器的最大连接数,防止连接耗尽攻击。

  • 设置最大连接数:使用 -c 参数设置合理的最大连接数
  • 根据服务器资源调整:一般设置为 1024-4096 之间
bash
# 设置最大连接数为 2048
memcached -c 2048 -l 192.168.1.100:11211

启用认证机制

虽然 Memcached 本身不提供内置认证,但可以通过第三方工具或代理实现认证。

  • 使用 SASL 认证:编译 Memcached 时启用 SASL 支持,配置用户名和密码
  • 使用代理认证:通过 Nginx、HAProxy 等代理服务器实现认证
  • 使用客户端证书:结合 TLS 使用客户端证书认证

高级防护配置

SASL 认证配置

SASL(Simple Authentication and Security Layer)是 Memcached 支持的认证机制。

1. 编译 Memcached 时启用 SASL

bash
# 安装依赖
sudo apt-get install libsasl2-dev libsasl2-2 sasl2-bin

# 编译 Memcached 并启用 SASL
./configure --enable-sasl
make
make install

2. 配置 SASL 用户

bash
# 创建 SASL 配置目录
mkdir -p /usr/local/etc/sasl2

# 创建 Memcached SASL 配置文件
cat > /usr/local/etc/sasl2/memcached.conf << EOF
mech_list: plain
log_level: 5
sasldb_path: /usr/local/etc/sasl2/memcached-sasldb2
EOF

# 创建 SASL 用户
saslpasswd2 -a memcached -c username
# 输入密码

# 授权 SASL 数据库访问权限
chown memcached:memcached /usr/local/etc/sasl2/memcached-sasldb2
chmod 600 /usr/local/etc/sasl2/memcached-sasldb2

3. 启动 Memcached 并启用 SASL

bash
memcached -S -l 192.168.1.100:11211

防火墙高级配置

使用 iptables 限制连接速率

bash
# 限制单个 IP 每秒最多 10 个连接
iptables -A INPUT -p tcp --dport 11211 -m state --state NEW -m limit --limit 10/s --limit-burst 20 -j ACCEPT
iptables -A INPUT -p tcp --dport 11211 -m state --state NEW -j DROP

# 限制单个 IP 最大连接数为 100
iptables -A INPUT -p tcp --dport 11211 -m connlimit --connlimit-above 100 -j DROP

使用 nftables 配置防护

txt
# 创建表
nft add table inet filter

# 创建链
nft add chain inet filter input {
    type filter hook input priority 0;
    policy accept;
}

# 限制 Memcached 连接速率
nft add rule inet filter input tcp dport 11211 ct state new limit rate 10/second burst 20 packets accept
nft add rule inet filter input tcp dport 11211 ct state new drop

# 限制单个 IP 最大连接数
nft add rule inet filter input tcp dport 11211 ct state established,related accept
nft add rule inet filter input tcp dport 11211 ct state new ct count over 100 drop

代理防护配置

使用反向代理服务器(如 Nginx、HAProxy)作为 Memcached 的前置防护。

Nginx 代理配置

nginx
stream {
    upstream memcached_backend {
        server 127.0.0.1:11211;
    }

    server {
        listen 11211;
        proxy_pass memcached_backend;
        proxy_timeout 30s;
        proxy_connect_timeout 5s;
        
        # 限制连接数
        limit_conn_zone $binary_remote_addr zone=memcached:10m;
        limit_conn memcached 100;
        
        # 限制连接速率
        limit_req_zone $binary_remote_addr zone=memcached_req:10m rate=10r/s;
        limit_req zone=memcached_req burst=20;
    }
}

HAProxy 代理配置

txt
global
    maxconn 10000

defaults
    mode tcp
    timeout connect 5s
    timeout client 30s
    timeout server 30s

listen memcached
    bind *:11211
    mode tcp
    balance roundrobin
    server memcached1 127.0.0.1:11212 check
    
    # 限制连接数
    maxconn 1000
    
    # 限制单个 IP 连接数
    stick-table type ip size 100k expire 30s store conn_cur
    tcp-request connection track-sc1 src
    tcp-request connection reject if { src_conn_cur ge 100 }

云环境防护

AWS 环境防护

  • 使用 VPC 私有子网:将 Memcached 部署在私有子网中
  • 配置安全组:只允许特定安全组访问 Memcached 端口
  • 使用 AWS Shield:启用 AWS Shield 保护,防御 DDoS 攻击
  • 使用 CloudFront:对于需要公网访问的场景,使用 CloudFront 作为 CDN 防护

阿里云环境防护

  • 使用专有网络(VPC):将 Memcached 部署在 VPC 中
  • 配置安全组:严格限制安全组规则
  • 使用云盾 DDoS 防护:启用阿里云云盾 DDoS 防护服务
  • 使用 SLB:配置 SLB 作为负载均衡,提供基础防护

腾讯云环境防护

  • 使用私有网络(VPC):将 Memcached 部署在 VPC 中
  • 配置安全组:严格限制安全组规则
  • 使用大禹 DDoS 防护:启用腾讯云大禹 DDoS 防护服务
  • 使用 CLB:配置 CLB 作为负载均衡,提供基础防护

监控与响应

攻击监控

建立完善的监控体系,及时发现 DDoS 攻击。

  • 网络流量监控:监控进出 Memcached 服务器的网络流量
  • 连接数监控:监控 Memcached 连接数变化
  • 命令速率监控:监控 Memcached 命令执行速率
  • 响应大小监控:监控 Memcached 响应大小变化

攻击响应流程

1. 检测阶段

  • 监控系统告警:网络流量突增、连接数突增
  • 人工确认:检查服务器状态、日志
  • 攻击类型识别:判断攻击类型(反射放大、连接洪水等)

2. 缓解阶段

  • 临时调整防火墙规则:限制攻击源 IP
  • 启用防护设备:激活 DDoS 防护服务
  • 调整 Memcached 配置:增加连接数限制、调整内存分配
  • 切换流量路由:将流量切换到备用线路

3. 恢复阶段

  • 分析攻击原因:找出攻击入口和漏洞
  • 加固防护措施:更新配置、修复漏洞
  • 恢复正常服务:逐步解除防护措施
  • 记录攻击事件:编写攻击事件报告

自动化响应脚本

python
#!/usr/bin/env python3
import subprocess
import time
import logging

# 配置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

# Memcached 配置
MEMCACHED_PORT = 11211
MAX_CONNECTIONS = 1000
THRESHOLD_CONNECTIONS = 800
THRESHOLD_TRAFFIC = 100  # Mbps

# 检查 Memcached 连接数
def check_connections():
    try:
        result = subprocess.check_output(['echo', 'stats', '|', 'nc', 'localhost', str(MEMCACHED_PORT)], shell=True)
        for line in result.decode().split('\n'):
            if 'curr_connections' in line:
                connections = int(line.split()[1])
                logging.info(f"当前连接数: {connections}")
                return connections
    except Exception as e:
        logging.error(f"检查连接数失败: {e}")
    return 0

# 检查网络流量
def check_traffic():
    try:
        # 使用 ifconfig 或 ethtool 检查流量
        # 这里使用简化的方法,实际环境中应使用更准确的工具
        result = subprocess.check_output(['ifconfig', 'eth0'], shell=True)
        # 解析流量数据,实际实现需要更复杂的逻辑
        traffic = 50  # Mbps
        logging.info(f"当前流量: {traffic} Mbps")
        return traffic
    except Exception as e:
        logging.error(f"检查流量失败: {e}")
    return 0

# 实施防护措施
def implement_protection():
    logging.warning("检测到异常,实施防护措施")
    
    # 1. 增加 Memcached 连接数限制
    subprocess.run(['systemctl', 'stop', 'memcached'], shell=True)
    subprocess.run(['sed', '-i', f's/-c [0-9]*/-c {int(MAX_CONNECTIONS * 1.5)}/g', '/etc/memcached.conf'], shell=True)
    subprocess.run(['systemctl', 'start', 'memcached'], shell=True)
    logging.info("已调整 Memcached 连接数限制")
    
    # 2. 临时限制连接速率
    subprocess.run(['iptables', '-A', 'INPUT', '-p', 'tcp', '--dport', str(MEMCACHED_PORT), '-m', 'state', '--state', 'NEW', '-m', 'limit', '--limit', '5/s', '--limit-burst', '10', '-j', 'ACCEPT'], shell=True)
    subprocess.run(['iptables', '-A', 'INPUT', '-p', 'tcp', '--dport', str(MEMCACHED_PORT), '-m', 'state', '--state', 'NEW', '-j', 'DROP'], shell=True)
    logging.info("已限制连接速率")

# 主函数
def main():
    while True:
        connections = check_connections()
        traffic = check_traffic()
        
        if connections > THRESHOLD_CONNECTIONS or traffic > THRESHOLD_TRAFFIC:
            implement_protection()
        
        time.sleep(60)  # 每分钟检查一次

if __name__ == "__main__":
    main()

最佳实践

配置最佳实践

  • 始终禁用 UDP 协议:除非确实需要,否则禁用 UDP 协议
  • 绑定内部 IP:将 Memcached 绑定到内部 IP 地址,禁止公网访问
  • 启用 SASL 认证:为 Memcached 配置 SASL 认证
  • 限制连接数:根据服务器资源配置合理的连接数限制
  • 配置防火墙规则:严格限制访问 IP 和连接速率

部署最佳实践

  • 使用私有网络:将 Memcached 部署在私有网络或 VPC 中
  • 使用代理服务器:配置反向代理,提供额外防护
  • 启用 DDoS 防护服务:在云环境中启用 DDoS 防护服务
  • 定期备份数据:确保数据安全,以便在攻击后快速恢复

监控最佳实践

  • 建立基线:收集正常运行时的指标,建立性能基线
  • 设置告警:为关键指标设置合理的告警阈值
  • 实时监控:使用实时监控工具,及时发现异常
  • 日志分析:定期分析日志,发现潜在安全威胁

应急响应最佳实践

  • 制定应急预案:编写详细的 DDoS 应急响应预案
  • 定期演练:定期进行 DDoS 应急演练
  • 建立沟通机制:确保团队成员之间的有效沟通
  • 与 ISP 合作:在攻击发生时,及时联系 ISP 协助防护

常见问题(FAQ)

Q1: Memcached 为什么容易受到 DDoS 攻击?

A1: Memcached 容易受到 DDoS 攻击的主要原因包括:

  • 默认配置下缺乏认证机制
  • 默认同时监听 TCP 和 UDP 端口
  • 响应数据量远大于请求数据量,容易被用于反射放大攻击
  • 通常部署在高带宽服务器上,攻击潜力大

Q2: 如何判断 Memcached 是否正在遭受 DDoS 攻击?

A2: 可以通过以下迹象判断 Memcached 是否正在遭受 DDoS 攻击:

  • 网络流量突增,特别是出站流量
  • 连接数突然增加
  • 服务器 CPU 和内存使用率异常升高
  • 合法客户端无法连接或响应缓慢
  • 日志中出现大量异常连接或命令

Q3: 如何防止 Memcached 被用于反射放大攻击?

A3: 防止 Memcached 被用于反射放大攻击的主要措施包括:

  • 禁止公网访问,将 Memcached 部署在私有网络中
  • 禁用 UDP 协议(使用 -U 0 参数)
  • 绑定到内部 IP 地址(使用 -l 参数)
  • 配置防火墙,只允许特定 IP 访问
  • 启用 SASL 认证

Q4: 禁用 UDP 协议会影响 Memcached 性能吗?

A4: 对于大多数应用场景,禁用 UDP 协议不会显著影响 Memcached 性能。因为:

  • 大多数客户端库默认使用 TCP 协议
  • TCP 协议提供可靠传输,适合大多数应用场景
  • UDP 协议主要用于简单查询,性能提升有限

Q5: 如何配置 Memcached 连接数限制?

A5: 可以使用 -c 参数配置 Memcached 最大连接数:

bash
# 设置最大连接数为 2048
memcached -c 2048 -l 127.0.0.1:11211

在配置文件中,可以添加以下行:

-c 2048

Q6: 启用 SASL 认证会影响 Memcached 性能吗?

A6: 启用 SASL 认证会带来轻微的性能开销,但对于大多数应用场景可以忽略。SASL 认证主要在连接建立阶段进行,不会影响后续命令的执行性能。

Q7: 云环境中的 Memcached 如何防护 DDoS 攻击?

A7: 云环境中的 Memcached DDoS 防护措施包括:

  • 将 Memcached 部署在私有子网中
  • 配置安全组,只允许特定安全组访问
  • 启用云服务商提供的 DDoS 防护服务(如 AWS Shield、阿里云云盾、腾讯云大禹)
  • 使用负载均衡服务(如 ELB、SLB、CLB)提供基础防护
  • 配置 CDN(如 CloudFront、阿里云 CDN)防护公网访问

Q8: 如何恢复被 DDoS 攻击后的 Memcached 服务?

A8: 恢复被 DDoS 攻击后的 Memcached 服务可以按照以下步骤进行:

  1. 确认攻击已停止
  2. 恢复正常的 Memcached 配置
  3. 逐步解除临时防护措施
  4. 检查数据完整性
  5. 分析攻击原因,加强防护措施
  6. 恢复正常业务流量

Q9: 可以使用哪些工具监控 Memcached DDoS 攻击?

A9: 可以使用以下工具监控 Memcached DDoS 攻击:

  • Prometheus + Grafana:监控网络流量、连接数、命令速率等指标
  • Zabbix:配置 Zabbix 监控模板,设置告警规则
  • Nagios:使用 Nagios 插件监控 Memcached 状态
  • tcpdump:捕获和分析网络数据包
  • iftop:实时监控网络流量

Q10: 如何预防 Memcached 大对象攻击?

A10: 预防 Memcached 大对象攻击的措施包括:

  • 配置最大对象大小限制(使用 -I 参数,默认 1MB)
  • 启用 SASL 认证,防止未授权写入
  • 监控对象大小分布,及时发现异常
  • 配置合理的内存分配策略,避免单个对象占用过多内存
  • 定期清理过期数据和大对象