一、NAT模式的数据走向
client–>vs–>rs–>vs–>clent(原路返回)
用户请求为客户端IP到调度器的虚拟IP,(CIP-VIP)—->LVS调度DIRECTOR,
在此处调度器会将报文再次封装一个RS的IP头,即此时的数据包是((CIPVIP)+RIP),
调度器将再次封装后的数据发到RS,—>用户请求到达RS,
RS解包数据相应处理再发回调度器,由调度器返回客户端。此阶段RS也会在本地LO回环
接口上绑定VIP别名并抑制ARP相应,因此RS发送到调度器DIRECTOR的数据包是VIP-CIP,不会是RIP-CIP。
NAT模式下,RS响应后的数据包封装成(VIP-CIP),为什么调度器能收到?
是因为NAT模式下,调度器IP必须是RS的网关,RS响应后的数据包必须通过调度器返回客户端。
该模式调度器负载较大,一般不用。
二、NAT负载均衡配置
server1:
1、server1添加一块网卡,为双网卡
激活网卡、添加外网IP
ip link set up eth1
ip addr add 172.25.254.161/24 dev eth1
ip addr
2、修改内部路由设置
打开ip转换功能
sever1收到客户端请求后,得到一个公网的ip,跟目的主机server2和server3不在一个网段,所以如果想要将客户端来的数据包转发给后端服务器,那么必须对这个数据包进行ip转换,再进行数据包转发。出于安全考虑,Linux系统默认是禁止数据包转发的。配置Linux系统的ip转发功能,首先保证硬件连通,然后打开系统的转发功能.
vim /etc/sysctl.conf
7 net.ipv4.ip_forward = 1
sysctl -p
3、添加ipvsadm策略
[root@server1 keepalived]# ipvsadm -A -t 172.25.254.161:80 -s rr
[root@server1 keepalived]# ipvsadm -a -t 172.25.254.161:80 -r 172.25.61.2:80 -m
[root@server1 keepalived]# ipvsadm -a -t 172.25.254.161:80 -r 172.25.61.3:80 -m
[root@server1 keepalived]# 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.161:80 rr
-> 172.25.61.2:80 Masq 1 0 0
-> 172.25.61.3:80 Masq 1 0 0
server2、server3:
1、打开httpd服务并设置默认发布文件
/etc/init.d/httpd start
2、修改网络配置,配置RS的网关指向VS
因为NAT模式下数据包的走向是原路返回,要带着返回的数据包经过调度器回到客户端
route add default gw 172.25.61.1 ##临时设置,开机取消
物理机检测:轮循
三、TUN隧道模式负载均衡配置
server1:
1、取消调用eth1网卡
ip addr del 172.25.254.161/24 dev eth1
ip link set down eth1
2、添加tun隧道IP
modprobe ipip ##添加隧道
ip link set up tunl0 ##激活隧道
ip addr add 172.25.61.200/24 dev tunl0 ##添加VIP
3、添加ipvsadm规则
[root@server1 ~]# ipvsadm -A -t 172.25.61.200:80 -s rr
[root@server1 ~]# ipvsadm -a -t 172.25.61.200:80 -r 172.25.61.2:80 -i
[root@server1 ~]# ipvsadm -a -t 172.25.61.200:80 -r 172.25.61.3:80 -i
[root@server1 ~]# 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.61.200:80 rr
-> 172.25.61.2:80 Tunnel 1 0 0
-> 172.25.61.3:80 Tunnel 1 0 0
4、修改内部路由设置
vim /etc/sysctl.conf
7 net.ipv4.ip_forward = 1
10 net.ipv4.conf.default.rp_filter = 0
sysctl -p
server2、server3:
1、添加tun隧道IP
modprobe ipip
ip link set up tunl0
ip addr add 172.25.61.200/24 dev tunl0
2、设置IP禁用
因为在一个网内,如果三台服务器有着相同的ip,那么会发生冲突,那么我们可以利用arptables将servere2和server3的ip端口对外隐藏。
添加DROP策略
/etc/init.d/arptables_jf start
arptables -A IN -d 172.25.61.200 -j DROP
临时修改内部路由参数
sysctl -w net.ipv4.conf.tunl0.rp_filter=0
[root@server3 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
172.25.61.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
172.25.61.0 0.0.0.0 255.255.255.0 U 0 0 0 tunl0
169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0
3、开启httpd服务
/etc/init.d/httpd start