Linux下的GRE隧道及其路由转发

隧道,字面上来看就是一条通道,这条通道由点到点,独立与其他。linux下的隧道其他的了解不深,单独写下最近搭建过的gre隧道和路由转发功能实现。

先说一下隧道的基本概念:

一种技术(协议)或者策略的两个或多个子网穿过另一种技术(协议)或者策略的网络实现互联,称之为overlay topology,这一技术是电信技术的永恒主题之一。
     电信技术在发展,多种网络技术并存,一种技术的网络孤岛可能需要穿过另一种技术的网络实现互联,这种情况如果发生在高层协议的PDU封装于低层协议PDU中时通常称之为复用,特别地三层PDU穿过二层网络地技术称为租用链路或虚电路;而如果穿越发生在一种协议PDU封装在同一层协议的PDU中,或者封装在高层协议的PDU中时,人们通常称之为隧道。
         隧道提供了一种某一特定网络技术的PDU穿过不具备该技术转发能力的网络的手段,如组播数据包穿过不支持组播的网络;另一种情况是有时因为管理策略的原因,一个管理者(策略)的子网不能通过和另一个管理者(策略)的网络互联而连接,而是要穿过另一个管理者(策略)的网络实现连接,这就是所谓的VPN(Virtual Private Networks),不管是L2 VPN还是L3 VPN都需要利用隧道技术实现。因此隧道某种意义上可以概括为穿越不同的网络的技术,不同既可以是技术方面的,也可以是管理策略方面的。

隧道可以作为一个虚拟接口来实现。隧道接口并不指定特定的“乘客”或“传输”协议连接,而是一种结构,可以实现任何标准点到点封装的服务。由于隧道是点到点连接,因此对每个连接必须配置一个单独的隧道。

GRE(通用路由协议封装)工作在三层,即IP层。它的工作方式很简单,看看数据包结构能了解大概。

在接收到走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开通路由转发,为等下的路由功能做准备:

vim /etc/sysctl.conf
修改net.ipv4.ip_forward=0 修改成1
sysctl -p

2、建立隧道(A机器上):

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机器)

/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数据,那么这一侧的隧道端口 也会关闭。

参考:http://blog.sina.com.cn/s/blog_4fad46a801015wto.html

http://www.server110.com/linux/201310/2242.html

http://www.server110.com/linux/201309/1417.html

http://blog.163.com/[email protected]/blog/static/33166229200981954962/

时间: 2024-12-26 14:33:43

Linux下的GRE隧道及其路由转发的相关文章

linux 下创建GRE隧道

GRE隧道是一种IP-over-IP的隧道,是通用路由封装协议,可以对某些网路层协议的数据报进行封装,使这些被封装的数据报能够在IPv4/IPv6 网络中传输. Tunnel 是一个虚拟的点对点的连接,提供了一条通路使封装的数据报文能够在这个通路上传输,并且在一个Tunnel 的两端分别对数据报进行封装及解封装. 一个X协议的报文要想穿越IP网络在Tunnel中传输,必须要经过加封装与解封装两个过程. 要在Linux上创建GRE隧道,需要ip_gre内核模块,它是GRE通过IPv4隧道的驱动程序

linux的搭建gre隧道

一.准备 VMware Workstation 2台CentOS虚拟机 1.GRE介绍 GRE隧道是一种IP-over-IP的隧道,是通用路由封装协议,可以对某些网路层协议的数据报进行封装,使这些被封装的数据报能够在IPv4/IPv6 网络中传输.Tunnel 是一个虚拟的点对点的连接,提供了一条通路使封装的数据报文能够在这个通路上传输,并且在一个Tunnel 的两端分别对数据报进行封装及解封装. 一个X协议的报文要想穿越IP网络在Tunnel中传输,必须要经过加封装与解封装两个过程. 2.地址

Linux下使用Rinetd来实现端口转发

Linux下端口转发一般都使用iptables来实现,使用iptables可以很容易将TCP和UDP端口从防火墙转发到内部主机上.但是如果需要将流量从专用地址转发到不在您当前网络上的机器上,可尝试另一个应用层端口转发程序Rinetd.Rinetd短小.高效,配置起来比iptables也简单很多. Rinetd是为在一个Unix和Linux操作系统中为重定向传输控制协议(TCP)连接的一个工具.Rinetd是单一过程的服务器,它处理任何数量的连接到在配置文件etc/rinetd中指定的地址/端口对

linux搭建GRE隧道

GRE介绍 GRE隧道是一种IP-over-IP的隧道,是通用路由封装协议,可以对某些网路层协议的数据报进行封装,使这些被封装的数据报能够在IPv4/IPv6 网络中传输.Tunnel 是一个虚拟的点对点的连接,提供了一条通路使封装的数据报文能够在这个通路上传输,并且在一个Tunnel 的两端分别对数据报进行封装及解封装. 一个X协议的报文要想穿越IP网络在Tunnel中传输,必须要经过加封装与解封装两个过程. 相关配置 1.加载ip_gre模块,开通转发 要在Linux上创建GRE隧道,需要i

linux下打开关闭数据包转发

Linux下默认是禁止数据包转发的,但在某些特殊场合需要使用这一功能,所谓转发即当主机拥有多于一块的网卡时,其中一块收到数据包,根据数据包的目的ip地址将包发往本机另一网卡,该网卡根据路由表继续发送数据包.这通常就是路由器所要实现的功能. 使能数据转发功能: echo 1 > /proc/sys/net/ipv4/ip_forward 禁止数据转发功能: echo 0 > /proc/sys/net/ipv4/ip_forward 版权声明:本文为博主原创文章,未经博主允许不得转载.

公司与机房的GRE隧道配置实例

背景: 背景:         我们公司内网与机房服务器为了实现用内网IP通信的功能,故使用了linux的IP gre隧道的方式.使得公司内部可以直接通过路由直连的方式访问机房服务器. 拓扑图如下: 注:拓扑中的外网IP为虚构的IP. 可以看到,公司和机房的服务器上各有一个内网IP和外部IP.gre隧道的原理就是把两台服务器的外网IP进行绑定,在两个外网IP直接建立一条隧道tunnel2.tunnel2对服务器看来,就像一个网口,直连着隧道的另一边. 这里给tunnel配置一个新的IP段:172

debian 7上建立GRE隧道

1,GRE,即通用路由封装协议,GRE隧道是一种IP-over-IP的隧道,建立虚拟的点对点的连接,对通过隧道的某些网路层协议的数据报进行封装,使这些被封装的数据报能够在IPv4/IPv6 网络中传输,在Tunnel 的两端分别对数据报进行封装及解封装. 要在Linux上创建GRE隧道,需要ip_gre内核模块,它是GRE通过IPv4隧道的驱动程序. 2,搭建(平台debian 7 64位) HOST A: 139.162.24.229 HOST B: 106.187.53.161 HOST A

[转]两台linux建立GRE隧道

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://333234.blog.51cto.com/323234/931805 1.拓扑图: 备注:因为应用原因,需要在linux2上添加一个公网地址,并且在中间路由设备不受控制的情况下,Linux1能访问到linux2上面的公网地址. 2.基本接口配置: linux1:192.168.10.1/24 linux2:192.168.20.2/24 R1: interface FastEt

linux下DNS主从复制,view视图,转发,子域授权

我们知道相同网段内各网络设备之间是基于mac通信,而跨网络的不同主机之间是基于IP地址通信.随着世界主机数量爆炸式的增长,对于记住数目众多IP和想访问未知对方IP的主机成为一个痛点.通过基于人们熟知的文字访问主机应运而生. DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串.通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析). DNS是一项