LVS(linux virual server)LVS四種工作模式深度解析
LVS-NAT模式
四臺虛擬機
火墻關閉
關閉火墻 systemctl stop firewalldsystemctl disable firewalld關閉開機自啟火墻
1.client | ![]() |
---|---|
2.lvs | ![]() ![]() |
rs1 | ![]() |
re2 | ![]() |
網絡配好在rs1和rs2安裝httpd功能所用命令dnf/yum install httpd -y
事例
然后在rs1操作:
[root@RS1 ~]# systemctl disable --now firewalld #禁用并停止 firewalld 服務[root@RS1 ~]# echo RS1 - 192.168.0.10 > /var/www/html/index.html #創建并寫入內容到 index.html 文件:[root@RS1 ~]# systemctl enable --now http d #啟用并啟動 Apache HTTP 服務
#rs2相同操作
事例
查看RS1和RS2網關
[root@RS1 ~]# cd /etc/NetworkManager/system-connections/ #切換目錄
[root@RS1 system-connections]# ls
eth0.nmconnection
#查看網卡
[root@RS1 system-connections]# vim eth0.nmconnection #修改網卡
[root@RS1 system-connections]# nmcli connection reload #重啟端口
[root@RS1 system-connections]# nmcli connection up eth0 #激活網口
lvs虛擬機操作
[root@lvs ~]# sysctl -a | grep ip_forward
net.ipv4.ip_forward = 0 #net.ipv4.ip_forward = 0:這意味著當前 IPv4 數據包轉發功能被禁用了(值為0表示禁用,1表示啟用)
net.ipv4.ip_forward_update_priority = 1
net.ipv4.ip_forward_use_pmtu = 0
[root@lvs ~]# echo net.ipv4.ip_forward=1 > /etc/sysctl.conf #這條命令將 net.ipv4.ip_forward=1 寫入到了 /etc/sysctl.conf 配置文件中,使得系統在啟動時啟用 IPv4 轉發。
[root@lvs ~]# sysctl -p #使用 sysctl -p 使配置立即生效。
net.ipv4.ip_forward = 1
用這個命令查一下需要安裝的lvs安裝包:dnf search lvs
用命令安裝[root@lvs ~]# dnf/yum install ipvsadm -y
用命令watch -n1 ipvsadm -Ln 查看策略調度機制
輸入命令[root@lvs ~]# ipvsadm -A -t
172.25.254.200:80 -s rr #這條命令使用 ipvsadm
工具配置一個虛擬服務 172.25.254.200:80
,并使用 輪詢(Round Robin) 調度算法(-S rr
)來分發流量到后端服務器
[root@lvs ~]# ipvsadm -E -t 172.25.254.200:80 -s wrr #-E表示更改為wrr機制
TCP 172.25.254.200:80 wrr
[root@lvs ~]# ipvsadm -E -t 172.25.254.200:80 -s wrr -p 360 #-p設置持久連接超時規定時間內同一來源請求調度到同一realserver-----這里時間設為360
TCP 172.25.254.200:80 wrr persistent 360
[root@lvs ~]# ipvsadm -A -f 66 -s rr #設置火墻TCP 172.25.254.200:80 wrr persistent 360
FWM 66 rr
刪除機制 #模式不能混用
[root@lvs ~]# ipvsadm -D -f 66 #刪除火墻-D[root@lvs ~]# ipvsadm -C #全部刪除[root@lvs ~]# ipvsadm -A -t 172.25.254.200:80 -s rr
[root@lvs ~]# ipvsadm -a -t 172.25.254.200:80 -r 192.168.0.10:80 -g
[root@lvs ~]# ipvsadm -a -t 172.25.254.200:80 -r 192.168.0.20:80 -g
#-g為直連路由
[root@lvs ~]# ipvsadm -a -t 172.25.254.200:80 -r 192.168.0.20:80 -m
[root@lvs ~]# ipvsadm -a -t 172.25.254.200:80 -r 192.168.0.10:80 -m
#-m為nat模式
[root@lvs ~]# ipvsadm -e -t 172.25.254.200:80 -r 192.168.0.20:80 -i
[root@lvs ~]# ipvsadm -e -t 172.25.254.200:80 -r 192.168.0.10:80 -i
#-e為切換模式 -i為ipip隧道模式
設置權重
[root@lvs ~]# ipvsadm -e -t 172.25.254.200:80 -r 192.168.0.10:80 -i -w 2
#-w 后面跟數字代表權重這里設置2--權重不是所有模式一定生效
計數器[root@lvs ~]# watch -n1 ipvsadm -Ln --rate #后面加–tate -Z清楚計數器
保存策略
[root@lvs ~]# ipvsadm-save -n > /mnt/ipvsadm.rule如果用ipvsadm -C刪除后用命令
ipvsadm-restore < /mnt/ipvsadm.rule
恢復策略
永久保存 #開機時加載策略
ipvsadm-save -n > /etc/sysconfig/ipvsadm
LVS技術-DR模式
實驗環境拓撲
client | eth0=ip 172.25.254.111 |
---|---|
路由器 | eth0=ip 172.25.254.100 eth1=ip192.168.0.100 |
DR-LVS | eth0=ip 192.168.0.200 |
RS1 | eth0=ip192.168.0.10 |
RS2 | eth0=ip 192.168.0.20 |
客戶端 clent網絡設置
[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
method=manual
address1=172.25.254.111/24,172.25.254.100
dns=8.8.8.8
路由器網絡設置
2. 路由器網絡設置
(1) eth0 配置
[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
method=manual
address1=172.25.254.100/24
(2) eth1 配置
[connection]
id=eth1
type=ethernet
interface-name=eth1[ipv4]
method=manual
address1=192.168.0.100/24
(3) 激活網口
nmcli connection reload
nmcli connection up eth0
nmcli connection up eth1
(4) 開啟路由轉發功能
打開路由內核功能
[root@luyou ~] vim /etc/sysctl.conf #編輯文件開啟內核路由功能net.ipv4.ip_forward=1開啟內核路由功能[root@luyou ~] sysctl -p #激活
開啟防火墻并開啟偽裝(MASQUERADE)
[root@luyou system-connections] systemctl enable --now firewalld.service
打開路由地址偽裝
[root@luyou system-connections] firewall-cmd --permanent --add-masquerade
Warning: ALREADY_ENABLED: masquerade
success
LVS主機設置
網口設置
網口eth0.nmconnection
[root@dr-lvs system-connections] cat eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
method=manual
address1=192.168.0.200/24,192.168.0.100
address2=192.168.0.220/24
dns=8.8.8.8[root@dr-lvs system-connections]# nmcli connection reload #重啟
[root@dr-lvs system-connections]# nmcli connection up eth0 #激活
網口設置回環接口lo.nmconnection
[root@dr-lvs system-connections] cat lo.nmconnection
[connection]
id=lo
type=loopback
interface-name=lo[ipv4]
pmethod=manual#靜態
address1=127.0.0.1/8
address2=192.168.0.220/32不對外相應32
[root@dr-lvs system-connections]# nmcli connection reload #重啟
[root@dr-lvs system-connections]# nmcli connection up lo #激活
RS1/RS2 設置(后端真實服務器)
RS1設置
[root@RS1 system-connections]# cat eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
method=manual
address1=192.168.0.10/24,192.168.0.100
dns=8.8.8.8
[root@RS1 system-connections]# cat lo.nmconnection
[connection]
id=lo
type=loopback
interface-name=lo[ipv4]
method=manual
address1=127.0.0.1/8
address2=192.168.0.220/32
設置VIP相應管控
[root@RS1 ~] sysctl -a | grep arp #搜索arp相關設置[root@RS1 ~] echo net.ipv4.conf.lo.arp_ignore =1 >> /etc/sysctl.conf[root@RS1 ~] echo net.ipv4.conf.lo.arp_announce = 2 >> /etc/sysctl.conf[root@RS1 ~] echo net.ipv4.conf.all.arp_ignore = 1 >> /etc/sysctl.conf[root@RS1 ~] echo net.ipv4.conf.all.arp_announce = 2 >> /etc/sysctl.conf[root@RS1 ~] sysctl -p #生效
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
vnet.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
RS2設置
[root@RS2 system-connections]# cat eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
method=manual
address1=192.168.0.20/24,192.168.0.100
dns=8.8.8.8
[root@RS2 system-connections]# cat lo.nmconnection
[connection]
id=lo
type=loopback
interface-name=lo[ipv4]
method=manual
address1=127.0.0.1/8
address2=192.168.0.220/32
設置VIP相應管控
[root@RS2 ~] sysctl -a | grep arp #搜索arp相關設置[root@RS2 ~] echo net.ipv4.conf.lo.arp_ignore =1 >> /etc/sysctl.conf[root@RS2 ~] echo net.ipv4.conf.lo.arp_announce = 2 >> /etc/sysctl.conf[root@RS2 ~] echo net.ipv4.conf.all.arp_ignore = 1 >> /etc/sysctl.conf[root@RS2 ~] echo net.ipv4.conf.all.arp_announce = 2 >> /etc/sysctl.conf[root@RS2 ~] sysctl -p #生效
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
vnet.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
最后通過客戶端client用戶訪問
防火墻標記解決輪詢調度問題
先在RS1和RS2上安裝httpd
[root@RS1 ~]# yum install mod_ssl -y[root@RS2 ~]# dnf install mod_ssl -y[root@RS1 ~]# systemctl restart httpd[root@RS2 ~]# systemctl restart httpdv在LVS主機上操作[root@dr-lvs ~]# ipvsadm -C #清除機制
[root@dr-lvs ~]# iptables -t mangle -A PREROUTING -d 192.168.0.220 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 666
LVS技術-TUN模式
一、實驗案例環境
本案例采用LVS負載均衡技術中的TUN(IP隧道)模式,適用于后端Real Server與調度器不在同一二層網絡的場景。
網絡拓撲簡述
Client|| +-------------------+| | lvs-tun主機 || | eth0: 192.168.0.100| +-------------------+| / \| / \| +-------------------+ +-------------------+| | rs1主機 | | rs2主機 || | eth0:192.168.0.10| | eth0:192.168.0.20|| +-------------------+ +-------------------+
- lvs-tun:調度器,虛擬服務IP:192.168.0.100
- rs1/rs2:真實服務器,分別為 192.168.0.10 和 192.168.0.20
二、系統安裝與準備
1. LVS相關軟件安裝
在 lvs-tun 主機上:
dnf search lvs
dnf install -y ipvsadm
2. RealServer需安裝并啟動web服務(如httpd/nginx)
(以httpd為例)
yum install -y httpd
systemctl enable --now httpd
echo "RS1-192.168.0.10" > /var/www/html/index.html # rs1配置
echo "RS2-192.168.0.20" > /var/www/html/index.html # rs2配置
三、LVS-TUN模式配置
1. 配置IPVS調度
在 lvs-tun 主機上:
ipvsadm -A -t 192.168.0.100:80 -s rr
ipvsadm -a -t 192.168.0.100:80 -r 192.168.0.10:80 -i
ipvsadm -a -t 192.168.0.100:80 -r 192.168.0.20:80 -i
參數說明:
-A
添加虛擬服務-t
指定虛擬IP和端口-s rr
采用輪詢調度-a
添加真實服務器-r
真實服務器IP:端口-i
TUN模式(IP隧道)
2. 加載IP隧道內核模塊(所有主機)
modprobe ipip
可寫入 /etc/modules-load.d/ipip.conf
,確保開機自動加載。
四、RealServer配置(rs1與rs2)
1. ARP優化參數(防止虛擬IPARP沖突)
echo "net.ipv4.conf.lo.arp_ignore = 1" >> /etc/sysctl.conf
echo "net.ipv4.conf.lo.arp_announce = 2" >> /etc/sysctl.conf
echo "net.ipv4.conf.all.arp_ignore = 1" >> /etc/sysctl.conf
echo "net.ipv4.conf.all.arp_announce = 2" >> /etc/sysctl.conf
sysctl -p
2. 配置虛擬IP地址到lo接口
ip addr add 192.168.0.100/32 dev lo
3. 安裝并配置arptables,防止ARP欺騙
yum install -y arptables.x86_64
arptables -A INPUT -d 192.168.0.100 -j DROP
arptables -A OUTPUT -s 192.168.0.100 -j mangle --mangle-ip-s 192.168.0.2
arptables-save > /etc/sysconfig/arptables
4. 檢查并允許IPIP協議(防火墻)
如用 firewalld:
firewall-cmd --permanent --add-protocol=ipip
firewall-cmd --reload
4五、客戶端測試案例
在 Client 主機上:
curl 192.168.0.100
# RS1-192.168.0.10curl 192.168.0.100
# RS2-192.168.0.20curl 192.168.0.100
# RS1-192.168.0.10
總結
- ARP參數與arptables必須配置,防止RealServer響應VIP的ARP請求,避免網絡異常。
- IPVS調度器和RealServer都需加載ipip隧道模塊。
- 虛擬IP須綁定至RealServer的lo接口,且為/32掩碼。
- 防火墻需允許IPIP協議(協議號4)。
- 建議將相關配置寫入系統啟動腳本,防止重啟失效。
- 每臺RealServer需配置獨立的index.html,便于驗證調度效果。
- LVS-TUN模式適合DDoS防護、異地容災等跨網段負載均衡場景。
lvs-fullnat模式(不常用)
通過同時修改請求報文的源IP地址和目標IP地址進行轉發;此類型默認不支持;
(1) VIP是公網地址,RIP和DIP是私網地址,且通常不在同一IP網絡;因此,RIP的網關一般不會指向DIP;
(2) RS收到的請求報文源地址是DIP,因此,只能響應給DIP;但Director還要將其發往Client;
(3) 請求和響應報文都經由Director;
(4) 支持端口映射
LVS(Linux Virtual Server)四種工作模式和13種調度算法詳解
一、LVS 四種工作模式
1. NAT(Network Address Translation)模式
工作原理:
- 客戶端請求到達 LVS 調度器(Director)。
- LVS 修改請求報文的目標 IP(VIP → Real Server IP),并轉發給后端真實服務器(Real Server)。
- 真實服務器處理請求后,將響應返回給 LVS。
- LVS 修改響應報文的源 IP(Real Server IP → VIP),再返回給客戶端。
特點:
? 支持端口映射(VIP 和 Real Server 端口可以不同)。
? 真實服務器可以位于不同網絡(跨 VLAN)。
? 性能瓶頸:進出流量都要經過 LVS,LVS 容易成為性能瓶頸。
? 網關依賴:真實服務器必須將默認網關指向 LVS,否則無法回包。
適用場景:
- 適用于小型集群,對性能要求不高。
- 需要端口映射(如 VIP:80 → Real Server:8080)的場景。
2. DR(Direct Routing)模式
工作原理:
- 客戶端請求到達 LVS 調度器(Director)。
- LVS 僅修改請求報文的 MAC 地址(目標 MAC → Real Server MAC),不修改 IP。
- 真實服務器直接響應客戶端(不經過 LVS),但源 IP 仍然是 VIP(需要配置 lo:VIP)。
- 客戶端收到響應后,認為數據來自 VIP,不會感知 LVS 的存在。
特點:
? 高性能:響應數據不經過 LVS,僅請求經過。
? 低延遲:適用于高并發場景。
? ARP 問題:需要抑制真實服務器的 VIP ARP 響應(arp_ignore=1
和 arp_announce=2
)。
? 網絡限制:LVS 和 Real Server 必須在同一 LAN(不能跨 VLAN)。
適用場景:
- 高性能 Web 服務器集群(如電商、金融交易系統)。
- 需要低延遲、高吞吐量的應用。
3. TUN(IP Tunneling)模式
工作原理:
- LVS 將客戶端請求封裝在 IP 隧道(如 IPIP/GRE)中,轉發給真實服務器。
- 真實服務器解封裝后處理請求,并直接響應客戶端(源 IP 仍是 VIP)。
- 響應數據不經過 LVS。
特點:
? 跨網絡支持:LVS 和 Real Server 可以不在同一網絡(跨機房)。
? 高性能:響應數據不經過 LVS。
? 配置復雜:需要 Real Server 支持 IP 隧道協議(如 ipip
模塊)。
? 額外開銷:IP 封裝/解封裝增加 CPU 負擔。
適用場景:
- 跨數據中心負載均衡(如異地容災)。
- 需要高可用但 Real Server 不在同一 LAN 的場景。
4. FULLNAT 模式
工作原理:
- LVS 同時修改請求報文的源 IP 和目標 IP(CIP → LVS IP,VIP → RIP)。
- 真實服務器看到的源 IP 是 LVS 的 IP,而不是客戶端的 IP。
- LVS 在返回響應時,再修改源 IP(RIP → VIP)和目標 IP(LVS IP → CIP)。
特點:
? 跨 VLAN 支持:Real Server 可以位于不同網絡。
? 隱藏客戶端 IP:Real Server 看不到客戶端的真實 IP(需通過 TOA
模塊獲取)。
? 性能影響:所有流量都要經過 LVS,類似 NAT 模式。
適用場景:
- 需要隱藏客戶端 IP 的場景(如安全防護)。
- 大規模跨 VLAN 負載均衡(如云環境)。
二、LVS 13 種調度算法
靜態調度算法(不感知服務器負載)
算法 | 名稱 | 說明 |
---|---|---|
rr | 輪詢(Round Robin) | 按順序依次分配請求,不考慮服務器負載。 |
wrr | 加權輪詢(Weighted RR) | 按權重比例分配請求(如權重 3:2:1)。 |
sh | 源地址哈希(Source Hashing) | 相同源 IP 的請求固定分配到同一服務器(會話保持)。 |
dh | 目標地址哈希(Destination Hashing) | 相同目標 IP 的請求固定分配到同一服務器(CDN 場景)。 |
動態調度算法(感知服務器負載)
算法 | 名稱 | 說明 |
---|---|---|
lc | 最少連接(Least Connections) | 選擇當前連接數最少的服務器。 |
wlc | 加權最少連接(Weighted LC) | 默認算法,考慮權重 + 連接數。 |
lblc | 基于局部性的最少連接 | 類似 dh + lc ,適用于緩存服務器。 |
lblcr | 帶復制的基于局部性最少連接 | 優化 lblc ,允許請求在相似服務器間分配。 |
sed | 最短期望延遲(Shortest Expected Delay) | 選擇 (活動連接 + 1) / 權重 最小的服務器。 |
nq | 永不排隊(Never Queue) | 優先選擇空閑服務器,否則使用 sed 。 |
lt | 最小流量(Least Traffic) | 選擇當前流量最少的服務器。 |
wlt | 加權最小流量(Weighted LT) | 考慮權重的 lt 算法。 |
wrt | 加權響應時間(Weighted Response Time) | 選擇平均響應時間最短的服務器。 |
三、總結對比
模式 | 性能 | 跨網絡 | 配置復雜度 | 適用場景 |
---|---|---|---|---|
NAT | 低 | ? | 簡單 | 小型集群、端口映射 |
DR | 高 | ? | 中等 | 高性能 Web 服務 |
TUN | 高 | ? | 復雜 | 跨機房負載均衡 |
FULLNAT | 中 | ? | 中等 | 云環境、安全防護 |
調度算法選擇:
- 默認推薦
wlc
(加權最少連接)。 - 需要會話保持 →
sh
(源地址哈希)。 - 緩存服務器優化 →
lblc
/lblcr
。 - 低延遲優先 →
sed
/nq
。
LVS 的靈活模式 + 多種調度算法使其適用于各種高可用、高性能負載均衡場景。 看看嘛
|
| wlt | 加權最小流量(Weighted LT) | 考慮權重的 lt
算法。 |
| wrt | 加權響應時間(Weighted Response Time) | 選擇平均響應時間最短的服務器。 |
三、總結對比
模式 | 性能 | 跨網絡 | 配置復雜度 | 適用場景 |
---|---|---|---|---|
NAT | 低 | ? | 簡單 | 小型集群、端口映射 |
DR | 高 | ? | 中等 | 高性能 Web 服務 |
TUN | 高 | ? | 復雜 | 跨機房負載均衡 |
FULLNAT | 中 | ? | 中等 | 云環境、安全防護 |
調度算法選擇:
- 默認推薦
wlc
(加權最少連接)。 - 需要會話保持 →
sh
(源地址哈希)。 - 緩存服務器優化 →
lblc
/lblcr
。 - 低延遲優先 →
sed
/nq
。
LVS 的靈活模式 + 多種調度算法使其適用于各種高可用、高性能負載均衡場景。 看看嘛