华子目录
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模式测试效果