华子目录
lvs-nat
- 本质是
多目标IP
的DNAT
,通过将请求报文
中的目标地址
和目标端口
修改为某挑出
的RS
的rip
和port
实现转发
rip
和dip
应在同一个IP网络
(同一网段
),且应使用私网地址
RS
的网关
要指向dip
请求报文
和响应报文
都必须经由Director
转发,Director
易于成为系统瓶颈
- 支持
端口映射
,可修改请求报文
的目标port
vs
必须是Linux系统
,RS
可以是任意OS系统
nat模式数据逻辑
客户端
发送访问请求
,请求数据包
中含有请求来源(cip)
,访问目标地址(VIP)
,访问目标端口(80port)
VS服务器
接收到访问请求做DNAT
把请求数据包
中的目的地址
由VIP
换成RS
的RIP
和相应端口9000
RS1
响应请求,发送响应数据包
,包中的响应报文
为数据来源(RIP1)
,响应目标(CIP)
,响应端口(9000port)
VS服务器
接收到响应数据包
,改变
包中的数据来源(RIP1-->VIP)
,响应目标端口(9000-->80)
VS服务器
把修改过报文的响应数据包
回传给客户端
nat模式的弊端
lvs
的NAT模式
接收和返回客户端数据包时都要经过lvs
的调度机
,所以lvs
的调度机容易阻塞
实验拓扑
实验主机准备
- 准备
3
台主机,一台lvs
,两台webserver
(webserver1,Webserver2
)
lvs
主机上两个网卡
,一个nat
,一个仅主机
- 两个
webserver
上一个仅主机
网卡
rip
的网关
指向dip
- 由于
lvs
的nat模式
和仅主机模式
的网卡
处于不同vlan
,两个网卡要想通信
,就必须打开Linux内核路由转发功能
webserver1
网卡设定
实验步骤
1.lvs
上的ip
设置
vip
:172.25.254.100
dip
:192.168.0.100
bash
复制代码
[root@lvs ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0
[ethernet]
[ipv4]
address=172.25.254.100/24,172.25.254.2
dns=114.114.114.114
method=manual
[ipv6]
addr-gen-mode=default
method=auto
[proxy]
bash
复制代码
[root@lvs ~]# cat /etc/NetworkManager/system-connections/eth1.nmconnection
[connection]
id=eth1
type=ethernet
interface-name=eth1
[ethernet]
[ipv4]
address=192.168.0.100/24
method=manual
[ipv6]
addr-gen-mode=default
method=auto
[proxy]
bash
复制代码
[root@lvs ~]# nmcli connection reload
[root@lvs ~]# nmcli connection up eth0
[root@lvs ~]# nmcli connection up eth1
bash
复制代码
[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: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0c:29:35:a8:7c brd ff:ff:ff:ff:ff:ff
altname enp3s0
altname ens160
inet 172.25.254.100/24 brd 172.25.254.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet6 fe80::aae4:10d1:b082:a3e8/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0c:29:35:a8:86 brd ff:ff:ff:ff:ff:ff
altname enp19s0
altname ens224
inet 192.168.0.100/24 brd 192.168.0.255 scope global noprefixroute eth1
valid_lft forever preferred_lft forever
inet6 fe80::d494:9f80:ebde:c2fe/64 scope link noprefixroute
valid_lft forever preferred_lft forever
2.lvs中开启路由转发功能
bash
复制代码
[root@lvs ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward=1 #在末尾添加
bash
复制代码
[root@lvs ~]# sysctl -p #重新加载
net.ipv4.ip_forward = 1
3.webserver1
的ip
配置
rip
:192.168.0.10
网关
指向dip
:192.168.0.100
bash
复制代码
[root@webserver1 ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0
[ethernet]
[ipv4]
address=192.168.0.10/24,192.168.0.100
method=manual
[ipv6]
addr-gen-mode=default
method=auto
[proxy]
bash
复制代码
[root@webserver1 ~]# nmcli connection reload
[root@webserver1 ~]# nmcli connection up eth0
bash
复制代码
[root@webserver1 ~]# 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: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0c:29:5f:4a:ff brd ff:ff:ff:ff:ff:ff
altname enp3s0
altname ens160
inet 192.168.0.10/24 brd 192.168.0.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet6 fe80::aae4:10d1:b082:a3e8/64 scope link noprefixroute
valid_lft forever preferred_lft forever
bash
复制代码
[root@webserver1 ~]# 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
4.webserver2
的ip
配置
rip
:192.168.0.20
网关
指向dip
:192.168.0.100
bash
复制代码
[root@webserver2 ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0
[ethernet]
[ipv4]
address=192.168.0.20/24,192.168.0.100
method=manual
[ipv6]
addr-gen-mode=default
method=auto
[proxy]
bash
复制代码
[root@webserver2 ~]# nmcli connection reload
[root@webserver2 ~]# nmcli connection up eth0
bash
复制代码
[root@webserver2 ~]# 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: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0c:29:ef:47:71 brd ff:ff:ff:ff:ff:ff
altname enp3s0
altname ens160
inet 192.168.0.20/24 brd 192.168.0.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet6 fe80::4edb:9236:122:df1a/64 scope link noprefixroute
valid_lft forever preferred_lft forever
bash
复制代码
[root@webserver2 ~]# 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
5.webserver12
端安装httpd
,并编写测试网页,开启自启动
bash
复制代码
[root@webserver1 ~]# yum install httpd -y
bash
复制代码
[root@webserver1 ~]# echo webserver1-192.168.0.10 > /var/www/html/index.html
bash
复制代码
[root@webserver1 ~]# systemctl enable --now httpd
bash
复制代码
[root@webserver2 ~]# yum install httpd -y
bash
复制代码
[root@webserver2 ~]# echo webserver2-192.168.0.20 > /var/www/html/index.html
bash
复制代码
[root@webserver2 ~]# systemctl enable --now httpd
6.内网web
服务测试
bash
复制代码
[root@lvs ~]# curl 192.168.0.10
webserver1-192.168.0.10
[root@lvs ~]# curl 192.168.0.20
webserver2-192.168.0.20
7.安装lvs
软件ipvsadm
bash
复制代码
[root@lvs ~]# yum install ipvsadm -y
8.查看策略
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
9.启动ipvsadm
- 注意:在启动
ipvsadm
之前,需要存在/etc/sysconfig/ipvsadm
文本文件,否则启动会失败
bash
复制代码
[root@lvs ~]# touch /etc/sysconfig/ipvsadm
bash
复制代码
[root@lvs ~]# systemctl restart ipvsadm
bash
复制代码
[root@lvs ~]# systemctl enable --now ipvsadm.service
10.添加策略
bash
复制代码
[root@lvs ~]# ipvsadm -A -t 172.25.254.100:80 -s rr
[root@lvs ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.10:80 -m
[root@lvs ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.20:80 -m
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
TCP 172.25.254.100:80 rr
-> 192.168.0.10:80 Masq 1 0 0
-> 192.168.0.20:80 Masq 1 0 0
#当访问172.25.254.100:80端口时,使用rr轮询算法,转发到192.168.0.10:80或192.168.0.20:80中
- 当停止
ipvsadm
服务后,会将策略自动写入/etc/sysconfig/ipvsadm
文本中。所以策略
是永久添加
,添加完之后就会立即生效
- 也可以使用
ipvsadm-save
命令实现永久保存策略
bash
复制代码
[root@lvs ~]# ipvsadm-save > /etc/sysconfig/ipvsadm
[root@lvs ~]# cat /etc/sysconfig/ipvsadm
-A -t lvs:http -s rr
-a -t lvs:http -r 192.168.0.10:http -m -w 1
-a -t lvs:http -r 192.168.0.20:http -m -w 1
11.lvs-nat
模式测试效果