Cấu hình LVS-DR với cân bằng tải đa cổng sử dụng firewall mark

LVS (Linux Virtual Server) là giải pháp cân bằng tải lớp 4 tích hợp sẵn trong nhân Linux, hỗ trợ hiệu năng cao và độ tin cậy cao cho hệ thống phân phối lưu lượng tới cụm máy chủ nền tảng. Mô hình DR (Direct Routing) là một trong những chế độ phổ biến nhất, cho phép lưu lượng vào đi qua bộ điều phối (director), trong khi lưu lượng phản hồi từ máy chủ thực (real server) có thể trả trực tiếp về client — giảm tải cho director và tối ưu hóa băng thông.

1. Thiết lập bộ điều phối (director)

Bộ điều phối đóng vai trò trung tâm, cần cấu hình cả địa chỉ IP thực (DIP) và địa chỉ ảo (VIP) trên giao diện loopback để đảm bảo khả năng nhận yêu cầu trên VIP mà không gây xung đột ARP.

# Gán DIP lên eth0
sudo ip addr add 192.168.0.50/24 dev eth0

# Gán VIP lên lo (không dùng subnet mask /24 để tránh quảng bá ARP)
sudo ip addr add 192.168.0.200/32 dev lo

# Kiểm tra kết quả
ip -br a | grep -E "(eth0|lo)"
# eth0           UP             192.168.0.50/24
# lo             UP             127.0.0.1/8 192.168.0.200/32

Để duy trì cấu hình sau khởi động, tạo file cấu hình NetworkManager cho lo:

[connection]
id=lo
type=loopback
interface-name=lo

[ipv4]
method=manual
addresses=127.0.0.1/8;192.168.0.200/32
ignore-auto-routes=true
ignore-auto-dns=true

Sau đó nạp lại cấu hình:

nmcli connection reload
nmcli connection up lo

2. Thiết lập bộ định tuyến (gateway)

Máy chủ đóng vai trò gateway giữa mạng client (172.25.254.0/24) và mạng nội bộ (192.168.0.0/24) phải bật chuyển tiếp IP và thiết lập NAT phù hợp:

# Kích hoạt IP forwarding vĩnh viễn
echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

# Cấu hình SNAT cho lưu lượng rời khỏi mạng nội bộ
sudo iptables -t nat -A POSTROUTING -s 172.25.254.0/24 -o eth1 -j SNAT --to-source 192.168.0.100
sudo iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j SNAT --to-source 172.25.254.100

3. Thiết lập máy chủ thực (real server)

Mỗi real server (RS1, RS2) cần:

  • Gán IP nội bộ (ví dụ: 192.168.0.10) lên eth0.
  • Gán VIP (192.168.0.200/32) lên lo — giống director.
  • Tắt phản hồi ARP cho VIP trên tất cả giao diện để tránh xung đột:
# Áp dụng tại thời điểm chạy
echo 1 | sudo tee /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 | sudo tee /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 | sudo tee /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 | sudo tee /proc/sys/net/ipv4/conf/lo/arp_announce

# Để bền vững, thêm vào /etc/sysctl.conf:
echo 'net.ipv4.conf.all.arp_ignore = 1' | sudo tee -a /etc/sysctl.conf
echo 'net.ipv4.conf.lo.arp_ignore = 1' | sudo tee -a /etc/sysctl.conf
echo 'net.ipv4.conf.all.arp_announce = 2' | sudo tee -a /etc/sysctl.conf
echo 'net.ipv4.conf.lo.arp_announce = 2' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

4. Giải quyết vấn đề phân phối không đồng nhất giữa HTTP/HTTPS

Khi cấu hình riêng lẻ hai dịch vụ 192.168.0.200:80192.168.0.200:443, thuật toán rr sẽ hoạt động độc lập trên mỗi cổng → dẫn đến khả năng cao cả hai yêu cầu từ cùng một client đều được gửi tới cùng một real server — làm mất tính cân bằng tổng thể.

Giải pháp: Sử dụng firewall mark để nhóm các cổng thành một dịch vụ logic duy nhất:

# Đánh dấu gói tin đến VIP trên cả cổng 80 và 443
sudo iptables -t mangle -A PREROUTING -d 192.168.0.200 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 6666

# Tạo dịch vụ LVS dựa trên mark thay vì IP:Port
sudo ipvsadm -A -f 6666 -s rr
sudo ipvsadm -a -f 6666 -r 192.168.0.10 -g
sudo ipvsadm -a -f 6666 -r 192.168.0.20 -g

Kiểm tra cấu hình cuối cùng:

ipvsadm -Ln
# TCP  192.168.0.200:80 rr → bị bỏ qua (không dùng)
# TCP  192.168.0.200:443 rr → bị bỏ qua (không dùng)
# FWM  6666              rr
#   -> 192.168.0.10:0     Route
#   -> 192.168.0.20:0     Route

Với cách tiếp cận này, mỗi cặp yêu cầu HTTP + HTTPS từ cùng một client sẽ được phân bổ luân phiên giữa các real server — đảm bảo tính công bằng và tận dụng tài nguyên đồng đều.

Thẻ: LVS linux-networking load-balancing ipvsadm iptables

Đăng vào ngày 19 tháng 6 lúc 17:02