【第一、需求描述】
     办公网和IDC两个局域网(or,任意两个不同局域网),相互隔离。但是在日常运维、研发过程中,需要在办公网访问IDC网络。如果都通过公网ip绕,既不方便,也不安全。如果拉专线,是最稳定可靠的办法。但是作为技术屌丝,想为公司省点钱(这也可以看作是技术价值的一部分),所以打算使用其他方案(当然是免费的方案,或者这样说,使用已有资源的方案。服务器当然也需要花钱的,但是你可以使用已有服务器来完成这个方案)解决这个需求。

【第二、背景介绍】
     办公网有lan192.168.1.0/24,并通过固定的公网IP上网;
     IDC有lan10.1.1.0/24,并有多个公网ip,两者通过公网ip互联
     这就遇到问题:办公网怎样能直接访问IDC的内网,至少普通用户看起来是可以直接访问机房的内网的。你让每个用户都拨×××?很悲催,还不好管理。
     这里有介绍两个方案: 
          1、 点到端的×××方案(架设成功之后,你可以设置为端到端的方案),之前写过一篇文章,具体可以看《创业公司办公网络安全稳定访问机房网络方案1:by×××》http://h2ofly.blog.51cto.com/6834926/1529888
          2、GRE方案。如果公司有多余的固定的公网ip或者路由器本身支持GRE,建议使用本方案。why?不解释,哈哈。你可以对比、再使用两个方案之后就有感觉了。
    
【第三、方案实施】
说了这么多,实际操作下印象就更深了
办公网路由器(linux服务器实现):局域网ip:192.168.1.254,公网ip180.1.1.1 配置

cat /usr/local/admin/gre.sh#并把改脚本加入开机启动

#!/bin/bash
modprobe ip_gre#加载gre模块
ip tunnel add office mode gre remote 110.2.2.2 local 180.1.1.1 ttl 255#建立tunnel名字叫office的device(可自定义),使用gre mode。指定远端的ip是110.2.2.2,本地ip是180.1.1.1。这里为了提升安全性,你可以配置iptables,公网ip只接收来自110.2.2.2的包,其他的都drop掉。
ip link set office up#启动device office 
ip link set office up mtu 1500#设置mtu为1500
ip addr add 192.192.192.2/24 dev office #为office添加ip192.192.192.2
echo 1 > /proc/sys/net/ipv4/ip_forward #让服务器支持转发
ip route add 10.1.1.0/24 dev office #添加路由,含义是:到10.1.1.0/24的包,由office设备负责转发
iptables -t nat -A POSTROUTING -d 10.1.1.0/24 -j SNAT --to 192.192.192.2#否则192.168.1.x等机器访问10.1.1.x网段不通

IDC路由器(linux服务器实现):局域网ip:10.1.1.1,公网ip110.2.2.2配置
cat /usr/local/admin/gre.sh#并把改脚本加入开机启动

#!/bin/bash
modprobe ip_gre
ip tunnel add office mode gre remote 180.1.1.1 local 110.2.2.2 ttl 255
ip link set office up
ip link set office up mtu 1500
ip addr add 192.192.192.1/24 dev office#为office添加ip192.192.192.1
echo 1 > /proc/sys/net/ipv4/ip_forward
ip route add 192.168.1.0/24 dev office
iptables -t nat -A POSTROUTING -s 192.192.192.2 -d 10.1.0.0/16 -j SNAT --to 10.1.1.1#否则192.168.1.X等机器访问10.1.1.x网段不通
iptables -A FORWARD -s 192.192.192.2 -m state --state NEW -m tcp -p tcp --dport 3306 -j DROP #禁止直接访问线上的3306,防止内网被破



注:为了预防偶然因数gre turnel断掉,你可以自己研究监控脚本。在检测到网络不同的时候,再运行这个脚本(运行之间请注意device office是否已存在等),这里就不详细介绍了。请自己动手。
【第四、测试效果】 

两个局域网(办公网-IDC)安全互通方案2:by GRE and  linux server&深入理解GRE_IDC

两个局域网(办公网-IDC)安全互通方案2:by GRE and  linux server&深入理解GRE_创业公司_02

【第五、深入理解GRE】
     操作之后,需要对背景和理论更加熟悉才能在遇到异常的时候才能处理的游刃有余。
     GRE(通用路由协议封装)协议,由Cisco和Net-smiths等公司于1994年提交给IETF,它对部分网络层协议(ip)的数据报进行封装。它规定了如何用一种网络协议去封装另一种网络协议,很多网络设备都支持该协议。说得直白点,就是gre将普通的包(如ip包)封装了,又安装普通的ip包的路由方式进行路由,相当于ip包外面再封装一层gre包。在本例子中,在gre包外围实际上又有一层公网的ip包。

     GRE使用tunnel(隧道)技术,数据报在tunnel的两端封装,并在这个通路上传输,到另外一端的时候解封装。你可以认为tunnel是一个虚拟的点对点的连接。(实际PointToPoint连接之后,加上路由协议及nat技术,就可以把两个隔绝的局域网连接在一起,就实现了NetToNet的互联。)
     一般gre turnel是在多个网络设备(一般为路由器)之间建立。因为linux服务具备路由转发功能,所以当您缺少专业的路由设备的时候,可使用linux服务器实现gre turnel的建立,这也说明linux的强大啊(实际上巨大多数网络设备都使用unix或linux系统) 

两个局域网(办公网-IDC)安全互通方案2:by GRE and  linux server&深入理解GRE_创业公司_03 

我对gre的理解如下:
          (0)gre的turnel的打通
               1、 这个过程就是双方建立turnel的过程。   
          (1)局域网路由过程
          1、主机A发送一个源为192.168.1.2,目的为10.1.1.2的包
          (2)封装过程
          1、根据内网路由,可能是你的默认路由网关将之路由至192.168.1.254
          2、192.168.1.254第一次封装包,增加增加gre包头,说明包的目的地址192.192.192.1和源地址192.192.192.2。
          3、192.168.1.254第2次封装包,增加公网的包头(否则在公网上无法路由),说明包的目的地址110.2.2.2和源地址180.1.1.1。

           4、192.168.1.254把所有到10.1.1.0/24的包,都地址转换为从192.192.192.2出(snat)

          (3)公网路由过程
          1、经过n个路由设备,该包最终路由到110.2.2.2
          (4)拆包过程
          1、B端的路由器检测到是到达自己的ip,就开始拆包
          2、拆包之后发现有GRE协议,就进一步拆包
          3、拆包之后发现目的地不是自己的内网ip、发现自己本地做了snat,就将至源ip替换为10.1.1.1
          (5)局域网路由
          1、实际上从10.1.1.1出发的,到达目的地为10.1.1.2的包,无需路由,直接在局域网内广播。10.1.1.2的机器确定是发送给自己的包,就接收。然后进一步处理了。