基於centos6.x環境下GRE隧道的搭建及分析

1、網絡拓撲vim

gre隧道.jpg

2、環境介紹centos

全部服務器系統均是centos6.5,內核:2.6.32-431.el6.x86_64bash

centos1:一張網卡eth1:192.168.10.10,gw:192.168.10.1,僅主機vmnet1服務器

R:兩張網卡eth0:192.168.20.1,僅主機vmnet2網絡

       eth1:192.168.10.1,僅主機vmnet1ide

centos2:兩張網卡eth0:192.168.20.10,gw:192.168.20.1,僅主機vmnet2oop

           eth1:202.100.2.2,僅主機vmnet3測試

此時centos1(192.168.10.10) ping不通centos2(202.100.2.2)spa

3、GRE隧道配置blog

3.1centos1端配置

[root@centos1 ~]# modprobe -l |grep ip_gre.ko  ##查看內核模塊文件

kernel/net/ipv4/ip_gre.ko

[root@centos1 ~]# modprobe ip_gre  ##加載內核模塊文件

[root@centos1 ~]# lsmod|grep gre

ip_gre          9575  0

ip_tunnel        12693  1 ip_gre

[root@centos1 ~]# 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

[root@centos1 ~]# service iptables stop ##關閉防火牆

[root@centos1 ~]# ip tunnel add tunnel0 mode gre remote 192.168.20.20 local 192.168.10.10 ttl 255

此處可能出現的問題:ioctl: No buffer space available

隧道的名字tunnel0,可能和現有的名字衝突

[root@centos1 ~]# ip link set tunnel0 up mtu 1400

[root@centos1 ~]# ip addr add 172.16.1.1/30 peer 172.16.1.2/30 dev tunnel0

[root@centos1 ~]# ip route add 202.100.2.2/32 dev tunnel0

[root@centos1 ~]# ip addr show|grep tunnel0  ##驗證gre

9: tunnel0@NONE: <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

[root@centos1 ~]# 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端配置

[root@centos2 ~]# modprobe -l |grep ip_gre.ko  ##查看內核模塊文件

kernel/net/ipv4/ip_gre.ko

[root@centos2 ~]# modprobe ip_gre  ##加載內核模塊文件

[root@centos1 ~]# lsmod|grep gre

ip_gre         9575  0

ip_tunnel       12693  1 ip_gre

[root@centos2 ~]# 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

[root@centos2 ~]# service iptables stop ##關閉防火牆

[root@centos2 ~]# ip tunnel add tunnel0 mode gre remote 192.168.10.10 local 192.168.20.20 ttl 255

此處可能出現的問題:ioctl: No buffer space available

隧道的名字tunnel0,可能和現有的名字衝突

[root@centos2 ~]# ip link set tunnel0 up mtu 1400

[root@centos2 ~]# ip addr add 172.16.1.2/30 peer 172.16.1.1/30 dev tunnel0

[root@centos1 ~]# ip addr show|grep tunnel0  ##驗證gre

7: tunnel0@NONE: <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

[root@centos1 ~]# 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端配置

[root@centos2 ~]# service iptables stop ##關閉防火牆

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

[root@centos2 ~]#sysctl -p  ##開啓內核轉發

3.4、設置開機自啓腳本

centos1

[root@centos1 ~]# 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

或者這樣創建隧道(二選一)

[root@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 ##這一步很關鍵

[root@centos1 ~]#chmod +x /etc/init.d/gre

[root@centos1 ~]# echo '/etc/init.d/gre'>>/etc/rc.local

 

centos2

[root@centos2 ~]# 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

或者這樣創建隧道(二選一)

[root@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

[root@centos2 ~]#chmod +x /etc/init.d/gre

[root@centos2 ~]# echo '/etc/init.d/gre'>>/etc/rc.local

4、測試連通性

[root@centos1 ~]# 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

5、深刻理解GRE

gre隧道數據.jpg

如下分析僅是我對gre的理解:  

5.一、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.四、公網路由過程

        通過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的機器肯定是發送給本身的包,就接收。而後進一步處理了。

相關文章
相關標籤/搜索