设为首页 收藏本站
查看: 1258|回复: 0

[经验分享] Linux下的GRE隧道及其路由转发

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-4-27 09:14:30 | 显示全部楼层 |阅读模式
   隧道,字面上来看就是一条通道,这条通道由点到点,独立与其他。linux下的隧道其他的了解不深,单独写下最近搭建过的gre隧道和路由转发功能实现。        先说一下隧道的基本概念:
        一种技术(协议)或者策略的两个或多个子网穿过另一种技术(协议)或者策略的网络实现互联,称之为overlay topology,这一技术是电信技术的永恒主题之一。
     电信技术在发展,多种网络技术并存,一种技术的网络孤岛可能需要穿过另一种技术的网络实现互联,这种情况如果发生在高层协议的PDU封装于低层协议PDU中时通常称之为复用,特别地三层PDU穿过二层网络地技术称为租用链路或虚电路;而如果穿越发生在一种协议PDU封装在同一层协议的PDU中,或者封装在高层协议的PDU中时,人们通常称之为隧道。
         隧道提供了一种某一特定网络技术的PDU穿过不具备该技术转发能力的网络的手段,如组播数据包穿过不支持组播的网络;另一种情况是有时因为管理策略的原因,一个管理者(策略)的子网不能通过和另一个管理者(策略)的网络互联而连接,而是要穿过另一个管理者(策略)的网络实现连接,这就是所谓的VPN(Virtual Private Networks),不管是L2 VPN还是L3 VPN都需要利用隧道技术实现。因此隧道某种意义上可以概括为穿越不同的网络的技术,不同既可以是技术方面的,也可以是管理策略方面的。

隧道可以作为一个虚拟接口来实现。隧道接口并不指定特定的“乘客”或“传输”协议连接,而是一种结构,可以实现任何标准点到点封装的服务。由于隧道是点到点连接,因此对每个连接必须配置一个单独的隧道。
       GRE(通用路由协议封装)工作在三层,即IP层。它的工作方式很简单,看看数据包结构能了解大概。


QQ图片20160427091417.png
      在接收到走gre隧道的包(不一定是IP包)之后,将这个包加上GRE的包头,然后再借助对外的网络进行通信。

现场环境:
两台linux机器作为GRE隧道路由器,其中172开头的内网已互相连通,10与20开头的外网不能通
A机器:eth1:10.10.1.1         
                bond0:172.19.1.1   
B机器:eth1:20.10.1.1         
                bond0:172.19.1.2     
在做完隧道后,实现10.10.1.1网段与20.10.1.1网连通。


1、在两台LINUX开通路由转发,为等下的路由功能做准备:
1
2
3
vim /etc/sysctl.conf
修改net.ipv4.ip_forward=0 修改成1
sysctl -p




2、建立隧道(A机器上):
1
2
3
4
5
6
7
8
9
modprobe ip_gre
ip tunnel add My_Tunnel mode gre remote 172.19.1.2 local 172.19.1.1
# My_Tunnel改为你要搭建的隧道名,local后面添加的是本机器的内网IP。 remote为对端内网的IP
,这两个要先确认能互通。
Ip link set  My_Tunnel up
Ip addr add 192.168.8.1 peer 192.168.8.11 dev My_Tunnel
#My_Tunnel需要修改(下面的TLX_DD都需修改),设定本机隧道的IP 192.168.8.1,对端的IP为192.168.8.11。
route add -net 20.10.1.0 netmask 255.255.255.0 dev My_Tunnel gw 192.168.8.1
#设置去往20.10.1.0网段默认的路由通过隧道走




注意:两台机到这里配完隧道,两边的隧道ip是要能ping通的,不通的话先确认remote的ip
和local ip能相互ping通。

step3:配置网络转发(A机器)
1
2
3
4
5
6
7
8
9
10
11
12
/sbin/iptables -t nat -A POSTROUTING -o eth1 -s 192.168.8.11 -j MASQUERADE
#将对端过来的192.168.8.11源地址nat转换成eth1上的地址
/sbin/iptables -A FORWARD -s 192.168.8.11 -o eth1 -j ACCEPT
#开启对源地址192.168.8.11出口为eth1的转发功能

/sbin/iptables -t nat -A POSTROUTING  -o  My_Tunnel  -s 10.10.1.0/24 -j MASQUERADE
#将源地址10.10.1.0网段的包nat成My_tunnel的地址即为192.168.8.1
/sbin/iptables  -A FORWARD  -s 10.10.1.0/24  -o  My_Tunnel  -j ACCEPT
#开启转发源地址10.10.1.0网段的转发

然后在10.10.1.0网段的机器上把去往20网段的机器路由配成A就行了
route add -net 20.10.1.0 netmask 255.255.255.0  gw 10.10.1.1




在B机器上做相同格式的操作。整个隧道路由就搭建成功了。

不过说实话,这种需求是不是直接nat转发就行了,需要配隧道这么麻烦吗?

  解决GRE隧道的问题:
        1、GRE是将一个数据包封装到另一个数据包中,因此你可能会遇到GRE的数据报大于网络接口所设定的数据包最大尺寸的情况。解决这种问题的方法是在隧道接口上配置ip tcp adjust-mss 1436。另外,虽然GRE并不支持加密,但是你可以通过tunnel key命令在隧道的两头各设置一个密钥。这个密钥其实就是一个明文的密码。或者使用gre over ipsec,那样就比较复杂了再另说。
      2、GRE隧道没有状态控制,可能隧道的一端已经关闭,而另一端仍然开启。这一问题的解决方案就是在隧道两端开启keepalive数据包。它可以让隧道一端定时向另一端发送keepalive数据,确认端口保持开启状态。如果隧道的某一端没有按时收到keepalive数据,那么这一侧的隧道端口 也会关闭。



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-209382-1-1.html 上篇帖子: ubuntu 12.04(64位)下搭建android2.3/android4.0开发环境 下篇帖子: 在UbuntuKylin16.04中安装JDK环境 Linux
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表