IP隧道(Tunnel)模式(VS-TUN)
原理:互聯網上的大多Internet服務的請求包很短小,而應答包通常很大。那么隧道模式就是,把客戶端發來的數據包,封裝一個新的IP頭標記(僅目的IP)發給RS,RS收到后,先把數據包的頭解開,還原數據包,處理后,直接返回給客戶端,不需要再經過負載均衡器。注意,由於RS需要對負載均衡器發過來的數據包進行還原,所以說必須支持IPTUNNEL協議。所以,在RS的內核中,必須編譯支持IPTUNNEL這個選項
優點:負載均衡器只負責將請求包分發給后端節點服務器,而RS將應答包直接發給用戶。所以,減少了負載均衡器的大量數據流動,負載均衡器不再是系統的瓶頸,就能處理很巨大的請求量,這種方式,一台負載均衡器能夠為很多RS進行分發。而且跑在公網上就能進行不同地域的分發。
缺點:隧道模式的RS節點需要合法IP,這種方式需要所有的服務器支持”IP Tunneling”(IP Encapsulation)協議,服務器可能只局限在部分Linux系統上。
實驗說明:
主機名 | ip | 系統 | 用途 |
---|---|---|---|
client | 192.168.181.100 | mac | 客戶端 |
lvs-server | 192.168.181.133 | centos7.5 | 分發器 |
real-server1 | 192.168.181.129 | centos7.5 | web1 |
real-server2 | 192.168.181.130 | centos7.5 | web2 |
在lvs-server上面
# 添加隧道模塊
[root@lvs-server ~]# modprobe ipip
# 查看時多了一塊網卡
[root@lvs-server ~]# ip a
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:c2:34:dd brd ff:ff:ff:ff:ff:ff
inet 192.168.181.133/24 brd 192.168.181.255 scope global noprefixroute dynamic ens33
3: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000
link/ipip 0.0.0.0 brd 0.0.0.0
# 在新網卡上面添加虛擬ip
[root@lvs-server ~]# ip addr add 192.168.181.200/32 dev tunl0
[root@lvs-server ~]# ip a
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:c2:34:dd brd ff:ff:ff:ff:ff:ff
inet 192.168.181.133/24 brd 192.168.181.255 scope global noprefixroute dynamic ens33
3: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000
link/ipip 0.0.0.0 brd 0.0.0.0
inet 192.168.181.200/24 scope global tunl0
valid_lft forever preferred_lft forever
# 這里我們客戶以看到 tunl0的網卡是DOWN的狀態,現在我們激活它
[root@lvs-server ~]# ip link set up tunl0 # 激活tunl0網卡
[root@lvs-server ~]# ip addr show tunl0
[root@lvs-server ~]# yum install -y ipvsadm
[root@lvs-server ~]# ipvsadm -C
[root@lvs-server ~]# ipvsadm -A -t 192.168.181.200:80 -s rr
[root@lvs-server ~]# ipvsadm -a -t 192.168.181.200:80 -r 192.168.181.129 -i # -i隧道模式
[root@lvs-server ~]# ipvsadm -a -t 192.168.181.200:80 -r 192.168.181.130 -i
[root@lvs-server ~]# ipvsadm -L
real-server上 兩台相同
[root@real-server1 ~]# modprobe ipip
[root@real-server1 ~]# ip addr add 192.168.181.200/32 dev tunl0
[root@real-server1 ~]# ip link set up tunl0
[root@real-server1 ~]# ip addr show
[root@real-server1 ~]# sysctl -a | grep rp_filter # 查看反向檢驗參數,-a表示顯示
[root@real-server1 ~]# sysctl -a | grep rp_filter
net.ipv4.conf.all.arp_filter = 0
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.arp_filter = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.ens33.arp_filter = 0
net.ipv4.conf.ens33.rp_filter = 1
net.ipv4.conf.lo.arp_filter = 0
net.ipv4.conf.lo.rp_filter = 0
net.ipv4.conf.tunl0.arp_filter = 0
net.ipv4.conf.tunl0.rp_filter = 1
[root@real-server1 ~]# sysctl -w net.ipv4.conf.all.rp_filter=0
[root@real-server1 ~]# sysctl -w net.ipv4.conf.lo.rp_filter=0
[root@real-server1 ~]# sysctl -w net.ipv4.conf.ens33.rp_filter=0
[root@real-server1 ~]# sysctl -w net.ipv4.conf.tunl0.rp_filter=0
[root@real-server1 ~]# vim /etc/sysctl.conf
net.ipv4.conf.default.rp_filter = 0
[root@real-server1 ~]# sysctl -p
net.ipv4.conf.default.rp_filter = 0
[root@real-server1 ~]# sysctl -a | grep rp_filter
# 檢查是否全部為0
客戶端測試
[root@client ~]# curl http://172.16.147.100/
nginx1
[root@client ~]# curl http://172.16.147.100/
nginx2
[root@client ~]# curl http://172.16.147.100/
nginx1
[root@client ~]# curl http://172.16.147.100/
nginx2