基于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.1、centos1端配置
[[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.2、centos2端配置
[[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.3、R端配置
[[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. 2、192.168.10.1第一次封装包,增加增加gre包头,说明包的目的地址172.16.1.2和 源地址172.16.1.1。
5.3.3、192.168.10.1第2次封装包,增加公网的包头(否则在公网上无法路由),说明包的目的地址192.168.20.1和源地址192.168.10.1。
5.3.4、192.168.10.1把所有到202.100.0.0/24的包,都地址转换为从172.16.1.1出(snat)
5.4、公网路由过程
经过n个路由设备,该包最终路由到192.168.20.1
5.5、拆包过程
5.5.1、B端的路由器检测到是到达自己的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隧道的搭建及分析的主要内容,如果未能解决你的问题,请参考以下文章