这一篇文章是做了不少功课的。

什么是 Gre 隧道

GRE 隧道是一种 IP-2-IP 的隧道,是通用路由封装协议,可以对某些网路层协议的数据报进行封装,使这些被封装的数据报能够在 IPv4/IPv6 网络中传输。Tunnel 是一个虚拟的点对点的连接,提供了一条通路使封装的数据报文能够在这个通路上传输,并且在一个Tunnel 的两端分别对数据报进行封装及解封装。Linux 上创建 GRE 隧道,需要 ip_gre 内核模块,它是Pv4 隧道的驱动程序。

假设我有2台服务器,想做这两台之间创建 GRE 隧道

  • $server_A_ip 表示服务器A的IP
  • $server_B_ip 服务器B 的内网IP
1
2
3
4
5
6
7
8
9
10
11
# 在 A 机器上执行
# 创建 GRE 协议的 虚拟网络设备, 指定本地和对端 IP
sudo ip link add gretap1 type gretap local $server_a_ip remote $server_b_ip
sudo ip link set dev gretap1 up # 启动该设备
sudo ip addr add dev gretap1 10.1.1.2/24 # 给该设备一个虚拟网络地址 # 在 B 机器上执行
# 创建 GRE 协议的 虚拟网络设备, 指定本地和对端 IP
sudo ip link add gretap1 type gretap local $server_b_ip remote $server_a_ip
sudo ip link set dev gretap1 up # 启动该设备
sudo ip addr add dev gretap1 10.1.1.3/24 # 给该设备一个虚拟网络地址

如果想停止或者删除上述网卡

1
2
ip link set gretap1 down
ip tunnel del gretap1

至此点到点得隧道建立。

什么是 vrrp 协议

VRRP(Virtual Router Redundancy Protocol), 即虚拟路由冗余协议。是实现路由器高可用的容错协议。

即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个 master 和多个 backup, 但在外界看来就像一台一样,构成虚拟路由器,拥有一个虚拟IP(vip),占有这个IP 的 master 实际负责 ARP 相应和转发 IP 数据包, 组中的其它路由器作为备份的角色处于待命状态。 master 会发组播消息,当 backup 在超时时间内收不到 vrrp 包时就认为 master 宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master,保证路由器的高可用。

Keepalived 是什么

Keepalived 是一个基于 VRRP 协议来实现的服务高可用方案,可以利用其来避 大专栏  Gre 隧道与 Keepalived免IP单点故障。

  • 一个经典的案例

一个WEB服务至少会有2台服务器运行 Keepalived,一台为主服务器,一台为备份服务器, 但是对外表现为一个虚拟IP,主服务器会发送特定的消息给备份服务器,当备份服务器收不到这个消息的时候,即主服务器宕机的时候,备份服务器就会接管虚拟IP,继续提供服务,从而保证了高可用性。

怎么玩 Keepalived

  • 安装
1
sudo apt-get install keepalived

之前提到的,我们在 A, B 两台服务器建立起了 GRE 隧道了。 现在我们有一个虚拟的内网IP, 姑且叫做 $virtual_third_ip
接着在 A 服务器上

  • 配置

编辑服务器 A, B 的 /etc/keepalived/keepalived.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
global_defs {
router_id LVS_DEVEL
} vrrp_instance VI_1 {
state MASTER
interface gretap1 # 绑在建立起来的隧道上
virtual_router_id 51
# 优先级别,越高的设备会被弄成主设备, A,B 服务器要有所差别,其他都一样
priority 100 advert_int 1 # 广播时间间隔
authentication { # 验证相关
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
$virtual_third_ip dev eth0
}
}

我们将服务器 A 作为 Master, 服务器 B 当做 Backup, 当服务器 A 需要停机的时候,$virtual_third_ip 就会漂移到服务器 B 上面。 我们两台机器都有相同配置的 Nginx 服务,就可以保障机器出现故障的时候,Nginx 服务丝毫不受影响。

附录

Gre 隧道与 Keepalived的更多相关文章

  1. docke跨主机通信之gre隧道

    GRE简介 GRE可以对网络层的任何协议来进行封装,类似LVS的IPIP协议,在原有的数据报上增加GRE协议数据报.然后在网络上传输,到达对端后,解开GRE数据报头,得到真实的数据报.其中的mac地址 ...

  2. linux 下创建GRE隧道

    其他国家的互联网如同一个孤岛.要想访问国外网站异常的缓慢,甚至被和谐了.可以建立一条隧道来避免这种情况,下面说说GRE隧道如何建立. 1. GRE介绍 GRE隧道是一种IP-over-IP的隧道,是通 ...

  3. 内部办公网与IDC机房的GRE隧道配置实践

    背景 公司内网与机房服务器为了实现用内网IP通信的功能,故使用了linux的IP gre隧道的方式.使得公司内部可以直接通过路由直连的方式访问机房服务器. 拓扑图如下: 注:拓扑中的外网IP为虚构的I ...

  4. vxlan中vtep角色,以及通过GRE隧道进行流镜像

    1. 交换机上建立gre隧道,对端ip为ip12. 交换机上报gre隧道的OF逻辑端口port id,这里gre tunnel的id实际就是OF逻辑端口id3. 控制器建立流ipflow1的镜像配置, ...

  5. 检测2个公网IP的GRE隧道是否通的方法,使用PPTP拨号检测。

    检测2个公网IP的GRE隧道是否通的方法,使用PPTP拨号检测. 因为PPTP是建立在GRE隧道基础上的. PPTP 防火墙开放 TCP 1723防火墙开放 IP protocol 47,即GRENA ...

  6. VPS(Centos6)连ROS做GRE隧道完整版

    国内徐庄1.1.1.1     内网地址192.168.0.0/16  gre隧道适配器地址 172.16.0.45 国外2.2.2.2内网地址无 gre隧道地址172.16.0.46 国外 cent ...

  7. linux gre隧道创建

    目录 linux gre隧道创建 实验环境 实验目的 实验步骤 1.在host A(10.10.10.47)上面操作 2.在host B(192.168.0.118)上面操作 实验结果 还原实验环境 ...

  8. ROS+gre over ipv6,在ipv6的基础上建立GRE隧道

    感谢群众大神 @镜花水月全程技术支持.感谢! 环境: 1.阿里云华北5,申请ipv6测试,申请ECS带ipv6公网ip 2.为了便于测试便捷,在vultr创建2.5美元的vps,带ipv6 对了,测试 ...

  9. Open vSwitch系列实验(二):Open vSwitch的GRE隧道实验网络

    一.实验目的 了解GRE协议及原理 理解 Open vSwitch如何配置GRE隧道 二.实验原理 Open vSwitch创建GRE原理很简单,就是把对GRE头和外部IP头的一些操作从原来的代码中抽 ...

随机推荐

  1. linux mysql备份数据库

    $ mysqldump -u root -p 数据库名称 > beifen.sql 恢复 source beifen.sql

  2. pix2pix-tf官方文档

    # 对抗网络的基本思想 # 假设有一种概率分布M,它相对于我们是一个黑盒子.为了了解这个黑盒子中的东西是什么,我们构建了两个东西G和D, # G是另一种我们完全知道的概率分布,D用来区分一个事件是由黑 ...

  3. 1)PHP基础介绍

    1.php基础介绍: Perssonal Home Page  ====>PHP 2.应用范围 · web服务器脚本语言 命令行脚本语言     应用程序图形界面 3.PHP运行环境 PHP解释 ...

  4. 爬虫笔记(二)——浏览器的模拟(Headers属性)

    有的时候,我们无法爬取一些网页,会出现403错误,因为这些网页为了防止别人恶意采集其信息所以进行了一些反爬虫的设置.那么如果我们向爬取这些网页的信息,应该怎么办呢? 可以设置一些Headers信息,模 ...

  5. Opencv笔记(八)——图像上的算数运算

    学习目标: 学习图像上的算术运算,加法,减法,位运算等. 学习函数cv2.add(),cv2.addWeighted() 等. 一.图像的加法 你可以使用函数 cv2.add() 将两幅图像进行加法运 ...

  6. 再来看看Java8的新特征——lambda表达式

    什么是lambda表达式? 可以把Lambda表达式理解为简洁地表示可传递的匿名函数的一种方式:它没有名称,但它有参数列表.函数主体.返回类型,可能还有一个可以抛出的异常列表. 比如说new一个Thr ...

  7. uboot 编译

    . 解包u-boot源码包(u-boot-2016.07) . 配置交叉编译器 根据内核编译里的步骤配置 . 编译uboot yum install ncurses* // ncurses是个终端的图 ...

  8. log4j2.xml 配置

    动态生成日志, 日志路径: log4j2.xml 配置如下: <?xml version="1.0" encoding="UTF-8"?> < ...

  9. 在Linux生成公钥后,使用git拉代码仍然需要密码的问题

    一顿回车生成公钥后,用git拉代码还是需要输入密码 原因比较简单,在于.ssh 文件夹 及 authorized_keys文件的权限问题,全部修改为 700 即可,用下面命令 chmod -R 700 ...

  10. Struts2加载自定义库注意事项

    新建Struts2项目,添加Struts2的jar包时,往往通过导入自定义库的方式,导入自定义库时,有个地方必须要设置,否则项目无法正常执行,如图所示: 必须要按照上述方式对自定义库进行加载!