同样在了解lvs-tun之前了解一些必备的网络知识:
封包:数据要在通讯系统中必须要先经过某些处理,才能在网络当中传递,例如将数据切割为数个区块之后,才能在网络上依照某种通讯协议来传送,这种过程就好像将包裹打包一样,称为分封。算了,这个貌似涉及的内容比较 复杂,改天一起整理一下。
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隧道不能与其他操作系统或路由器互相通讯。它很简单,也很有效。
lb:172.25.67.3 server3 vip:172.25.67.100
rs1:172.25.67.1 server1 vip 172.25.67.100
rs2:172.25.67.2 server2 vip 172.25.67.100
均在同一个网段
配置Load Balance端
ip设置
[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
4: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 52:54:00:ed:6d:9f brd ff:ff:ff:ff:ff:ff
inet 172.25.67.100/24 brd 172.25.67.255 scope global eth2 #vip
inet6 fe80::5054:ff:feed:6d9f/64 scope link
valid_lft forever preferred_lft forever
制作rule规则
[root@server3 ~]# ipvsadm -C
valid_lft forever preferred_lft forever
[root@server3 ~]# ipvsadm -A -t 172.25.67.100:80 -s rr
[root@server3 ~]# ipvsadm -a -t 172.25.67.100:80 -r 172.25.67.1:80 -i
[root@server3 ~]# ipvsadm -a -t 172.25.67.100:80 -r 172.25.67.2:80 -i
[root@server3 ~]# /etc/init.d/ipvsadm save
ipvsadm: Saving IPVS table to /etc/sysconfig/ipvsadm: [确定]
[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.67.100:http rr
-> server1:http Tunnel 1 0 0
-> server2:http Tunnel 1 0 0
[root@server3 ~]# /etc/init.d/ipvsadm start
rs端配置
将两个rs的网关设置成lb的ip 172.25.67.100
加载ipip隧道模块
[root@server2 ~]# modprobe ipip #在加载好ipip模块后就会有默认的tunl0隧道。
注,如果没有在此处手动加载,那么使用ifconfig tunl0 时,会自动加载ipip隧道模块。 使用 ifconfig查看。没有tun0 ,加参数-a 时,查看可以看到tun0
[root@server2 ~]# ip a
3: tunl0: <NOARP> mtu 1480 qdisc noop state DOWN
link/ipip 0.0.0.0 brd 0.0.0.0
添加vip
[root@server2 ~]# ifconfig tunl0 172.25.67.100 netmask 255.255.255.255 up #配置VIP
[root@server2 ~]# 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:55:3e:83 brd ff:ff:ff:ff:ff:ff
inet 172.25.67.2/24 brd 172.25.67.255 scope global eth0
inet6 fe80::5054:ff:fe55:3e83/64 scope link
valid_lft forever preferred_lft forever
3: tunl0: <NOARP,UP,LOWER_UP> mtu 1480 qdisc noqueue state UNKNOWN
link/ipip 0.0.0.0 brd 0.0.0.0
inet 172.25.67.100/32 brd 172.25.67.100 scope global tunl0
开启路由机制
[root@server2 ~]#vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@server2 ~]#sysctl p
关闭ARP转发
[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
[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
server3同上配置
测试
如图