DR 模式 (Direct Routing):LVS 的一种转发模式。Director 只修改数据包的目标 MAC 地址,将其直接转发给后端 RS,RS 处理完后直接将响应返回给客户端,性能极高。
FireWall Mark (FWM):一种通过 iptables 给数据包打上的整数标签,用于在 LVS 中对流量进行更精细的分组和调度。
一. 概述
1.1 原理
在 DR 模式下,默认对不同端口(如 80 和 443)的请求是分开调度的,这会导致同一客户端访问同一 VIP 的不同端口时,可能被调度到不同的后端 RS 上。
· 打标记 :在 Director 上,使用 iptables -t mangle 规则,将访问同一 VIP 的不同端口(如 80 和 443)的数据包打上相同的防火墙标记(如 6666)。
· 基于标记调度 :使用 ipvsadm -A -f 6666 创建一个基于该标记的虚拟服务。这样,所有带有此标记的数据包(无论端口是 80 还是 443)都会被视为一个整体,按照同一套调度规则(如 rr 轮询)进行处理,从而保证同一客户端的 HTTP 和 HTTPS 请求被调度到同一台 RS。
1.2 目的
解决 DR 模式下,同一 VIP 不同端口请求被独立调度导致的会话割裂问题,确保同一客户端的相关请求被路由到同一后端服务器。
1.3 适用场景
同一应用同时提供 HTTP(80)和 HTTPS(443)服务,需要保证用户会话一致性。
多个不同端口的服务逻辑上属于一个整体,需要统一调度。
二. 环境设定
2.1 环境流程图

2.2 实验环境
2.3 环境配置
完整环境设定方法已整理并发布到CSDN以下链接中,若需要可跳转查看
https://blog.csdn.net/2401_84184229/article/details/157652660
三. 实现方法
3.1 在rs主机中同时开始http和https两种协议
在RS1中
[root@RS1 ~]# dnf install mod_ssl -y
[root@RS1 ~]# systemctl restart httpd

在RS2中
[root@RS2 ~]# dnf install mod_ssl -y
[root@RS2 ~]# systemctl restart httpd

3.2 在vsnode中添加https的轮询策略
[root@vsnode ~]# cd ../boot
[root@vsnode boot]# ipvsadm -A -t 192.168.221.200:80 -s rr
#添加一个基于 TCP 协议、VIP 为 192.168.221.200:80、调度算法为轮询(rr)的虚拟服务。
[root@vsnode boot]# ipvsadm -a -t 192.168.221.200:80 -r 192.168.221.20 -g
#将真实服务器 192.168.221.20 以 DR 模式(-g)添加到上述 80 端口的虚拟服务中
[root@vsnode boot]# ipvsadm -a -t 192.168.221.200:80 -r 192.168.221.10 -g
[root@vsnode boot]# ipvsadm -A -t 192.168.221.200:443 -s rr
[root@vsnode boot]# ipvsadm -a -t 192.168.221.200:443 -r 192.168.221.20:443 -g
[root@vsnode boot]# ipvsadm -a -t 192.168.221.200:443 -r 192.168.221.10:443 -g
[root@vsnode boot]# ipvsadm -Ln
#以数字格式(不解析域名)列出所有 IPVS 虚拟服务和真实服务器的详细配置
[root@vsnode boot]# systemctl restart ipvsadm.service
#重启 ipvsadm 服务,使配置生效或重新加载


3.3 轮询错误展示
正确轮询应为"curl192.168.221.200"和"curl -k https://192.168.221.200"分别访问到两个不同主机,若访问结果中的主机为同一主机则轮询错误。
在client中
[root@client ~]# curl 192.168.221.200;curl -k https://192.168.221.200

3.4 解决方案
使用火墙标记访问vip的80和443的所有数据包,设定标记为6666,然后对此标记进行负载
[root@vsnode boot]# iptables -t mangle -A PREROUTING -d 192.168.221.200 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 6666
#在 iptables 的 mangle 表中,给目标地址为 192.168.221.200、端口为 80/443 的 TCP 流量打上标记值 6666
[root@vsnode boot]# ipvsadm -A -f 6666 -s rr
#创建一个基于标记(mark)6666 的 LVS 虚拟服务,指定调度算法为轮询(rr)
[root@vsnode boot]# ipvsadm -a -f 6666 -r 192.168.221.10 -g
#将真实服务器 192.168.221.10 以 DR 模式(-g)添加到标记为 6666 的 LVS 虚拟服务中
[root@vsnode boot]# ipvsadm -a -f 6666 -r 192.168.221.20 -g

测试:
在client中
[root@client ~]# curl 192.168.221.200;curl -k https://192.168.221.200

四. 结论
防火墙标记技术通过在 Director 上对特定流量(如同一 VIP 的 80 和 443 端口)打上统一的标记(如 6666),并基于此标记创建 LVS 虚拟服务,成功解决了 DR 模式下多端口独立调度导致的轮询错乱问题。它将多个端口的流量抽象为一个逻辑单元,确保了同一客户端的相关请求被一致调度。这不仅是对 LVS 调度粒度的精细化控制,也是在高性能的 DR 模式下,实现应用级会话一致性的有效手段。
