基于centos6.x环境下GRE隧道的搭建及分析

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于centos6.x环境下GRE隧道的搭建及分析相关的知识,希望对你有一定的参考价值。

一、网络拓扑

技术分享图片

二、环境介绍

所有服务器系统均是centos6.5,内核:2.6.32-431.el6.x86_64

centos1:一张网卡eth1:192.168.10.10,gw:192.168.10.1,仅主机vmnet1

R:两张网卡eth0:192.168.20.1,仅主机vmnet2

       eth1:192.168.10.1,仅主机vmnet1

centos2:两张网卡eth0:192.168.20.10,gw:192.168.20.1,仅主机vmnet2

           eth1:202.100.2.2,仅主机vmnet3

此时centos1(192.168.10.10) ping不通centos2(202.100.2.2)

三、GRE隧道配置

3.1centos1端配置

[[email protected] ~]# modprobe -l |grep ip_gre.ko  ##查看内核模块文件

kernel/net/ipv4/ip_gre.ko

[[email protected] ~]# modprobe ip_gre  ##加载内核模块文件

[[email protected] ~]# lsmod|grep gre

ip_gre          9575  0

ip_tunnel        12693  1 ip_gre

[[email protected] ~]# ip addr show |grep gre

4: gre0: <NOARP> mtu 1476 qdisc noop state DOWN

    link/gre 0.0.0.0 brd 0.0.0.0

5: gretap0: <BROADCAST,MULTICAST> mtu 1476 qdisc noop state DOWN qlen 1000

[[email protected] ~]# service iptables stop ##关闭防火墙

[[email protected] ~]# ip tunnel add tunnel0 mode gre remote 192.168.20.20 local 192.168.10.10 ttl 255

此处可能出现的问题:ioctl: No buffer space available

隧道的名字tunnel0,可能和现有的名字冲突

[[email protected] ~]# ip link set tunnel0 up mtu 1400

[[email protected] ~]# ip addr add 172.16.1.1/30 peer 172.16.1.2/30 dev tunnel0

[[email protected] ~]# ip route add 202.100.2.2/32 dev tunnel0

[[email protected] ~]# ip addr show|grep tunnel0  ##验证gre

9: [email protected]: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1400 qdisc noqueue state UNKNOWN

  link/gre 192.168.10.10 peer 192.168.20.20

inet 172.16.1.1 peer 172.16.1.2/30 scope global tunnel0

[[email protected] ~]# ip route show

202.100.2.2 dev tunnel0  scope link

172.16.1.0/30 dev tunnel0  proto kernel  scope link  src 172.16.1.1

192.168.10.0/24 dev eth1  proto kernel  scope link  src 192.168.10.10

169.254.0.0/16 dev eth0  scope link  metric 1002

169.254.0.0/16 dev eth1  scope link  metric 1003

default via 192.168.10.1 dev eth1

3.2centos2端配置

[[email protected]2 ~]# modprobe -l |grep ip_gre.ko  ##查看内核模块文件

kernel/net/ipv4/ip_gre.ko

[[email protected]2 ~]# modprobe ip_gre  ##加载内核模块文件

[[email protected] ~]# lsmod|grep gre

ip_gre         9575  0

ip_tunnel       12693  1 ip_gre

[[email protected]2 ~]# ip addr show |grep gre

4: gre0: <NOARP> mtu 1476 qdisc noop state DOWN

    link/gre 0.0.0.0 brd 0.0.0.0

5: gretap0: <BROADCAST,MULTICAST> mtu 1476 qdisc noop state DOWN qlen 1000

[[email protected]2 ~]# service iptables stop ##关闭防火墙

[[email protected]2 ~]# ip tunnel add tunnel0 mode gre remote 192.168.10.10 local 192.168.20.20 ttl 255

此处可能出现的问题:ioctl: No buffer space available

隧道的名字tunnel0,可能和现有的名字冲突

[[email protected]2 ~]# ip link set tunnel0 up mtu 1400

[[email protected]2 ~]# ip addr add 172.16.1.2/30 peer 172.16.1.1/30 dev tunnel0

[[email protected] ~]# ip addr show|grep tunnel0  ##验证gre

7: [email protected]: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1400 qdisc noqueue state UNKNOWN

  link/gre 192.168.20.20 peer 192.168.10.10

inet 172.16.1.2 peer 172.16.1.1/30 scope global tunnel0

[[email protected] ~]# ip route show

172.16.1.0/30 dev tunnel0  proto kernel  scope link  src 172.16.1.2 

202.100.2.0/24 dev eth1  proto kernel  scope link  src 202.100.2.2 

192.168.20.0/24 dev eth0  proto kernel  scope link  src 192.168.20.20

169.254.0.0/16 dev eth0  scope link  metric 1002

169.254.0.0/16 dev eth1  scope link  metric 1003

default via 192.168.20.1  dev eth0 

3.3R端配置

[[email protected]2 ~]# service iptables stop ##关闭防火墙

[[email protected]centos2 ~]#sed -i 's#net.ipv4.ip_forward = 0#net.ipv4.ip_forward = 1#g' /etc/sysctl.conf

[[email protected]centos2 ~]#sysctl -p  ##开启内核转发

3.4、设置开机自启脚本

centos1

[[email protected] ~]# vim /etc/init.d/gre

#!/bin/bash

modprobe ip_gre

ip tunnel add tunnel0 mode gre remote 192.168.20.20 local 192.168.10.10 ttl 255

ip link set tunnel0 up mtu 1400

ip addr add 172.16.1.1/30 peer 172.16.1.2/30 dev tunnel0

或者这样建立隧道(二选一)

[[email protected]centos1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-tunnel0

DEVICE=tunnel0

BOOTPROTO=none

ONBOOT=yes

TYPE=GRE

MY_OUTER_IPADDR=192.168.10.10

PEER_OUTER_IPADDR=192.168.20.20

MY_INNER_IPADDR=172.16.1.1

PEER_INNER_IPADDR=172.16.1.2

ip route add 202.100.2.2/32 dev tunnel0 ##这一步很关键

[[email protected] ~]#chmod +x /etc/init.d/gre

[[email protected] ~]# echo '/etc/init.d/gre'>>/etc/rc.local

 

centos2

[[email protected] ~]# vim /etc/init.d/gre

#!/bin/bash

modprobe ip_gre

ip tunnel add tunnel0 mode gre remote 192.168.10.10 local 192.168.20.20 ttl 255

ip link set tunnel0 up mtu 1400

ip addr add 172.16.1.2/30 peer 172.16.1.1/30 dev tunnel0

或者这样建立隧道(二选一)

[[email protected]centos2 ~]# vim /etc/sysconfig/network-scripts/ifcfg-tunnel0

DEVICE=tunnel0

BOOTPROTO=none

ONBOOT=yes

TYPE=GRE

MY_OUTER_IPADDR=192.168.20.20

PEER_OUTER_IPADDR=192.168.10.10

MY_INNER_IPADDR=172.16.1.2

PEER_INNER_IPADDR=172.16.1.1

[[email protected] ~]#chmod +x /etc/init.d/gre

[[email protected]2 ~]# echo '/etc/init.d/gre'>>/etc/rc.local

四、测试连通性

[[email protected] ~]# ping 202.100.2.2

PING 202.100.2.2 (202.100.2.2) 56(84) bytes of data.

64 bytes from 202.100.2.2: icmp_seq=1 ttl=64 time=1.89 ms

64 bytes from 202.100.2.2: icmp_seq=2 ttl=64 time=0.718 ms

^C

--- 202.100.2.2 ping statistics ---

2 packets transmitted, 2 received, 0% packet loss, time 1805ms

rtt min/avg/max/mdev = 0.718/1.308/1.898/0.590 ms

五、深入理解GRE

技术分享图片

以下分析仅是我对gre的理解:  

5.1、gre隧道建立

           这个过程就是双方建立turnel的过程。   
         5.2局域网路由过程
                  主机pc1发送一个源为192.168.10.10,目的为202.100.2.2的包
        5.3封装过程
                  5.3.1、根据内网路由,可能是你的默认路由网关将之路由至192.168.10.1
                 5.3. 2192.168.10.1第一次封装包,增加增加gre包头,说明包的目的地址172.16.1.2 源地址172.16.1.1
                 5.3.3192.168.10.12次封装包,增加公网的包头(否则在公网上无法路由),说明包的目的地址192.168.20.1和源地址192.168.10.1

        5.3.4192.168.10.1把所有到202.100.0.0/24的包,都地址转换为从172.16.1.1出(snat

5.4、公网路由过程

        经过n个路由设备,该包最终路由到192.168.20.1
        5.5拆包过程
                5.5.1B端的路由器检测到是到达自己的ip,就开始拆包
                5.5.2、拆包之后发现有GRE协议,就进一步拆包
                5.5.3、拆包之后发现目的地不是自己的ip、发现自己本地有路由转发,就将至源ip替换为192.168.20.10
       5.6局域网路由转发
               实际上从192.168.20.10出发的,到达目的地为202.100.2.2的包,无需路由,直接转 发202.100.2.2的机器确定是发送给自己的包,就接收。然后进一步处理了。


以上是关于基于centos6.x环境下GRE隧道的搭建及分析的主要内容,如果未能解决你的问题,请参考以下文章

linux搭建GRE隧道

linux 下创建GRE隧道

GRE隧道配置

OpenvSwitch的GRE隧道

GRE over IPSec 配置

交换机在江湖GRE隧道配置keepalive后隧道不up怎么办?