LVS-TUN(Virtual Server via IP Tunneling)原理说明与配置用例

LVS-TUN(Virtual Server via IP Tunneling)原理说明与配置用例html

LVS-DR(Virtual Server via Direct Routing)原理说明与配置用例
java

LVS-NAT(Virtual Server via NAT)原理说明与配置用例
linux


什么P隧道技术?算法

简单来讲IP隧道技术就是将 【IP数据包】 的上面再封装一层【IP数据包】, 而后路由器根据最外层的IP地址路由到目的地服务器,目的地服务器拆掉最外层的IP数据包,拿到里面的IP数据包进行处理。bash


画了一张图来理解。服务器



在经过抓包工具看看IP隧道封装后的IP数据包的格式。并发




LVS-TUN模式是如何工做的?负载均衡

用户请求负载均衡服务器,当IP数据包到达负载均衡服务器后,根据算法选择一台真实的服务器,而后经过IP隧道技术将数据包原封不动再次封装,并发送给真实服务器,当这个数据包到达真实服务器之后,真实服务器进行拆包(拆掉第一层的IP包)拿到里面的IP数据包进行处理,而后将结果直接返回给客户端。ide


配置用例工具

@客户端

客户端IP=192.168.80.1  MAC=00:50:56:c0:00:08


@LVS服务器:

LVS服务器VIP=192.168.80.120   必须配置VIP

LVS服务器真实IP=192.168.80.138   MAC=00-0c-29-50-02-b5


@真实服务器:
RS1=192.168.80.135  MAC=00:0c:29:42:53:a9
RS2=192.168.80.136  MAC=00:0c:29:1b:f4:88


@配置LVS服务器

##TUM模式必须添加VIP。
##给LVS服务器添加VIP
ifconfig eno16777736:0 192.168.80.120 netmask 255.255.255.255 broadcast 192.168.80.120 up

##添加转发规则

ipvsadm -A -t 192.168.80.120:8080 -s rr
ipvsadm -a -t 192.168.80.120:8080 -r 192.168.80.135 -i
ipvsadm -a -t 192.168.80.120:8080 -r 192.168.80.136 -i


@配置真实服务器

创建一个脚本lvs_tun_real.sh

./lvs_tun_real.sh start   运行脚本

./lvs_tun_real.sh stop  中止脚本

#!/bin/bash  
#description : start realserver
VIP=192.168.80.120
/etc/rc.d/init.d/functions
case "$1" in
start)
echo " start LVS of REALServer"
modprobe ipip
/sbin/ifconfig tunl0 $VIP netmask 255.255.255.255 broadcast $VIP
echo "1" > /proc/sys/net/ipv4/conf/tunl0/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/tunl0/arp_announce
echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
echo "0" > /proc/sys/net/ipv4/conf/tunl0/rp_filter
echo "0" > /proc/sys/net/ipv4/conf/all/rp_filter
;;
stop)
/sbin/ifconfig tunl0 down
echo "close LVS Directorserver"
echo "0" > /proc/sys/net/ipv4/conf/tunl0/arp_ignore
echo "0" > /proc/sys/net/ipv4/conf/tunl0/arp_announce
echo "0" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" > /proc/sys/net/ipv4/conf/all/arp_announce
echo "1" > /proc/sys/net/ipv4/conf/tunl0/rp_filter
echo "1" > /proc/sys/net/ipv4/conf/all/rp_filter
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac

@下面看抓包工具的截图

其中80.1 到80.120的包为客户端访问LVS服务器VIP的数据包。

其中80.138到80.136的包为LVS服务器 将数据包进行IP隧道封装后从新发给真实服务器的包(发给136)。

其中80.120到80.1的包  为真实服务器136 使用VIP 将处理后的包发送给客户端。



@其中80.1 到80.120的包为客户端访问LVS服务器VIP的数据包。



@其中80.138到80.136的包为LVS服务器 将数据包进行IP隧道封装后从新发给真实服务器的包(发给136)。



@真实服务器80.136收到IP隧道数据包后,进行解包(去掉最外层),拿到里面真实的IP数据包进行处理,而后直接把结果返回给客户端。



@关于设置rp_filter的说明.

当IP隧道数据包到达136服务器后,首先进行拆包,发现目标IP为192.168.80.120(配置在TUN10这个网卡上),可是这个数据包是由192.168.80.136这个网卡接收的,那么系统默认认为这是一个不合法的数据包,故而拒绝之,因此要配置rp_filter 接收这种包。


下面是转的。

工做中曾遇到一个很奇怪的问题,我奉命调查。事情是这样的,有一台双网卡的机器,上面装有Fedora8,运行一个程序。该程序分别在两个网口上都接收多播数据,程序运行是正常的。可是,后来升级系统到Fedora13,发现就出问题了:在运行几秒钟后,第2个网口上就接收不到多播数据了。

    能不能收到多播,取决于交换机是否是往这个网口上转发多播数据。程序在起动的时候,会发一个IGMP的Add Membership的消息,交换机将把这个网口加入多播组。当在其余网口上收到该地址的多播包后,会转至这个网口。其后,为了确认该接收者一直在线,交换机会发送一个IGMP Query消息,接收者反馈一个IGMP Report消息,以确认本身的存在。若是交换机没有收到IGMP Report,则认为该接收者已经断线,就再也不往该网口上转发多播包了。

    用抓包工具定位了一下,发现程序在启动时确实发了Add Membership消息,这是正常的。在接收下来的5秒时间内,程序可以收到多播数据。接着,交换机发来了一条IGMP Query,问题来了,这个Fedora13系统却没有反馈Report。这是很奇怪的。按理说,IGMP属于系统自动完成的协议,无需用户干预;那么按照预期,Linux会自动反馈IGMP Report的。事实上,Feodra8和WinXP系统就是这么作的,都很正常。为何到了Fedora13反而不正常了呢?

    在调查“为何不反馈IGMP Report”的事情上,花了一周时间都没有进展,后来发现其实不至Fedora13,其余的主流linux如Ubuntu10, SUSE14也存在一样的问题。

    查了众多论坛都没有一点提示信息。后来,终于在一个英文网站上扫到了一个信息: rp_filter。后来证实,这个关键词是解决问题的关键。reverse-path filtering,反向过滤技术,系统在接收到一个IP包后,检查该IP是否是合乎要求,不合要求的IP包会被系统丢弃。该技术就称为rp filter。怎么样的包才算不合要求呢?例如,用户在A网口上收到一个IP包,检查其IP为B。而后考查:对于B这个IP,在发送时应该用哪一个网口,“若是在不该该接收到该包的网口上接收到该IP包,则认为该IP包是hacker行为”。

例如:

A: 192.168.8.100

B: (IGMP Query) 10.0.0.1 来自路由器

查找路由表

网卡1为默认路由: 172.17.5.100  172.17.5.1

网卡2            192.168.8.100  192.168.8.1

系统根据路由表,认为10.0.0.1这个IP应该在第一个网卡172.17.5.100上收到,现实的状况是在第二张网卡192.168.8.100上收到了。认为这是不合理的,丢弃该包。致命的问题的,该包是来自路由器的IGMP Query包。

The rp_filter can reject incoming packets if their source address doesn’t match the network interface that they’re arriving on, which helps to prevent IP spoofing. Turning this on, however, has its consequences: If your host has several IP addresses on different interfaces, or if your single interface has multiple IP addresses on it, you’ll find that your kernel may end up rejecting valid traffic. It’s also important to note that even if you do not enable the rp_filter, protection against broadcast spoofing is always on. Also, the protection it provides is only against spoofed internal addresses; external addresses can still be spoofed.. By default, it is disabled.

 

解决方法:

系统配置文件
1. /etc/sysctl.conf
把 net.ipv4.conf.all.rp_filter和 net.ipv4.conf.default.rp_filter设为0便可
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.all.rp_filter = 0
系统启动后,会自动加载这个配置文件,内核会使用这个变量

2. 命令行
显示一个内核变量 sysctl net.ipv4.conf.all.rp_filter
设置一个内核变量 sysctl -w net.ipv4.conf.all.rp_filter=0
设置完后,会更新内核(实时的内存)中的变量的值,但不会修改sysctl.conf的值

3. 使用/proc文件系统
查看 cat /proc/sys/net/ipv4/conf/all/rp_filter
设置 echo "0" >/proc/sys/net/ipv4/conf/all/rp_filter


参考http://www.cnblogs.com/huazi/archive/2013/02/25/2932021.html

参考 http://itoedr.blog.163.com/blog/static/120284297201211695321402

http://www.linuxvirtualserver.org/zh/lvs3.html#7