面对大规模DDoS攻击,单台服务器的带宽和处理能力永远是瓶颈。在CentOS系统上,很多人误以为LVS(Linux Virtual Server)只是用来做常规负载均衡的,但实际上,通过合理的网络拓扑和内核参数调优,LVS完全可以化身为一堵高效的“洪水清洗墙”。核心思路不是用LVS去硬抗所有流量,而是利用其工作在四层的特性,以极低的CPU开销将攻击流量“分担”并引流到后端具备清洗能力的节点,或者直接通过特定策略丢弃非业务流量。这本质上是一种基于DR模式的无状态高速转发防御策略。
LVS抗DDoS的核心架构选择:DR模式的绝对优势在DDoS防御场景下,LVS的三种工作模式(NAT、TUN、DR)中,只有DR(Direct Routing,直接路由)模式能真正发挥硬件的极限性能。原因很简单:NAT模式需要LVS负责所有返回流量的改写,在大流量冲击下,LVS本身会成为新的瓶颈;TUN模式虽然解耦了返回路径,但隧道封装会带来额外的头部开销,降低有效载荷。DR模式则不同,LVS只处理入站请求,将数据包的MAC地址改写为后端真实服务器(Real Server)的地址,后端服务器处理完请求后直接将响应包发送给客户端,完全绕过了LVS。这种“非对称”的数据流向,让LVS的入站带宽决定了防御上限,而出站带宽完全不受影响。在遭遇数百Gbps的SYN Flood时,只要LVS的网卡能接收到数据包,它就能在几乎不消耗CPU的情况下完成调度分发。
环境准备与网络拓扑设计假设我们的CentOS 7/8系统作为LVS调度器,至少需要配置两块网卡,但为了极致的安全与性能,推荐使用双网卡绑定(Bonding)或直接使用支持DPDK的万兆网卡。网络拓扑上,LVS作为网关设备存在,外网IP绑定在LVS上,所有后端真实服务器与LVS处在同一个物理二层网络中。关键点在于,所有真实服务器的环回接口(lo)上必须绑定LVS的外网VIP地址,并且必须抑制ARP响应,否则会引发IP冲突导致网络瘫痪。具体操作是,在每台真实服务器上执行:
ifconfig lo:0 192.168.1.100 netmask 255.255.255.255 up echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
这里的192.168.1.100就是对外提供服务的VIP。这种配置让真实服务器认为自己拥有该IP,但不会对外广播,只有LVS通过修改MAC地址将请求转发过来时,它才会接收并处理。
CentOS上安装与配置ipvsadmLVS的核心管理工具是ipvsadm,在CentOS上通过yum即可安装:
yum install ipvsadm -y
安装完成后,需要开启系统的路由转发功能,这是LVS作为调度器的基础:
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf sysctl -p
接下来是配置LVS的调度规则。针对DDoS流量分担,我们不需要复杂的加权轮询,而是要结合防火墙标记(Firewall Mark)来绑定特定类型的流量。例如,将所有访问80端口的TCP流量统一打上标签10,然后让LVS基于这个标签进行调度:
# 在iptables中打标 iptables -t mangle -A PREROUTING -p tcp --dport 80 -j MARK --set-mark 10 # 配置ipvsadm,使用DR模式,调度算法采用最小连接数或源地址哈希 ipvsadm -A -f 10 -s sh ipvsadm -a -f 10 -r 192.168.1.101:0 -g ipvsadm -a -f 10 -r 192.168.1.102:0 -g ipvsadm -a -f 10 -r 192.168.1.103:0 -g
这里的“-g”参数指定了DR模式,“-s sh”表示使用源地址哈希算法。为什么在抗DDoS时源地址哈希比轮询更好?因为攻击流量往往具有源IP伪造或集中爆发的特征,源地址哈希能确保同一源IP的请求始终被分配到同一台后端服务器,这样便于在后端服务器上针对特定IP进行精准的限速或拉黑,而不会因为轮询导致攻击流量在所有服务器上“雨露均沾”,增加清洗难度。
内核参数调优:将LVS打造成高性能包处理器默认的CentOS内核参数是为了通用服务器设计的,对于需要处理每秒数百万个新建连接的LVS来说,必须进行深度调优。这是决定LVS能否在DDoS攻击下存活的关键。首先,要加大网卡接收队列和内核处理队列:
# 调整网卡多队列 ethtool -L eth0 combined 8 # 调整内核参数 echo "net.core.netdev_max_backlog = 50000" >> /etc/sysctl.conf echo "net.core.somaxconn = 65535" >> /etc/sysctl.conf echo "net.ipv4.tcp_max_syn_backlog = 65535" >> /etc/sysctl.conf echo "net.ipv4.tcp_syncookies = 1" >> /etc/sysctl.conf echo "net.ipv4.tcp_tw_reuse = 1" >> /etc/sysctl.conf echo "net.ipv4.tcp_fin_timeout = 10" >> /etc/sysctl.conf sysctl -p
特别要强调的是net.ipv4.tcp_syncookies参数,开启后LVS在遭遇SYN Flood时,不会立即为半连接分配资源,而是通过计算Cookie来验证客户端的真实性。但这里有一个容易被忽略的细节:在DR模式下,LVS本身并不完成三次握手,握手是后端真实服务器完成的,那么为什么LVS还需要开启SYN Cookie?因为如果攻击流量大到足以压垮LVS的连接跟踪表(conntrack),即使LVS不建立连接,连接跟踪模块也会耗尽内存。因此,更彻底的优化是直接关闭连接跟踪对特定流量的处理:
# 在raw表中对80端口流量关闭连接跟踪 iptables -t raw -A PREROUTING -p tcp --dport 80 -j NOTRACK
这条规则能让LVS在处理80端口流量时完全绕过conntrack,极大降低CPU消耗,将LVS彻底变成一台“无状态”的高速包转发器。
构建分层防御:LVS与后端清洗设备的联动LVS本身不具备深度包检测(DPI)能力,它的职责是快速分摊流量。真正的清洗动作需要由后端服务器或专门的清洗设备完成。一个成熟的DDoS分担方案是“LVS + Nginx/HAProxy + 应用防火墙”的三层架构。LVS将流量均匀或按源IP哈希分发给后端的Nginx集群,Nginx上配置严格的限流模块和黑白名单:
# Nginx限流配置示例
limit_req_zone $binary_remote_addr zone=anti_ddos:10m rate=10r/s;
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
server {
listen 80;
location / {
limit_req zone=anti_ddos burst=20 nodelay;
limit_conn conn_limit 10;
proxy_pass http://backend_app;
}
}
当后端某台Nginx检测到某个源IP的请求频率异常时,它可以通过简单的脚本调用LVS的API或直接在LVS上执行命令,动态地将该IP拉入黑洞路由。这种联动机制让LVS从“分担”升级为“阻断”。例如,在后端服务器上运行一个监控脚本,当某个IP的连接数超过阈值时,通过SSH密钥认证远程登录LVS执行:
ip route add blackhole 攻击者IP
或者更优雅的方式,使用ipset配合iptables在LVS的PREROUTING链上进行高效丢弃,因为ipset基于哈希表查找,比线性遍历iptables规则快得多:
ipset create blacklist hash:ip maxelem 1000000 iptables -t raw -A PREROUTING -m set --match-set blacklist src -j DROP # 后端检测到攻击后,远程添加 ipset add blacklist 攻击者IP
这种架构下,LVS负责高速转发和初步的IP封堵,后端服务器负责精细化分析和触发策略,两者分工明确,即便在百G流量冲击下也能保持核心业务的可用性。
监控与持久化:确保重启后策略不丢失DDoS防御是一个动态对抗的过程,LVS上的配置和内核参数修改必须考虑持久化。很多运维人员在紧急配置后忘记保存,导致服务器重启后防御策略丢失,造成二次事故。对于ipvsadm的规则,使用以下命令保存:
ipvsadm-save > /etc/sysconfig/ipvsadm systemctl enable ipvsadm
对于iptables规则和ipset集合,需要编写脚本放入/etc/rc.d/rc.local或者配置systemd服务在开机时自动加载。同时,建议部署Prometheus配合Node Exporter和自定义脚本,实时监控LVS的网卡流量、丢包率以及ipvsadm的连接统计信息。当发现某个后端服务器的ActiveConn数量异常飙升时,监控系统应立即发出告警,这往往意味着该服务器正在遭受针对性攻击,或者调度策略出现了倾斜。
通过上述在CentOS系统上的实战配置,LVS不再是简单的负载均衡器,而是演变为整个网络入口的“智能分流器”和“高速过滤器”。它的核心价值在于用极低的硬件成本,将大流量的DDoS攻击切割成小碎片,为后端专业的应用层防御争取了宝贵的时间和空间,这种架构思想远比单纯堆叠防火墙带宽要灵活且经济得多。
