6.3LVS/Tun原理和特点:
在原有的IP报文外再次封装多一层IP首部,内部IP首部(源地址为CIP,目标IIP为VIP),
外层IP首部(源地址为DIP,目标IP为RIP)
(a) 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。
此时报文的源IP为CIP,目标IP为VIP 。
(b) PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链
(c) IPVS比对数据包请求的服务是否为集群服务,若是,在请求报文的首部再次封装一层IP报文,封装源IP为为DIP,
目标IP为RIP。然后发至POSTROUTING链。 此时源IP为DIP,目标IP为RIP
(d) POSTROUTING链根据最新封装的IP报文,将数据包发至RS(因为在外层封装多了一层IP首部,所以可以理解为此
时通过隧道传输)。 此时源IP为DIP,目标IP为RIP
(e) RS接收到报文后发现是自己的IP地址,就将报文接收下来,拆除掉最外层的IP后,会发现里面还有一层IP首部,
而且目标是自己的lo接口VIP,那么此时RS开始处理此请求,处理完成之后,通过lo接口送给eth0网卡,然后向外传递。
此时的源IP地址为VIP,目标IP为CIP
(f) 响应报文最终送达至客户端
2.LVS-Tun模型特性:
RIP、VIP、DIP全是公网地址
RS的网关不会也不可能指向DIP
所有的请求报文经由Director Server,但响应报文必须不能进过Director Server
不支持端口映射
RS的系统必须支持隧道
3.需要知道的一些网络知识:
封包:数据要在通讯系统中必须要先经过某些处理,才能在网络当中传递,例如将数据切割为数个区块之后,
才能在网络上依照某种通讯协议来传送,这种过程就好像将包裹打包一样,称为分封。算了,这个貌似涉及
的内容比较 复杂,改天一起整理一下。
IP隧道技术:是路由器把一种网络层协议封装到另一个协议中以跨过网络传送到另一个路由器的处理过程。
隧道技术是一种数据包封装技术,它是将原始IP包(其报头包含原始发送者和最终目的地)封装在另一个
数据包(称为封装的IP包)的数据净荷中进行传输。
隧道,实际上是路由器把一种网络层协议封装到另一个协议中以跨过网络传送到另一个路由器的处理过程。
发送路由器将被传送的协议包进行封装,经过网络传送,接受路由器解开收到的包,取出原始协议;而在
传输过程中的中间路由器并不在意封装的协议是什么。这里的封装协议,称之为传输协议,是跨过网络传
输被封装协议的一种协议,IP协议是IOS唯一选择的传输协议。而被封装的协议在此为IPX协议或者AppleTAlk
协议,通常可以称之为乘客协议。需要特别注意的是:隧道技术是一种点对点的链接,因而必须在链接的两端配置隧道协议。
Linux系统内核实现的IP隧道技术主要有三种(PPP、PPTP和L2TP等协议或软件不是基于内核模块的)
:ipip、gre、sit 。这三种隧道技术都需要内核模块 tunnel4.ko 的支持。
ipip 需要内核模块 ipip.ko ,该方式最为简单!但是你不能通过IP-in-IP隧道转发广播或者IPv6数据包。
你只是连接了两个一般情况下无法直接通讯的IPv4网络而已。至于兼容性,这部分代码已经有很长一段历史了,
它的兼容性可以上溯到1.3版的内核。据网上查到信息,Linux的IP-in-IP隧道不能与其他操作系统或路由器
互相通讯。它很简单,也很有效。
4.lvs/tun模式配置:
server1:172.25.84.4 vip:172.25.84.100
rs1:172.25.84.2 server1 vip 172.25.84.100
rs2:172.25.84.3 server2 vip 172.25.84.100
在server1:
[root@server1 ~]
[root@server1 ~]
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:8a:d4:d6 brd ff:ff:ff:ff:ff:ff
inet 172.25.84.4/24 brd 172.25.84.255 scope global eth0
inet6 fe80::5054:ff:fe8a:d4d6/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:1b:c4:71 brd ff:ff:ff:ff:ff:ff
inet 172.25.84.100/32 scope global eth1
inet6 fe80::5054:ff:fe1b:c471/64 scope link
valid_lft forever preferred_lft forever
在后端服务器server2:
[root@server2 ~]
[root@server2 ~]
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:ee:d7:80 brd ff:ff:ff:ff:ff:ff
inet 172.25.84.2/24 brd 172.25.84.255 scope global eth0
inet 172.25.84.100/32 scope global eth0
inet6 fe80::5054:ff:feee:d780/64 scope link
valid_lft forever preferred_lft forever
[root@server2 ~]
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
172.25.84.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.84.100 0.0.0.0 UG 0 0 0 eth0
在后端服务器server3:
[root@server3 ~]
[root@server3 ~]
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:42:fc:3a brd ff:ff:ff:ff:ff:ff
inet 172.25.84.3/24 brd 172.25.84.255 scope global eth0
inet 172.25.84.100/32 scope global eth0
inet6 fe80::5054:ff:fe42:fc3a/64 scope link
valid_lft forever preferred_lft forever
[root@server3 ~]
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
172.25.84.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.84.100 0.0.0.0 UG 0 0 0 eth0
在server1配置ipvsadm规则:
[root@server1 ~]
[root@server1 ~]
[root@server1 ~]
[root@server1 ~]
[root@server1 ~]
ipvsadm: Saving IPVS table to /etc/sysconfig/ipvsadm: [ OK ]
[root@server1 ~]
[root@server1 ~]
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.84.100:http rr
-> 172.25.84.2:http Tunnel 1 0 0
-> 172.25.84.3:http Tunnel 1 0 0
在后端服务器进行相同的操作:(server3进行相同的操作)
在server2加载隧道模块添加虚拟IP:
[root@server2 ~]
[root@server2 ~]
[root@server2 ~]
1: lo: 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: mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 52:54:00:ee:d7:80 brd ff:ff:ff:ff:ff:ff
inet 172.25.84.2/24 brd 172.25.84.255 scope global eth0
inet6 fe80::5054:ff:feee:d780/64 scope link
valid_lft forever preferred_lft forever
3: tunl0: mtu 1480 qdisc noqueue state UNKNOWN
link/ipip 0.0.0.0 brd 0.0.0.0
inet 172.25.84.100/32 brd 172.25.84.100 scope global tunl0
在server2打开路由协议开启阿帕其关闭rp_filter:
[root@server2 ~]# echo '1' > /proc/sys/net/ipv4/conf/tunl0/arp_ignore
[root@server2 ~]# echo '2' > /proc/sys/net/ipv4/conf/tunl0/arp_announce
[root@server2 ~]# echo '1' > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@server2 ~]# echo '2' > /proc/sys/net/ipv4/conf/all/arp_announce
[root@server2 ~]# echo '0' > /proc/sys/net/ipv4/conf/tunl0/rp_filter
rp_filter参数的作用:
1. 减少DDoS攻击
校验数据包的反向路径,如果反向路径不合适,则直接丢弃数据包,避免过多的无效连接消耗系统资源。
2. 防止IP Spoofing
校验数据包的反向路径,如果客户端伪造的源IP地址对应的反向路径不在路由表中,或者反向路径不是最佳路径,则直接丢弃数据包,不会向伪造IP的客户端回复响应。
[root@server2 ~]# echo '0' > /proc/sys/net/ipv4/conf/all/rp_filter
[root@server2 ~]# 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.ipv4.conf.tunl0.arp_ignore = 1
net.ipv4.conf.tunl0.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.tunl0.rp_filter = 0
net.ipv4.conf.all.rp_filter = 0
[root@server2 ~]# /etc/init.d/httpd status 查看阿帕其服务状态
httpd is stopped
[root@server2 ~]# /etc/init.d/httpd start 开启阿帕其服务
Starting httpd: httpd: Could not reliably determine the server's fully qualified domain name, using 172.25.254.2 for ServerName
[ OK ]
在真机进行测试会发生轮询:
[root@foundation84 Desktop]# curl 172.25.84.100
bbs.westos.org
[root@foundation84 Desktop]# curl 172.25.84.100
www.westos.org
[root@foundation84 Desktop]# curl 172.25.84.100
bbs.westos.org
[root@foundation84 Desktop]# curl 172.25.84.100
www.westos.org
[root@foundation84 Desktop]# curl 172.25.84.100
bbs.westos.org