LVS DR(Direct Routing)模式以「請求經 Director、回應直達 Client」著稱,效能最高、架構最簡。本文提供可直接落地的 lvs-dr.sh(Director 端)與 realserver.sh(RealServer 端)腳本,並詳細解析 ARP 抑制、VIP 掛載、調度算法等關鍵細節。
Request: Client → VIP (Director eth0:1) → MAC 改寫 → RealServer (DIP) Response: RealServer → Client (直接,不經 Director)
核心條件:Director 與所有 RealServer 必須在同一個 L2 廣播域(同 VLAN/同交換機)。
| 角色 | DIP (實際 IP) | VIP (虛擬 IP) | 介面 |
|---|---|---|---|
| Director | 192.168.142.133 | 192.168.142.211 | eth0 / eth0:1 |
| RealServer1 | 192.168.142.130 | 192.168.142.211 | eth0 / lo:0 |
| RealServer2 | 192.168.142.131 | 192.168.142.211 | eth0 / lo:0 |
#!/bin/bash
# lvs-dr.sh — LVS DR 模式 Director 啟停腳本
VIP=192.168.142.211
VPORT=80
RIP1=192.168.142.130
RIP2=192.168.142.131
RPORT=80
IFACE=eth0
usage() { echo "Usage: $0 {start|stop|status}"; exit 1; }
[ $# -eq 1 ] || usage
case $1 in
start)
echo "Starting LVS Director..."
echo 1 > /proc/sys/net/ipv4/ip_forward
# 1. 綁定 VIP 到 eth0:1(host 路由,避免 ARP 衝突)
/sbin/ifconfig ${IFACE}:1 ${VIP} broadcast ${VIP} netmask 255.255.255.255 up
/sbin/route add -host ${VIP} dev ${IFACE}:1
# 2. 清空 IPVS 規則
/sbin/ipvsadm -C
# 3. 新增虛擬服務(輪詢調度)
/sbin/ipvsadm -A -t ${VIP}:${VPORT} -s rr
# 4. 新增真實伺服器(-g 表 DR 模式,-w 權重)
/sbin/ipvsadm -a -t ${VIP}:${VPORT} -r ${RIP1}:${RPORT} -g -w 1
/sbin/ipvsadm -a -t ${VIP}:${VPORT} -r ${RIP2}:${RPORT} -g -w 1
/sbin/ipvsadm -L -n
;;
stop)
echo "Stopping LVS Director..."
/sbin/ipvsadm -C
/sbin/ifconfig ${IFACE}:1 down
;;
status)
/sbin/ipvsadm -L -n
;;
*) usage ;;
esac
#!/bin/bash
# realserver.sh — LVS DR 模式 RealServer 啟停腳本
VIP=192.168.142.211
BCAST=192.168.142.255
IFACE=eth0
usage() { echo "Usage: $0 {start|stop}"; exit 1; }
[ $# -eq 1 ] || usage
case $1 in
start)
echo "Configuring RealServer for LVS DR..."
# 關鍵:ARP 抑制,防止 RealServer 宣告 VIP
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 1 > /proc/sys/net/ipv4/conf/${IFACE}/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/${IFACE}/arp_announce
# VIP 掛載在 lo:0(host 路由,netmask 255.255.255.255)
/sbin/ifconfig lo:0 ${VIP} netmask 255.255.255.255 broadcast ${BCAST} up
/sbin/route add -host ${VIP} dev lo:0
;;
stop)
/sbin/ifconfig lo:0 down
echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 0 > /proc/sys/net/ipv4/conf/${IFACE}/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/${IFACE}/arp_announce
echo "RealServer stopped."
;;
*) usage ;;
esac
| 參數 | 值 | 作用 |
|---|---|---|
arp_ignore | 1 | 只回應目標 IP 配置在本介面的 ARP 請求(lo:0 符合,eth0 不回) |
arp_announce | 2 | 發送 ARP 回應時,強制使用最佳路由介面的源 IP(避免用 DIP 回應 VIP 的 ARP) |
netmask 255.255.255.255 | /32 | VIP 視為主機路由,不進入區域路由表,防止 RealServer 以 VIP 為源 IP 發封包 |
-g | DR 模式 | Director 僅改寫 MAC,不修改 IP 標頭,RealServer 直回 Client |
# Director 端
cat > /etc/systemd/system/lvs-dr.service <<'EOF'
[Unit]
Description=LVS DR Director
After=network.target
[Service]
Type=oneshot
ExecStart=/usr/local/lvs/lvs-dr.sh start
ExecStop=/usr/local/lvs/lvs-dr.sh stop
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload && systemctl enable --now lvs-dr
# RealServer 端(每台均執行)
cat > /etc/systemd/system/lvs-realserver.service <<'EOF'
[Unit]
Description=LVS DR RealServer
After=network.target
[Service]
Type=oneshot
ExecStart=/usr/local/lvs/realserver.sh start
ExecStop=/usr/local/lvs/realserver.sh stop
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload && systemctl enable --now lvs-realserver
# 1. 確認 VIP 只在 Director eth0:1、RealServer lo:0 出現
ip addr show | grep 192.168.142.211
# 2. Director 查看連線統計
watch -n1 'ipvsadm -L -n --stats --rate'
# 3. Client 端壓測
wrk -t4 -c200 -d30s https://192.168.142.211/
# 觀察 RealServer 1/2 讀取請求日誌交替出現
-s rr(輪詢)是否生效、RealServer 權重 -w 是否一致arp_ignore/arp_announce 只在 all 與 eth0 設定,不要 設 lo結語: LVS DR 模式腳本化後,新增 RealServer 僅需修改腳本變數並重啟服務,極適合水平擴展的無狀態 Web 叢集。搭配 Keepalived 實現 Director 雙機熱備,即可構建企業級四層負載均衡基礎設施。