1. NAT模式案例
1.1 主机规划
| 主机 | 角色 | 系统 | 网络 | IP |
|---|---|---|---|---|
| client | client | redhat 9.7 | 仅主机 | 192.168.10.100/24 |
| lvs | lvs | redhat 9.7 | 仅主机 NAT | 192.168.10.200/24 VIP 192.168.72.8/24 DIP |
| nginx | rs1 | redhat 9.7 | NAT | 192.168.72.7/24 |
| nginx | rs2 | redhat 9.7 | NAT | 192.168.72.17/24 |
1.2 环境准备
克隆四台虚拟机,需要注意根据主机规划方案来设置网络类型。
1.2.1 配置客户端
1、设置主机名
bash
[root@localhost ~]# hostnamectl set-hostname client && bash
[root@client ~]#
2、修改IP地址
bash
[root@client ~]# nmcli c modify ens160 ipv4.method manual ipv4.addresses 192.168.10.100/24 ipv4.dns 223.5.5.5 connection.autoconnect yes
[root@client ~]# nmcli c up ens160
3、关闭selinux
bash
[root@client ~]# setenforce 0
[root@client ~]# sed -i "s/SELINUX=enforcing/SELINUX=permissive/" /etc/selinux/config
4、关闭防火墙
bash
[root@client ~]# systemctl disable --now firewalld.service
Removed "/etc/systemd/system/multi-user.target.wants/firewalld.service".
Removed "/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service".
1.2.2 配置LVS
1、设置主机名
bash
[root@localhost ~]# hostnamectl set-hostname lvs && bash
[root@lvs ~]#
2、修改IP地址
bash
# 1. 修改仅主机模式的IP地址
[root@lvs ~]# nmcli c modify ens160 ipv4.method manual ipv4.addresses 192.168.10.200/24 ipv4.dns 223.5.5.5 connection.autoconnect yes
[root@lvs ~]# nmcli c up ens160
# 2. 修改NAT模式的IP地址
[root@lvs ~]# nmcli c mod "Wired connection 1" connection.id ens224
[root@lvs ~]# nmcli c m ens224 ipv4.method manual ipv4.addr 192.168.72.8/24 ipv4.gateway 192.168.72.2 ipv4.dns 223.5.5.5 connection.autoconnect yes
[root@lvs ~]# nmcli c up ens224
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/4)
3、关闭selinux
bash
[root@lvs ~]# setenforce 0
[root@lvs ~]# sed -i "s/SELINUX=enforcing/SELINUX=permissive/" /etc/selinux/config
4、关闭防火墙
bash
[root@lvs ~]# systemctl disable --now firewalld.service
Removed "/etc/systemd/system/multi-user.target.wants/firewalld.service".
Removed "/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service".
1.2.4 配置RS2
1、修改主机名
bash
[root@localhost ~]# hostnamectl set-hostname rs2 && bash
[root@rs2 ~]#
2、修改IP地址
bash
[root@rs2 ~]# nmcli c m ens160 ipv4.method manual ipv4.addr 192.168.72.17/24 ipv4.gateway 192.168.72.8 ipv4.dns 223.5.5.5 connection.autoconnect yes
[root@rs2 ~]# nmcli c up ens160
3、关闭selinux
bash
[root@rs2 ~]# setenforce 0
[root@rs2 ~]# sed -i "s/SELINUX=enforcing/SELINUX=permissive/" /etc/selinux/config
4、关闭防火墙
bash
[root@rs2 ~]# systemctl disable --now firewalld.service
Removed "/etc/systemd/system/multi-user.target.wants/firewalld.service".
Removed "/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service".
1.3 搭建RS1服务
1、安装nginx
bash
[root@rs1 ~]# dnf install nginx -y
2、修改欢迎页
bash
[root@rs1 ~]# echo "$(hostname) $(hostname -I)" > /usr/share/nginx/html/index.html
3、启动nginx
bash
[root@rs1 ~]# systemctl start nginx
4、运行测试
bash
[root@rs1 ~]# curl localhost
rs1 192.168.72.7
[root@rs1 ~]# curl localhost
rs1 192.168.72.7
1.4 搭建RS2
1、安装nginx
bash
[root@rs2 ~]# dnf install nginx -y
2、修改欢迎页
bash
[root@rs2 ~]# echo "$(hostname) $(hostname -I)" > /usr/share/nginx/html/index.html
3、启动nginx
bash
[root@rs2 ~]# systemctl start nginx
4、访问测试
bash
[root@rs2 ~]# curl localhost
rs2 192.168.72.17
[root@rs2 ~]# curl localhost
rs2 192.168.72.17
1.5 搭建LVS
1、安装ipvsadm
bash
[root@lvs ~]# dnf install ipvsadm -y
2、保存配置
bash
[root@lvs ~]# ipvsadm-save -n > /etc/sysconfig/ipvsadm
# 或者执行
[root@lvs ~]# ipvsadm -S > /etc/sysconfig/ipvsadm
3、启动服务
bash
[root@lvs ~]# systemctl start ipvsadm
[root@lvs ~]# systemctl status ipvsadm
● ipvsadm.service - Initialise the Linux Virtual Server
Loaded: loaded (/usr/lib/systemd/system/ipvsadm.service; enabled; preset: disabled)
Active: active (exited) since Sat 2026-01-17 09:57:54 CST; 58min ago
Main PID: 1002 (code=exited, status=0/SUCCESS)
CPU: 45ms
Jan 17 09:57:54 lvs systemd[1]: Starting Initialise the Linux Virtual Server...
Jan 17 09:57:54 lvs systemd[1]: Finished Initialise the Linux Virtual Server.
4、查看规则
bash
[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
5、添加规则
bash
[root@lvs ~]# ipvsadm -A -t 192.168.72.8:80 -s rr
[root@lvs ~]# 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.72.8:80 rr
6、添加真实主机
bash
[root@lvs ~]# ipvsadm -A -t 192.168.10.200:80 -s rr
[root@lvs ~]# ipvsadm -a -t 192.168.10.200:80 -r 192.168.72.7:80 -m
[root@lvs ~]# ipvsadm -a -t 192.168.10.200:80 -r 192.168.72.17:80 -m
[root@lvs ~]# 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.10.200:80 rr
-> 192.168.72.7:80 Masq 1 0 0
-> 192.168.72.17:80 Masq 1 0 0
7、运行测试
bash
[root@lvs ~]# curl 192.168.72.8
rs2 192.168.72.17
[root@lvs ~]# curl 192.168.72.8
rs1 192.168.72.7
[root@lvs ~]# curl 192.168.72.8
rs2 192.168.72.17
[root@lvs ~]# curl 192.168.72.8
rs1 192.168.72.7
[root@lvs ~]# curl 192.168.72.8
rs2 192.168.72.17
[root@lvs ~]# curl 192.168.72.8
rs1 192.168.72.7
[root@lvs ~]# curl 192.168.72.8
rs2 192.168.72.17
[root@lvs ~]# curl 192.168.72.8
rs1 192.168.72.7
[root@lvs ~]# curl 192.168.72.8
rs2 192.168.72.17
如果是配置加权轮询,则配置如下:
bash
# 清理规则
[root@lvs ~]# ipvsadm -C
# 增加规则
[root@lvs ~]# ipvsadm -A -t 192.168.10.200:80 -s wrr
# 增加集群节点
[root@lvs ~]# ipvsadm -a -t 192.168.10.200:80 -r 192.168.72.7:80 -m -w 5
[root@lvs ~]# ipvsadm -a -t 192.168.10.200:80 -r 192.168.72.17:80 -m -w 2
# 查看规则
[root@lvs ~]# 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.10.200:80 wrr
-> 192.168.72.7:80 Masq 5 0 0
-> 192.168.72.17:80 Masq 2 0 0
1.6 测试
我们在client端测试
bash
[root@client ~]# curl 192.168.10.200
curl: (7) Failed to connect to 192.168.10.200 port 80: Connection refused
[root@client ~]# curl 192.168.10.200
curl: (7) Failed to connect to 192.168.10.200 port 80: Connection refused
可以发现,访问是被拒绝的。
解决办法是:修改 lvs 服务器中 /etc/sysctl.conf 文件,在这个文件中添加转发功能。
bash
[root@lvs ~]# vim /etc/sysctl.conf
文件内容如下:
bash
# sysctl settings are defined through files in
# /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.
#
# Vendors settings live in /usr/lib/sysctl.d/.
# To override a whole file, create a new file with the same in
# /etc/sysctl.d/ and put new settings there. To override
# only specific settings, add a file with a lexically later
# name in /etc/sysctl.d/ and put new settings there.
#
# For more information, see sysctl.conf(5) and sysctl.d(5).
net.ipv4.ip_forward=1
修改保存后,执行如下的命令来让配置生效:
bash
[root@lvs ~]# sysctl -p
net.ipv4.ip_forward = 1
然后再测试:
bash
[root@client ~]# curl 192.168.10.200
rs2 192.168.72.17
[root@client ~]# curl 192.168.72.8
rs1 192.168.72.7
[root@client ~]# curl 192.168.72.8
rs2 192.168.72.17
[root@client ~]# curl 192.168.72.8
rs1 192.168.72.7
[root@client ~]# curl 192.168.72.8
rs2 192.168.72.17
[root@client ~]# curl 192.168.72.8
rs1 192.168.72.7
[root@client ~]# curl 192.168.72.8
rs2 192.168.72.17
[root@client ~]# curl 192.168.72.8
rs1 192.168.72.7
[root@client ~]# curl 192.168.72.8
rs2 192.168.72.17
2. DR单网段案例
2.1 主机规划
| 主机 | 角色 | 系统 | 网络 | IP |
|---|---|---|---|---|
| client | client | redhat 9.7 | 仅主机 | 192.168.10.100/24 |
| router | router | redhat 9.7 | 仅主机 和 NAT | ens160 192.168.10.200/24 ens224 192.168.72.200/24 |
| lvs | lvs | redhat 9.7 | NAT | VIP 192.168.72.100/32 DIP 192.168.72.8/24 |
| nginx | rs1 | redhat 9.7 | NAT | VIP 192.168.72.100/32 RIP 192.168.72.7/24 |
| nginx | rs2 | redhat 9.7 | NAT | VIP 192.168.72.100/32 RIP 192.168.72.17/24 |
2.2 环境准备
2.2.1 配置client
首先设置好主机名、IP地址、关闭selinux和防火墙。
然后将网关设置为 路由器的 IP 地址:
bash
[root@client ~]# nmcli c m ens160 ipv4.gateway 192.168.10.200
[root@client ~]# nmcli c up ens160
查看是否设置成功
bash
[root@client ~]# nmcli d show ens160 | grep IP4.GATEWAY
IP4.GATEWAY: 192.168.10.200
2.2.2 配置router
1、设置主机名
2、配置两个网卡的IP地址
3、关闭selinux
4、关闭防火墙
2.2.3 配置LVS
1、设置主机名
2、配置IP地址
bash
[root@lvs ~]# nmcli d show ens160
GENERAL.DEVICE: ens160
GENERAL.TYPE: ethernet
GENERAL.HWADDR: 00:0C:29:DC:71:44
GENERAL.MTU: 1500
GENERAL.STATE: 100 (connected)
GENERAL.CONNECTION: ens160
GENERAL.CON-PATH: /org/freedesktop/NetworkManager/ActiveConnection/3
WIRED-PROPERTIES.CARRIER: on
IP4.ADDRESS[1]: 192.168.72.8/24
IP4.GATEWAY: 192.168.72.200
IP4.ROUTE[1]: dst = 192.168.72.0/24, nh = 0.0.0.0, mt = 100
IP4.ROUTE[2]: dst = 0.0.0.0/0, nh = 192.168.72.200, mt = 100
IP4.DNS[1]: 223.5.5.5
IP6.ADDRESS[1]: fe80::20c:29ff:fedc:7144/64
IP6.GATEWAY: --
IP6.ROUTE[1]: dst = fe80::/64, nh = ::, mt = 1024
3、关闭selinux
4、关闭防火墙
2.2.5 配置RS1
1、设置主机名
2、配置IP地址
bash
[root@rs1 ~]# nmcli c m ens160 ipv4.gateway 192.168.72.200
[root@rs1 ~]# nmcli c up ens160
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/4)
[root@rs1 ~]# nmcli d show ens160
GENERAL.DEVICE: ens160
GENERAL.TYPE: ethernet
GENERAL.HWADDR: 00:0C:29:D7:3E:38
GENERAL.MTU: 1500
GENERAL.STATE: 100 (connected)
GENERAL.CONNECTION: ens160
GENERAL.CON-PATH: /org/freedesktop/NetworkManager/ActiveConnection/4
WIRED-PROPERTIES.CARRIER: on
IP4.ADDRESS[1]: 192.168.72.7/24
IP4.GATEWAY: 192.168.72.200
IP4.ROUTE[1]: dst = 192.168.72.0/24, nh = 0.0.0.0, mt = 100
IP4.ROUTE[2]: dst = 0.0.0.0/0, nh = 192.168.72.200, mt = 100
IP4.DNS[1]: 223.5.5.5
IP4.DNS[2]: 8.8.8.8
IP6.ADDRESS[1]: fe80::20c:29ff:fed7:3e38/64
IP6.GATEWAY: --
IP6.ROUTE[1]: dst = fe80::/64, nh = ::, mt = 1024
3、关闭selinux
4、关闭防火墙
2.2.6 配置RS2
1、设置主机名
2、配置IP地址
bash
[root@rs2 ~]# nmcli c m ens160 ipv4.gateway 192.168.72.200
[root@rs2 ~]# nmcli c up ens160
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/4)
[root@rs2 ~]# nmcli d show ens160
GENERAL.DEVICE: ens160
GENERAL.TYPE: ethernet
GENERAL.HWADDR: 00:0C:29:FB:BF:21
GENERAL.MTU: 1500
GENERAL.STATE: 100 (connected)
GENERAL.CONNECTION: ens160
GENERAL.CON-PATH: /org/freedesktop/NetworkManager/ActiveConnection/4
WIRED-PROPERTIES.CARRIER: on
IP4.ADDRESS[1]: 192.168.72.17/24
IP4.GATEWAY: 192.168.72.200
IP4.ROUTE[1]: dst = 192.168.72.0/24, nh = 0.0.0.0, mt = 100
IP4.ROUTE[2]: dst = 0.0.0.0/0, nh = 192.168.72.200, mt = 100
IP4.DNS[1]: 223.5.5.5
IP4.DNS[2]: 8.8.8.8
IP6.ADDRESS[1]: fe80::20c:29ff:fefb:bf21/64
IP6.GATEWAY: --
IP6.ROUTE[1]: dst = fe80::/64, nh = ::, mt = 1024
3、关闭selinux
4、关闭防火墙
2.3 功能实现
2.3.1 配置RS1
由于我们在前一个项目中已经把 nginx 服务器的环境搭建完成,此处我们只需要为 RS1 服务器配置 VIP 即可。
1、在lo网卡上添加VIP
bash
[root@rs1 ~]# ip addr add 192.168.72.100/32 dev lo
[root@rs1 ~]# ip a show lo
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.72.100/32 scope global lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2、然后添加一个路由
bash
[root@rs1 ~]# route add -host 192.168.72.100 dev lo
[root@rs1 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.72.200 0.0.0.0 UG 100 0 0 ens160
192.168.72.0 0.0.0.0 255.255.255.0 U 100 0 0 ens160
192.168.72.100 0.0.0.0 255.255.255.255 UH 0 0 0 lo
3、修改内核参数
bash
[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/all/arp_announce
[root@rs1 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
2.3.2 配置RS2
由于我们在前一个项目中已经把 nginx 服务器的环境搭建完成,此处我们只需要为 RS2 服务器配置 VIP 即可。
1、在 lo 网卡配置 VIP
bash
[root@rs2 ~]# ip addr add 192.168.72.100/32 dev lo
[root@rs2 ~]# ip a show lo
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.72.100/32 scope global lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2、为 lo 网卡配置路由
bash
[root@rs2 ~]# route add -host 192.168.72.100 dev lo
[root@rs2 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.72.200 0.0.0.0 UG 100 0 0 ens160
192.168.72.0 0.0.0.0 255.255.255.0 U 100 0 0 ens160
192.168.72.100 0.0.0.0 255.255.255.255 UH 0 0 0 lo
3、修改内核参数
bash
[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/all/arp_announce
[root@rs2 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
2.3.3 配置LVS
1、在lvs的lo网卡上配置VIP
bash
[root@lvs ~]# ip addr add 192.168.72.100/32 dev lo
[root@lvs ~]# ip a show lo
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.72.100/32 scope global lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2、安装ipvsadm
bash
[root@lvs ~]# dnf install ipvsadm -y
Dependencies resolved.
=====================================================================================================================================
Package Architecture Version Repository Size
=====================================================================================================================================
Installing:
ipvsadm x86_64 1.31-6.el9 AppStream 54 k
Transaction Summary
=====================================================================================================================================
Install 1 Package
Total size: 54 k
Installed size: 89 k
Downloading Packages:
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Installing : ipvsadm-1.31-6.el9.x86_64 1/1
Running scriptlet: ipvsadm-1.31-6.el9.x86_64 1/1
Verifying : ipvsadm-1.31-6.el9.x86_64 1/1
Installed products updated.
Installed:
ipvsadm-1.31-6.el9.x86_64
Complete!
3、初始化配置文件
bash
[root@lvs ~]# ipvsadm-save -n > /etc/sysconfig/ipvsadm
4、启动ipvsadm
bash
[root@lvs ~]# systemctl start ipvsadm.service
5、添加规则
bash
[root@lvs ~]# ipvsadm -A -t 192.168.72.100:80 -s rr
[root@lvs ~]# ipvsadm -a -t 192.168.72.100:80 -r 192.168.72.7:80 -g -w 3
[root@lvs ~]# ipvsadm -a -t 192.168.72.100:80 -r 192.168.72.17:80 -g -w 1
[root@lvs ~]# 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.72.100:80 rr
-> 192.168.72.7:80 Route 3 0 0
-> 192.168.72.17:80 Route 1 0 0
2.3.4 配置Router
1、在路由服务器中配置转发功能
bash
[root@router ~]# echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
[root@router ~]# sysctl -p
net.ipv4.ip_forward = 1
2.4 功能测试
我们在客户端进行测试:
bash
[root@client ~]# curl 192.168.72.100
rs2 192.168.72.17
[root@client ~]# curl 192.168.72.100
rs1 192.168.72.7
[root@client ~]# curl 192.168.72.100
rs2 192.168.72.17
[root@client ~]# curl 192.168.72.100
rs1 192.168.72.7
[root@client ~]# curl 192.168.72.100
rs2 192.168.72.17
[root@client ~]# curl 192.168.72.100
rs1 192.168.72.7
[root@client ~]# curl 192.168.72.100
rs2 192.168.72.17
[root@client ~]# curl 192.168.72.100
rs1 192.168.72.7
[root@client ~]# curl 192.168.72.100
rs2 192.168.72.17
[root@client ~]# curl 192.168.72.100
rs1 192.168.72.7
3. DR多网段案例
多网段案例是在单网段案例的基础上完成的。我们只需要将 router 的 IP 段多增加一个。
3.1 配置router
1、在DIP中增加一个 172 的网段
bash
[root@router ~]# nmcli c m ens224 +ipv4.addr 172.16.0.200/24
[root@router ~]# nmcli c up ens224
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/6)
[root@router ~]# ip a show ens224
3: ens224: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0c:29:e0:ff:e9 brd ff:ff:ff:ff:ff:ff
altname enp19s0
inet 192.168.72.200/24 brd 192.168.72.255 scope global noprefixroute ens224
valid_lft forever preferred_lft forever
inet 172.16.0.200/24 brd 172.16.0.255 scope global noprefixroute ens224
valid_lft forever preferred_lft forever
inet6 fe80::4dde:ecca:6c07:30a1/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3.2 配置RS1
1、查看lo网卡
bash
[root@rs1 ~]# ip a show lo
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.72.100/32 scope global lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2、删除lo上的192.168.72.100/32
bash
[root@rs1 ~]# ip addr del 192.168.72.100/32 dev lo
[root@rs1 ~]# ip a show lo
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
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
3、在lo上添加VIP
bash
[root@rs1 ~]# nmcli c m lo +ipv4.addr 172.16.0.100/32
[root@rs1 ~]# nmcli c up lo
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/5)
[root@rs1 ~]# ip a show lo
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 172.16.0.100/32 scope global lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
3.3 配置RS2
1、查看lo网卡
bash
[root@rs2 ~]# ip a show lo
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.72.100/32 scope global lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2、删除lo上的VIP
bash
[root@rs2 ~]# ip addr del 192.168.72.100/32 dev lo
[root@rs2 ~]# ip a show lo
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
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
3、为lo设备增加VIP
bash
[root@rs2 ~]# ifconfig lo:1 172.16.0.100 netmask 255.255.255.255
[root@rs2 ~]# ip a show lo
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/32 scope host lo
valid_lft forever preferred_lft forever
inet 172.16.0.100/32 scope global lo:1
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
3.4 配置LVS
1、查看lo上的VIP
bash
[root@lvs ~]# ip a show lo
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.72.100/32 scope global lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2、删除lo设备上的VIP
bash
[root@lvs ~]# ip addr del 192.168.72.100/32 dev lo
[root@lvs ~]# ip a show lo
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
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
3、在lo设备上增加新的VIP
bash
[root@lvs ~]# ip addr add 172.16.0.100/32 dev lo
[root@lvs ~]# ip a show lo
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 172.16.0.100/32 scope global lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
4、修改规则
bash
[root@lvs ~]# ipvsadm -C
[root@lvs ~]# ipvsadm -A -t 172.16.0.100:80 -s rr
[root@lvs ~]# ipvsadm -a -t 172.16.0.100:80 -r 192.168.72.7:80 -g
[root@lvs ~]# ipvsadm -a -t 172.16.0.100:80 -r 192.168.72.17:80 -g
[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.16.0.100:80 rr
-> 192.168.72.7:80 Route 1 0 0
-> 192.168.72.17:80 Route 1 0 0
3.5 运行测试
bash
[root@client ~]# curl 172.16.0.100
rs2 192.168.72.17
[root@client ~]# curl 172.16.0.100
rs1 192.168.72.7
[root@client ~]# curl 172.16.0.100
rs2 192.168.72.17
[root@client ~]# curl 172.16.0.100
rs1 192.168.72.7
[root@client ~]# curl 172.16.0.100
rs2 192.168.72.17
[root@client ~]# curl 172.16.0.100
4. TUN模式案例
这个模式的大体配置与 DR 单网段配置类似。
4.1 主机规划
| 主机 | 角色 | 系统 | 网络 | IP |
|---|---|---|---|---|
| client | client | redhat 9.7 | 仅主机 | IP:192.168.10.100/24 GW:192.168.10.200 |
| router | router | redhat 9.7 | 仅主机和 NAT | NAT:ens224: 192.168.72.200/24 仅主机:ens160: 192.168.10.200/24 |
| lvs | lvs | redhat 9.7 | NAT | VIP:192.168.72.100/32 GW:192.168.72.200 DIP:192.168.72.8/24 |
| nginx | rs1 | redhat 9.7 | NAT | VIP:192.168.72.100/32 GW:192.168.72.200 RIP:192.168.72.7/24 |
| nginx | rs2 | redhat 9.7 | NAT | VIP:192.168.72.100/32 GW:192.168.72.200 RIP:192.168.72.17/24 |
4.2 环境准备
4.2.1 配置RS1
1、查看ens160网络配置
bash
[root@rs1 ~]# nmcli d show ens160
GENERAL.DEVICE: ens160
GENERAL.TYPE: ethernet
GENERAL.HWADDR: 00:0C:29:D7:3E:38
GENERAL.MTU: 1500
GENERAL.STATE: 100 (connected)
GENERAL.CONNECTION: ens160
GENERAL.CON-PATH: /org/freedesktop/NetworkManager/ActiveConnection/4
WIRED-PROPERTIES.CARRIER: on
IP4.ADDRESS[1]: 192.168.72.7/24
IP4.GATEWAY: 192.168.72.200
IP4.ROUTE[1]: dst = 192.168.72.0/24, nh = 0.0.0.0, mt = 100
IP4.ROUTE[2]: dst = 0.0.0.0/0, nh = 192.168.72.200, mt = 100
IP4.DNS[1]: 223.5.5.5
IP4.DNS[2]: 8.8.8.8
IP6.ADDRESS[1]: fe80::20c:29ff:fed7:3e38/64
IP6.GATEWAY: --
IP6.ROUTE[1]: dst = fe80::/64, nh = ::, mt = 1024
2、修改内核参数
在源有的内核参数的修改基础上增加如下的配置:
bash
# 1. 查看是否已经开启ipip功能
[root@rs1 ~]# lsmod | grep ipip
# 2. 开启ipip内核功能
[root@rs1 ~]# modprobe ipip
# 3. 再次查看ipip内核功能是否开启
[root@rs1 ~]# lsmod | grep ipip
ipip 20480 0
tunnel4 16384 1 ipip
ip_tunnel 36864 1 ipip
# 4. 修改内核参数
[root@rs1 ~]# echo 0 > /proc/sys/net/ipv4/conf/tunl0/arp_filter
[root@rs1 ~]# echo 0 > /proc/sys/net/ipv4/conf/all/arp_filter
[root@rs1 ~]# echo 1 > /proc/sys/net/ipv4/conf/tunl0/arp_ignore
[root@rs1 ~]# echo 2 > /proc/sys/net/ipv4/conf/tunl0/arp_announce
3、配置VIP
bash
# 1. 查看原来配置的VIP
[root@rs1 ~]# ip a show lo
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 172.16.0.100/32 scope global lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
# 2. 删除原来配置的VIP
[root@rs1 ~]# ip addr del 172.16.0.100/32 dev lo
[root@rs1 ~]# ip a show lo
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
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
# 3. 配置tun对应的VIP
[root@rs1 ~]# ip addr add 192.168.72.100 dev tunl0
3: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000
link/ipip 0.0.0.0 brd 0.0.0.0
inet 192.168.72.100/32 scope global tunl0
valid_lft forever preferred_lft forever
[root@rs1 ~]# 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
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0c:29:d7:3e:38 brd ff:ff:ff:ff:ff:ff
altname enp3s0
inet 192.168.72.7/24 brd 192.168.72.255 scope global noprefixroute ens160
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fed7:3e38/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000
link/ipip 0.0.0.0 brd 0.0.0.0
inet 192.168.72.100/32 scope global tunl0
valid_lft forever preferred_lft forever
4.2.2 配置RS2
1、查看ens160网络配置
bash
[root@rs2 ~]# nmcli d show ens160
GENERAL.DEVICE: ens160
GENERAL.TYPE: ethernet
GENERAL.HWADDR: 00:0C:29:FB:BF:21
GENERAL.MTU: 1500
GENERAL.STATE: 100 (connected)
GENERAL.CONNECTION: ens160
GENERAL.CON-PATH: /org/freedesktop/NetworkManager/ActiveConnection/4
WIRED-PROPERTIES.CARRIER: on
IP4.ADDRESS[1]: 192.168.72.17/24
IP4.GATEWAY: 192.168.72.200
IP4.ROUTE[1]: dst = 192.168.72.0/24, nh = 0.0.0.0, mt = 100
IP4.ROUTE[2]: dst = 0.0.0.0/0, nh = 192.168.72.200, mt = 100
IP4.DNS[1]: 223.5.5.5
IP4.DNS[2]: 8.8.8.8
IP6.ADDRESS[1]: fe80::20c:29ff:fefb:bf21/64
IP6.GATEWAY: --
IP6.ROUTE[1]: dst = fe80::/64, nh = ::, mt = 1024
2、修改内核参数
在源有的内核参数的修改基础上增加如下的配置:
bash
# 1. 开启ipip模块
[root@rs2 ~]# modprobe ipip
[root@rs2 ~]# lsmod | grep ipip
ipip 20480 0
tunnel4 16384 1 ipip
ip_tunnel 36864 1 ipip
# 2. 修改内核参数
[root@rs2 ~]# echo 0 > /proc/sys/net/ipv4/conf/tunl0/arp_filter
[root@rs2 ~]# echo 0 > /proc/sys/net/ipv4/conf/all/arp_filter
[root@rs2 ~]# echo 1 > /proc/sys/net/ipv4/conf/tunl0/arp_ignore
[root@rs2 ~]# echo 2 > /proc/sys/net/ipv4/conf/tunl0/arp_announce
3、配置VIP
bash
# 1. 查看原来的VIP
[root@rs2 ~]# ip a show lo
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/32 scope host lo
valid_lft forever preferred_lft forever
inet 172.16.0.100/32 scope global lo:1
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
# 2. 删除原来的VIP
[root@rs2 ~]# ip addr del 172.16.0.100/32 dev lo
[root@rs2 ~]# ip a show lo
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/32 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
# 3. 增加tul0模式的VIP
[root@rs2 ~]# ifconfig tunl0 192.168.72.100 netmask 255.255.255.255 up
[root@rs2 ~]# ip a show
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/32 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0c:29:fb:bf:21 brd ff:ff:ff:ff:ff:ff
altname enp3s0
inet 192.168.72.17/24 brd 192.168.72.255 scope global noprefixroute ens160
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fefb:bf21/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: tunl0@NONE: <NOARP,UP,LOWER_UP> mtu 1480 qdisc noqueue state UNKNOWN group default qlen 1000
link/ipip 0.0.0.0 brd 0.0.0.0
inet 192.168.72.100/32 scope global tunl0
valid_lft forever preferred_lft forever
# 4. 启用tunl0网卡
[root@lvs ~]# ifconfig tunl0 192.168.72.100 netmask 255.255.255.255 up
[root@lvs ~]# 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
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0c:29:dc:71:44 brd ff:ff:ff:ff:ff:ff
altname enp3s0
inet 192.168.72.8/24 brd 192.168.72.255 scope global noprefixroute ens160
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fedc:7144/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: tunl0@NONE: <NOARP,UP,LOWER_UP> mtu 1480 qdisc noqueue state UNKNOWN group default qlen 1000
link/ipip 0.0.0.0 brd 0.0.0.0
inet 192.168.72.100/32 scope global tunl0
valid_lft forever preferred_lft forever
4.2.3 配置LVS
1、DIP 无须修改我们在前面案例中已经配置好了。
2、配置VIP
bash
# 1. 删除原来的VIP
[root@lvs ~]# ip addr del 172.16.0.100/32 dev lo
# 2. 开启ipip模块
[root@lvs ~]# modprobe ipip
[root@lvs ~]# lsmod | grep ipip
ipip 20480 0
tunnel4 16384 1 ipip
ip_tunnel 36864 1 ipip
# 3. 为tunl0设置VIP
[root@lvs ~]# ip addr add 192.168.72.100/32 dev tunl0
[root@lvs ~]# 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
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0c:29:dc:71:44 brd ff:ff:ff:ff:ff:ff
altname enp3s0
inet 192.168.72.8/24 brd 192.168.72.255 scope global noprefixroute ens160
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fedc:7144/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000
link/ipip 0.0.0.0 brd 0.0.0.0
inet 192.168.72.100/32 scope global tunl0
valid_lft forever preferred_lft forever
# 4. 启用tunl0网卡
[root@lvs ~]# ifconfig tunl0 192.168.72.100 netmask 255.255.255.255 up
[root@lvs ~]# 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
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0c:29:dc:71:44 brd ff:ff:ff:ff:ff:ff
altname enp3s0
inet 192.168.72.8/24 brd 192.168.72.255 scope global noprefixroute ens160
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fedc:7144/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: tunl0@NONE: <NOARP,UP,LOWER_UP> mtu 1480 qdisc noqueue state UNKNOWN group default qlen 1000
link/ipip 0.0.0.0 brd 0.0.0.0
inet 192.168.72.100/32 scope global tunl0
valid_lft forever preferred_lft forever
3、配置访问规则
bash
[root@lvs ~]# ipvsadm -C
[root@lvs ~]# ipvsadm -A -t 192.168.72.100:80 -s rr
[root@lvs ~]# ipvsadm -a -t 192.168.72.100:80 -r 192.168.72.7:80 -i
[root@lvs ~]# ipvsadm -a -t 192.168.72.100:80 -r 192.168.72.17:80 -i
[root@lvs ~]# 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.72.100:80 rr
-> 192.168.72.7:80 Tunnel 1 0 0
-> 192.168.72.17:80 Tunnel 1 0 0
4.2.4 配置Router
1、查看现在所有的网卡信息
bash
[root@router ~]# 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
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0c:29:e0:ff:df brd ff:ff:ff:ff:ff:ff
altname enp3s0
inet 192.168.10.200/24 brd 192.168.10.255 scope global noprefixroute ens160
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fee0:ffdf/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: ens224: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0c:29:e0:ff:e9 brd ff:ff:ff:ff:ff:ff
altname enp19s0
inet 192.168.72.200/24 brd 192.168.72.255 scope global noprefixroute ens224
valid_lft forever preferred_lft forever
inet 172.16.0.200/24 brd 172.16.0.255 scope global noprefixroute ens224
valid_lft forever preferred_lft forever
inet6 fe80::4dde:ecca:6c07:30a1/64 scope link noprefixroute
valid_lft forever preferred_lft forever
2、删除ens224网卡上的172.16.0.200/24
bash
# 删除IP
[root@router ~]# nmcli c mod ens224 -ipv4.addr 172.16.0.200/24
[root@router ~]# nmcli c up ens224
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/7)
[root@router ~]# 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
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0c:29:e0:ff:df brd ff:ff:ff:ff:ff:ff
altname enp3s0
inet 192.168.10.200/24 brd 192.168.10.255 scope global noprefixroute ens160
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fee0:ffdf/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: ens224: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0c:29:e0:ff:e9 brd ff:ff:ff:ff:ff:ff
altname enp19s0
inet 192.168.72.200/24 brd 192.168.72.255 scope global noprefixroute ens224
valid_lft forever preferred_lft forever
inet6 fe80::4dde:ecca:6c07:30a1/64 scope link noprefixroute
valid_lft forever preferred_lft forever
4.3 运行测试