和之前一样,在学习net模式之前我们先了解一些概念:
SNAT:是源地址转换,其作用是将ip数据包的源地址转换成另外一个地址。NAT,可能有人觉得奇怪,好好的为什么要进行ip地址转换啊,为了弄懂这个问题,我们要看一下局域网用户上公网的原理,假设内网主机A(192.168.2.8)要和外网主机B(61.132.62.131)通信,A向B发出IP数据包,如果没有SNAT对A主机进行源地址转换,A与B主机的通讯会不正常中断,因为当路由器将内网的数据包发到公网IP后,公网IP会给你的私网IP回数据包,这时,公网IP根本就无法知道你的私网IP应该如何走了。所以问它上一级路由器,当然这是肯定的,因为从公网上根本就无法看到私网IP,因此你无法给他通信。为了实现数据包的正确发送及返回,网关必须将A的址转换为一个合法的公网地址,同时为了以后B主机能将数据包发送给A,这个合法的公网地址必须是网关的外网地址,如果是其它公网地址的话,B会把数据包发送到其它网关,而不是A主机所在的网关,A将收不到B发过来的数据包,所以内网主机要上公网就必须要有合法的公网地址,而得到这个地址的方法就是让网关进行SNAT(源地址转换),将内网地址转换成公网址(一般是网关的外部地址),所以大家经常会看到为了让内网用户上公网,我们必须在routeros的firewall中设置snat,俗称IP地址欺骗或伪装(masquerade)
DNAT :目的地址转换,常用于防火墙中。
DNAT:目的地址转换的作用是将一组本地内部的地址映射到一组全球地址。通常来说,合法地址的数量比起本地内部的地址数量来要少得多。RFC1918中的地址保留可以用地址重叠的方式来达到。当一个内部主机第一次放出的数据包通过防火墙时,动态NAT的实现方式与静态NAT相同,然后这次NAT就以表的形式保留在防火墙中。除非由于某种个原因会引起这次NAT的结束,否则这次NAT就一直保留在防火墙中。引起NAT结束最常见的原因就是发出连接的主机在预定的时间内一直没有响应,这时空闲计时器就会从表中删除该主机的NAT。
iptables之四表五链:超级超级重要的东西,之后单独整理;
filter表——过滤数据包
Nat表——用于网络地址转换(IP、端口)
Mangle表——修改数据包的服务类型、TTL、并且可以配置路由实现QOS
Raw表——决定数据包是否被状态跟踪机制处理
INPUT链——进来的数据包应用此规则链中的策略
OUTPUT链——外出的数据包应用此规则链中的策略
FORWARD链——转发数据包时应用此规则链中的策略
PREROUTING链——对数据包作路由选择前应用此链中的规则(所有的数据包进来的时侯都先由这个链处理)
POSTROUTING链——对数据包作路由选择后应用此链中的规则(所有的数据
包出来的时侯都先由这个链处理)
lvs-net模式流程:
NAT模型:地址转换类型,主要是做地址转换,类似于iptables的DNAT类型,它通过多目标地址转换,来实现负载均衡,一个Director最多负载提供10个Real Server主机
1> client发送request到LVS的VIP上,VIP选择一个Real-server,并记录连接信息到hash表中,然后修改client的request的目的IP地址为Real-server的地址,将请求发给Real-server;
2> Real-server收到request包后,发现目的IP是自己的IP,于是处理请求,然后发送reply给LVS;
3> LVS收到reply包后,修改reply包的的源地址为VIP,发送给client;
4> 从client来的属于本次连接的包,查hash表,然后发给对应的Real-server。
5> 当client发送完毕,此次连接结束或者连接超时,那么LVS自动从hash表中删除此条记录。
路由重定向的前提:
数据包的入接口和路由后的指定的出接口是同一个接口。(vip)
数据包的源IP地址和该包应走的下一跳IP地址属于同一个网段。
数据报非源路由的(这种情况应该比较少见了,源路由多见于Token Ring)。
系统开启重定向功能。
NET模式配置
lvs:172.25.67.3 server3 vip:172.25.254.100
rs1:172.25.67.1 server1
rs2:172.25.67.2 server2
[root@server3 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 52:54:00:18:70:9b brd ff:ff:ff:ff:ff:ff
inet 172.25.67.3/24 brd 172.25.67.255 scope global eth0 ##内网ip
inet6 fe80::5054:ff:fe18:709b/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 52:54:00:54:61:37 brd ff:ff:ff:ff:ff:ff
inet 172.25.254.100/24 brd 172.25.67.255 scope global eth1#外网ip vip
inet6 fe80::5054:ff:fe54:6137/64 scope link
valid_lft forever preferred_lft forever
一:在lvs上配置rule规则,vip为虚拟服务器,rs1 rs2为后端
[root@server3 ~]#ipvsadm -A -t 172.25.254.100:80 -s rr #添加ipvsadm条目,-A表示追加条目,-t表示使用tcp协议,-s rr表示使用轮询算法
[root@server3 ~]#ipvsadm -a -t 172.25.254.100:80 -r 172.25.67.1:80 -m #-a表示追加规则,-t表示使用tcp协议,-r表示real-server,-m表示使用NAT模型
[root@server3 ~]#ipvsadm -a -t 172.25.254.100:80 -r 172.25.67.2:80 -m
[root@server3 ~]# service ipvsadm save #保存 rule
[root@server3 ~]# ipvsadm
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:http rr
-> server1:http Masq 1 0 0
-> server2:http Masq 1 0 0
配置
路由地址转换
一:开启路由机制
修改sysctl.conf文件,开启路由转发功能并使修改生效:
[root@server3 ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@server3 ~]# sysctl -p #重新加载
net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
error: "net.bridge.bridge-nf-call-ip6tables" is an unknown key
error: "net.bridge.bridge-nf-call-iptables" is an unknown key
error: "net.bridge.bridge-nf-call-arptables" is an unknown key
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
二:加载net模块
[root@server3 ~]# modprobe iptable_nat
响应由cip—>ipvs—>rs DNAT 目的地址转换,将原有的目的地之为dip变成rip 响应由rs—->ipvs—->cip SNAT 源地址转换,将原来的源地址rip变成vip
netfilter五个链:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING。ipvs就工作于netfilter的INPUT链。
用户的请求本来是通过INPUT链,送往用户空间的进程的。但工作在input链上的ipvs却会检查此请求,一旦发现请求端口是被定义为集群服务,它就会强行将此报文的地址改为挑选出的后端主机的地址,扔到FORWARD链。通过POSTROUTING链发往后端。ipvsadm用于在ipvs上定义集群服务,同时也得定义此集群服务对应于有哪个后端主机可用。
此时我们就需要配置ipvs“就会强行将此报文的地址改为挑选出的后端主机的地址“这个过程即DNAT转换目的地址支持的协议(就是四层协议):TCP, UDP, SCTP, AH, ESP, AH_ESP
real server端
和前面的dr一样,开启apache,写入测试面。
设置网关
[root@server1 ~]# cat /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=server1
GATEWAY=172.25.67.3 #网关为ipvs lbip
[root@server1 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
172.25.67.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0
0.0.0.0 172.25.67.3 0.0.0.0 UG 0 0 0 eth0
测试:
前提:打开apache 关闭火墙,开启ipvsadm
net模式优点是:占有公网ip少
缺点:响应来回都经过LB 吞吐量小,