1. 程式人生 > >基於centos6.x環境下GRE隧道的搭建及分析

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

gre 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端配置

[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

四、測試連通性

[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

五、深入理解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隧道的搭建及分析