LVS(Linux virual server)

一、NAT模式环境设定

1.VS主机中

root@vsnode \~# vmset.sh eth0 172.25.254.100 vsnode

root@vsnode \~# vmset.sh eth1 192.168.0.100 vsnode noroute

2.RS1

设定网络

root@RS1 \~# vmset.sh eth0 192.168.0.20 RS1 noroute

root@RS1 \~# nmcli connection modify eth0 ipv4.gateway 192.168.0.100

root@RS1 \~# nmcli connection reload

root@RS1 \~# nmcli connection up eth0

root@RS1 \~# route -n

Kernel IP routing table

Destination Gateway Genmask Flags Metric Ref Use Iface

0.0.0.0 192.168.0.100 0.0.0.0 UG 100 0 0 eth0

192.168.0.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0

设定访问业务真实数据

root@RS1 \~# dnf install httpd -y

root@RS1 \~# systemctl enable --now httpd

root@RS1 \~# echo RS1 - 192.168.0.20 > /var/www/html/index.html

3.RS2

#设定网络

root@RS1 \~# vmset.sh eth0 192.168.0.30 RS1 noroute

root@RS1 \~# nmcli connection modify eth0 ipv4.gateway 192.168.0.100

root@RS1 \~# nmcli connection reload

root@RS1 \~# nmcli connection up eth0

root@RS1 \~# route -n

Kernel IP routing table

Destination Gateway Genmask Flags Metric Ref Use Iface

0.0.0.0 192.168.0.100 0.0.0.0 UG 100 0 0 eth0

192.168.0.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0

设定访问业务真实数据

root@RS1 \~# dnf install httpd -y

root@RS1 \~# systemctl enable --now httpd

root@RS1 \~# echo RS2 - 192.168.0.30 > /var/www/html/index.html

4.在vs主机中测试环境

root@vsnode \~# curl 192.168.0.20

RS1 - 192.168.0.20

root@vsnode \~# curl 192.168.0.30

RS2 - 192.168.0.30

二、DR模式实验过程

环境设定方式

1.在路由器中

root@router \~# systemctl disable --now ipvsadm.service

Removed "/etc/systemd/system/multi-user.target.wants/ipvsadm.service".

root@router \~# ipvsadm -C

root@router \~# vmset.sh eth0 172.25.254.100 vsnode

root@router \~# vmset.sh eth1 192.168.0.100 vsnode noroute、

设定内核路由功能

root@router \~# echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf

root@router \~# sysctl -p

net.ipv4.ip_forward = 1

数据转发策略

root@router \~# iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source 192.168.0.100

root@vsnode \~# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 172.25.254.100

2.vsnode 调度器

root@vsnode \~# vmset.sh eth0 192.168.0.50 vsnode norouter

root@vsnode \~# vim /etc/NetworkManager/system-connections/eth0.nmconnection

connection

id=eth0

type=ethernet

interface-name=eth0

ipv4

method=manual

address1==192.168.0.50/24,192.168.0.100

root@vsnode \~# cd /etc/NetworkManager/system-connections/

root@vsnode system-connections# cp -p eth0.nmconnection lo.nmconnection

root@vsnode system-connections# vim lo.nmconnection

connection

id=lo

type=loopback

interface-name=lo

ipv4

method=manual

address1==127.0.0.1/8

address2=192.168.0.200/32

root@RS1 system-connections# nmcli connection reload

root@RS1 system-connections# nmcli connection up eth0

连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/7)

root@RS1 system-connections# nmcli connection up lo

连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/8)

3.检测

root@vsnode system-connections# route -n

Kernel IP routing table

Destination Gateway Genmask Flags Metric Ref Use Iface

0.0.0.0 192.168.0.100 0.0.0.0 UG 100 0 0 eth0

192.168.0.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0

192.168.0.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0

4.客户端

root@client \~# vmset.sh eth0 172.25.254.99 client norouter

连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/4)

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000

link/ether 00:0c:29:e5:75:af brd ff:ff:ff:ff:ff:ff

altname enp3s0

altname ens160

inet 172.25.254.99/24 brd 172.25.254.255 scope global noprefixroute eth0

valid_lft forever preferred_lft forever

inet6 fe80::20c:29ff:fee5:75af/64 scope link tentative noprefixroute

valid_lft forever preferred_lft forever

client

root@client \~# vim /etc/NetworkManager/system-connections/eth0.nmconnection

connection

id=eth0

type=ethernet

interface-name=eth0

ipv4

method=manual

address1=172.25.254.99/24,172.25.254.100

dns=8.8.8.8;

root@client \~# nmcli connection reload

root@client \~# nmcli connection up eth0

连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/5)

root@client \~# route -n

Kernel IP routing table

Destination Gateway Genmask Flags Metric Ref Use Iface

0.0.0.0 172.25.254.100 0.0.0.0 UG 100 0 0 eth0

172.25.254.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0

检测

root@client \~# ping 192.168.0.200

PING 192.168.0.200 (192.168.0.200) 56(84) 比特的数据。

64 比特,来自 192.168.0.200: icmp_seq=1 ttl=128 时间=1.08 毫秒

5.RS1

root@RS1 \~# vmset.sh eth0 192.168.0.10 RS1 noroute

root@RS1 \~# nmcli connection modify eth0 ipv4.gateway 192.168.0.100

root@RS1 \~# nmcli connection reload

root@RS1 \~# nmcli connection up eth0

root@RS1 \~# route -n

Kernel IP routing table

Destination Gateway Genmask Flags Metric Ref Use Iface

0.0.0.0 192.168.0.100 0.0.0.0 UG 100 0 0 eth0

192.168.0.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0

在lo上设定vip

root@RS1 \~# cd /etc/NetworkManager/system-connections/

root@RS1 system-connections# cp -p eth0.nmconnection lo.nmconnection

root@RS1 system-connections# vim lo.nmconnection

connection

id=lo

type=loopback

interface-name=lo

ethernet

ipv4

address1=127.0.0.1/8

address2=192.168.0.200/32

method=manual

root@RS1 system-connections# nmcli connection reload

root@RS1 system-connections# nmcli connection up lo

连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/6)

root@RS1 system-connections# ip a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000

link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

inet 127.0.0.1/8 scope host lo

valid_lft forever preferred_lft forever

inet 192.168.0.200/32 scope global lo

valid_lft forever preferred_lft forever

inet6 ::1/128 scope host

valid_lft forever preferred_lft forever

arp禁止响应

root@rs1 \~# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore

root@rs1 \~# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore

root@rs1 \~# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

root@rs1 \~# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

6.RS2

root@RS2 \~# vmset.sh eth0 192.168.0.20 RS2 noroute

root@RS2 \~# nmcli connection modify eth0 ipv4.gateway 192.168.0.100

root@RS2 \~# nmcli connection reload

root@RS2 \~# nmcli connection up eth0

root@RS2 \~# route -n

Kernel IP routing table

Destination Gateway Genmask Flags Metric Ref Use Iface

0.0.0.0 192.168.0.100 0.0.0.0 UG 100 0 0 eth0

192.168.0.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0

在lo上设定vip

root@RS2 \~# cd /etc/NetworkManager/system-connections/

root@RS2 system-connections# cp -p eth0.nmconnection lo.nmconnection

root@RS2 system-connections# vim lo.nmconnection

connection

id=lo

type=loopback

interface-name=lo

ethernet

ipv4

address1=127.0.0.1/8

address2=192.168.0.200/32

method=manual

root@RS2 system-connections# nmcli connection reload

root@RS2 system-connections# nmcli connection up lo

连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/6)

root@RS2 system-connections# ip a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000

link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

inet 127.0.0.1/8 scope host lo

valid_lft forever preferred_lft forever

inet 192.168.0.200/32 scope global lo

valid_lft forever preferred_lft forever

inet6 ::1/128 scope host

valid_lft forever preferred_lft forever

arp禁止响应

root@rs2 \~# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore

root@rs2 \~# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore

root@rs2 \~# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

root@rs2 \~# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

三、利用火墙标记解决轮询错误

1.在rs主机中同时开始http和https两种协议

在RS1和RS2中开启https

root@RS1+RS2 \~# dnf install mod_ssl -y

root@RS1+RS2 \~# systemctl restart httpd

root@RS1+RS2 \~# systemctl restart httpd

2.在vsnode中添加https的轮询策略

root@vsnode boot]# ip^Cadm -A -t 192.168.0.200:80 -s rr

root@vsnode boot# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.20 -g

root@vsnode boot# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.30 -g

root@vsnode boot# ipvsadm -A -t 192.168.0.200:443 -s rr

root@vsnode boot# ipvsadm -a -t 192.168.0.200:443 -r 192.168.0.30:443 -g

root@vsnode boot# ipvsadm -a -t 192.168.0.200:443 -r 192.168.0.20:443 -g

root@vsnode boot# ipvsadm -Ln

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

-> RemoteAddress:Port Forward Weight ActiveConn InActConn

TCP 192.168.0.200:80 rr

-> 192.168.0.30:80 Route 1 0 0

-> 192.168.0.20:80 Route 1 0 0

TCP 192.168.0.200:443 rr

-> 192.168.0.30:443 Route 1 0 0

-> 192.168.0.20:443

3.轮询错误展示

root@client \~# curl 192.168.0.200;curl -k https://192.168.0.200

RS2 - 192.168.0.20

RS2 - 192.168.0.20

当上述设定完成后http和https是独立的service,轮询会出现重复问题

解决方案:使用火墙标记访问vip的80和443的所有数据包,设定标记为6666,然后对此标记进行负载

root@vsnode boot# iptables -t mangle -A PREROUTING -d 192.168.0.200 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 6666

root@vsnode boot# ipvsadm -A -f 6666 -s rr

root@vsnode boot# ipvsadm -a -f 6666 -r 192.168.0.30 -g

root@vsnode boot# ipvsadm -a -f 6666 -r 192.168.0.20 -g

#测试:在客户端

root@client \~# curl 192.168.0.200;curl -k https://192.168.0.200

RS2 - 192.168.0.20

RS1 - 192.168.0.30

四、利用持久连接实现会话粘滞

1.设定ipvs调度策略

root@vsnode \~# ipvsadm -A -f 6666 -s rr -p 1

root@vsnode \~# ipvsadm -Ln

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

-> RemoteAddress:Port Forward Weight ActiveConn InActConn

FWM 6666 rr persistent 1

-> 192.168.0.20:0 Route 1 0 0

-> 192.168.0.30:0

2.测试:

root@client \~# curl 192.168.0.200

RS1 - 192.168.0.20

root@client \~# curl 192.168.0.200

RS1 - 192.168.0.20

3.观察

root@vsnode \~# watch -n 1 ipvsadm -Lnc

IPVS connection entries

pro expire state source virtual destination

TCP 01:56 FIN_WAIT 172.25.254.99:42420 192.168.0.200:80 192.168.0.20:80

IP 00:57 ASSURED 172.25.254.99:0 0.0.26.10:0 192.168.0.20:0

TCP 01:54 FIN_WAIT 172.25.254.99:46216 192.168.0.200:80 192.168.0.20:80

TCP 01:55 FIN_WAIT 172.25.254.99:46222 192.168.0.200:80 192.168.0.30:80

相关推荐
在角落发呆20 小时前
工具配置备份步骤:从手动备份到自动化方案
运维·windows·自动化
_upupup20 小时前
Linux的调试工具——gdb/cgdb
linux·服务器
百度一下吧20 小时前
Nginx 使用手册:从安装配置到实战部署
运维·nginx
JeJe同学21 小时前
Docker镜像导入、容器启动
linux·运维·docker
木子n121 小时前
车载以太网与SOME/IP服务化通信实战-01.从字节到服务:SOME/IP报文解析与四通道开销账
网络·网络协议·tcp/ip·车载以太网·some/ip
回眸&啤酒鸭21 小时前
【回眸】自动化白盒测试落地实战指南
运维·自动化·log4j
闲云野鹤在人间1 天前
MySQL|从理论、安装、备份到主从复制、MHA高可用详解
linux·运维·数据库·mysql·云计算
Escalating_xu1 天前
【C 语言】数据在内存中的存储:补码、大小端、整型陷阱与 IEEE 754 全解析
java·c语言·网络
爱跳舞的烤冷面1 天前
Linux篇——网络编程
网络
资料库011 天前
Linux 8个常见运维故障排查
java·linux·运维