精华内容
下载资源
问答
  • GRE tunnel

    2012-11-26 19:07:48
    GRE(Generic Routing Encapsulation,通用路由封装)隧道已经广泛应用了很长一段时间,GRE首先由Cisco公司提出,目的是提供IP网络承载其他被路由协议。某些网络管理员为了降低其网络核心的管理开销,将除IP外所有...
  • GRE TUNNEL

    2018-08-23 10:29:00
    我以前写过一篇介绍 tunnel 的文章,只是做了大体的介绍。里面多数 tunnel 是很容易理解的,因为它们多是一对一的,换句话说,是直接从一端到另一端。比如 IPv6 over IPv4 的 tunnel,也就是 SIT,它的原理如下图所...

    我以前写过一篇 介绍 tunnel 的文章 ,只是做了大体的介绍。里面多数 tunnel 是很容易理解的,因为它们多是一对一的,换句话说,是直接从一端到另一端。比如 IPv6 over IPv4 的 tunnel,也就是 SIT,它的原理如下图所示:

    显然,除了端点的 host A 和 host B之外,中间经过的任何设备都是看不到里面的 IPv6 的头,对于它们来说,经过 sit 发出的包和其它的 IPv4 的包没有任何区别。

    GRE tunnel 却不一样了,它的原理从根本上和 sit,ipip 这样的 tunnel 就不一样。除了外层的 IP 头和内层的 IP 头之间多了一个 GRE 头之外,它最大的不同是, tunnel 不是建立在最终的 host 上,而是在中间的 router 上 !换句话说,对于端点 host A 和 host B 来说,该 tunnel 是透明的(对比上面的 sit tunnel)。这是网上很多教程里没有直接告诉你的。理解这一点非常关键,正是因为它这么设计的,所以它才能解决 ipip tunnel 解决不了的问题。

    所以,经过 GRE tunnel 发送的包(从 host A 发送到 host B)大体过程是这样子的(仍然借用了 LARTC 中的例子 ):

    我们可以看出,从 host A 发出的包其实就是一个很普通的 IP 包,除了目的地址不直接可达外。该 GRE tunnel 的一端是建立在 router A上,另一段是建立在 router B上,所以添加外部的 IP 头是在 router A 上完成的,而去掉外面的 IP 头是在 router B上完成的,两个端点的 host 上几乎什么都不用做(除了配置路由,把发送到 10.0.2.0 的包路由到 router A)!

    这么设计的好处也就很容易看出来了,ipip tunnel 是端对端的,通信也就只能是点对点的,而 GRE tunnel 却可以进行多播。

    现在让我们看看Linux内核是怎么实现的,我们必须假设 router A 和 B 上都是运行的 Linux,而 host A 和 B上运行什么是无所谓的。

    发送过程是很简单的,因为 router A 上配置了一条路由规则,凡是发往 10.0.2.0 网络的包都要经过 netb 这个 tunnel 设备,在内核中经过 forward 之后就最终到达这个 GRE tunnel 设备的 ndo_start_xmit(),也就是 ipgre_tunnel_xmit() 函数。这个函数所做的事情无非就是通过 tunnel 的 header_ops 构造一个新的头,并把对应的外部 IP 地址填进去,最后发送出去。

    稍微难理解的是接收过程,即 router B 上面进行的操作。这里需要指出的一点是,GRE tunnel 自己定义了一个新的 IP proto,也就是 IPPROTO_GRE。当 router B 收到从 router A 过来的这个包时,它暂时还不知道这个是 GRE 的包,它首先会把它当作普通的 IP 包处理。因为外部的 IP 头的目的地址是该路由器的地址,所以它自己会接收这个包,把它交给上层,到了 IP 层之后才发现这个包不是 TCP,UDP,而是 GRE,这时内核会转交给 GRE 模块处理。

    GRE 模块注册了一个 hook:

    C:
    1. static const struct gre_protocol ipgre_protocol = {
    2.         . handler     = ipgre_rcv,
    3.         . err_handler = ipgre_err,
    4. } ;

     

    所以真正处理这个包的函数是 ipgre_rcv() 。ipgre_rcv() 所做的工作是:通过外层IP 头找到对应的 tunnel,然后剥去外层 IP 头,把这个“新的”包重新交给 IP 栈去处理,像接收到普通 IP 包一样。到了这里,“新的”包处理和其它普通的 IP 包已经没有什么两样了:根据 IP 头中目的地址转发给相应的 host。注意:这里我所谓的“新的”包其实并不新,内核用的还是同一个copy,只是skbuff 里相应的指针变了。

    以上就是Linux 内核对 GRE tunnel 的整个处理过程。另外,GRE 的头如下所示(图片来自 这里 ):

    IP header in GRE tunnel

    GRE header

    转自:http://www.tuicool.com/articles/VNzY7n

    转载于:https://www.cnblogs.com/qiaoyanlin/p/9522256.html

    展开全文
  • gre tunnel

    2015-09-04 19:17:00
    http://searchenterprisewan.techtarget.com/tip/GRE-tunnel-vs-IPsec-tunnel-What-is-the-difference Encapsulating a packet for secure transportation on the network can be done using either GRE or IPsec p...

    http://searchenterprisewan.techtarget.com/tip/GRE-tunnel-vs-IPsec-tunnel-What-is-the-difference

    Encapsulating a packet for secure transportation on the network can be done using either GRE or IPsec protocols. This tip explains under what circumstances each protocol works best.

     

    used when IP packets need to be sent from one network to another, without being parsed or treated like IP packets by any intervening routers.

     

     

    For example, in Mobile IP, a mobile node registers with a Home Agent. When the mobile node roams to a new network, it registers with a Foreign Agent there. Whenever IP packets addressed to the mobile node are received by the Home Agent, they can be relayed over a GRE tunnel to the Foreign Agent for delivery. It does not matter how the Home Agent and Foreign Agent communicate with each other -- hops in between just pass along the GRE packet. Only the GRE tunnel endpoints -- the two Agents -- actually route the encapsulated IP packet.

    The IP Security (IPsec) Encapsulating Security Payload (ESP), defined by RFC 2406, also encapsulates IP packets. However, it does so for a different reason: To secure the encapsulated payload using encryption. IPsec ESP is used when IP packets need to be exchanged between two systems while being protected against eavesdropping or modification along the way.

    For example, in a site-to-site VPN, a source host in network "A" transmits an IP packet. When that packet reaches the edge of network "A" it hits a VPN gateway. VPN gateway "A" encrypts the private IP packet and relays it over an ESP tunnel to a peer VPN gateway at the edge of network "B." VPN gateway "B" then decrypts the packet and delivers it to the destination host. Like GRE, it doesn't really matter how the two VPN gateways communicate with each other -- hops in between just pass along the ESP packet. But unlike GRE, someone at those hops could not possibly look at or change the encapsulated IP packet, even if they wanted to. That's because cryptographic algorithms have been applied to scramble the IP packet and detect any modification or replay.

     

    In summary, use GRE where IP tunneling without privacy is required -- it's simpler and thus faster. But, use IPsec ESP where IP tunneling and data privacy are required -- it provides security features that are not even attempted by GRE.

     

     

     

     

     

     

     

     

     

     

     

    http://www.heiqu.com/show-75082-1.html

    http://user.qzone.qq.com/879205487/blog/1306227884

    Linux Ip/gre tunnel互通隧道配置

    3小时前

      说明:通过ip/gre tunnel能够通过多个tunnel网关将公司内网和机房互通

      例如:

      一、公司:

      UPIP:221.224.0.1

      网关:192.168.1.1/24

      network 公司

      二、机房A:

      UPIP:221.224.1.1

      network 机房A

      网关:10.30.1.1/24

      三、机房B:

      UPIP:221.224.2.1

      网关:172.16.1.1/24

      1、公司网关配置:

      modprobe ipip

      modprobe ip_gre

      #tunnel for 机房A

      ip tunnel add 机房A mode gre remote 221.224.1.1 local 221.224.0.1 ttl 255

      ip link set 机房A up

      ip addr add 192.168.1.1 dev 机房A

      ip route add 10.30.1.0/24 dev 机房A

      #tunnel for 机房B

      ip tunnel add 机房B mode gre remote 221.224.2.1 local 221.224.0.1 ttl 255

      ip link set 机房B up

      ip addr add 192.168.1.1 dev 机房B

      ip route add 172.16.1.0/24 dev 机房B

      2、机房A网关配置:

      ip tunnel add 机房A mode gre remote 221.224.0.1 local 221.224.1.1 ttl 255

      ip link set 机房A up

      ip addr add 10.30.1.1 dev 机房A

      ip route add 192.168.1.0/24 dev 机房A

      3、机房B网关配置:

      ip tunnel add 机房B mode gre remote 221.224.0.1 local 221.224.2.1 ttl 255

      ip link set 机房B up

      ip addr add 172.16.1.1 dev 机房B

      ip route add 192.168.1.0/24 dev 机房B

      ##############################################################################

      Cisco router Linux GRE连接

      本文说明cisco router和Linux 系统做GRE连接。Cisco 为1721。Linux为Centos.

      拓扑如下

      router 和 Linux GRE连接" src="http://s6.sinaimg.cn/middle/68f770d9g93a5abde8e85&690" width=690 height=212>

      Liunx 系统

      1、检查是否加载ip_gre模块

      lsmod|grep ip_gre

      如没有,请加载ip_gre

      insmod /lib/modules/2.6.18-194.3.1.el5/kernel/net/ipv4/ip_gre.ko

      2.新增tunnel, 命名为tunnel0

      [root@localhost ~]# ip tunnel add tunnel0 mode gre remote 192.168.1.1 local 172.16.1.254 ttl 255

      3.激活新增tunnel0,

      [root@localhost ~]# ip link set tunnel0 up mtu 1500

      4.添加tunnel0 IP.

      [root@localhost ~]# ip addr add 10.100.2.2/30 peer 10.100.2.1/30 dev tunnel0

      5.添加从tunnel0 走的路由

      [root@localhost ~]# ip route add 10.10.34.0/24 dev tunnel0

      6.验证

      [root@localhost ~]# ip addr show

      1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue

      link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

      inet 127.0.0.1/8 scope host lo

      inet 10.0.0.254/32 scope global lo

      inet6 ::1/128 scope host

      valid_lft forever preferred_lft forever

      2: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000

      link/ether 00:d0:b7:2e:8f:21 brd ff:ff:ff:ff:ff:ff

      inet 192.168.0.1/24 brd 192.168.0.255 scope global eth1

      inet6 fe80::2d0:b7ff:fe2e:8f21/64 scope link

      valid_lft forever preferred_lft forever

      3: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000

      link/ether 00:17:31:09:6e:ec brd ff:ff:ff:ff:ff:ff

      inet 172.16.1.254/24 brd 172.16.1.255 scope global eth0

      inet6 fe80::217:31ff:fe09:6eec/64 scope link

      valid_lft forever preferred_lft forever

      4: sit0: <NOARP> mtu 1480 qdisc noop

      link/sit 0.0.0.0 brd 0.0.0.0

      5: virbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue

      link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff

      inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0

      inet6 fe80::200:ff:fe00:0/64 scope link

      valid_lft forever preferred_lft forever

      6: tunl0: <NOARP> mtu 1480 qdisc noop

      link/ipip 0.0.0.0 brd 0.0.0.0

      7: gre0: <NOARP> mtu 1476 qdisc noop

      link/gre 0.0.0.0 brd 0.0.0.0

      8: tunnel0@NONE: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue

      link/gre 172.16.1.254 peer 192.168.1.1

      inet 10.100.2.2 peer 10.100.2.1/30 scope global tunnel0

      [root@localhost ~]# ip link show

      1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue

      link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

      2: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000

      link/ether 00:d0:b7:2e:8f:21 brd ff:ff:ff:ff:ff:ff

      3: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000

      link/ether 00:17:31:09:6e:ec brd ff:ff:ff:ff:ff:ff

      4: sit0: <NOARP> mtu 1480 qdisc noop

      link/sit 0.0.0.0 brd 0.0.0.0

      5: virbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue

      link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff

      6: tunl0: <NOARP> mtu 1480 qdisc noop

      link/ipip 0.0.0.0 brd 0.0.0.0

      7: gre0: <NOARP> mtu 1476 qdisc noop

      link/gre 0.0.0.0 brd 0.0.0.0

      8: tunnel0@NONE: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue

      link/gre 172.16.1.254 peer 192.168.1.1

      [root@localhost ~]# ip link show

      1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue

      link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

      2: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000

      link/ether 00:d0:b7:2e:8f:21 brd ff:ff:ff:ff:ff:ff

      3: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000

      link/ether 00:17:31:09:6e:ec brd ff:ff:ff:ff:ff:ff

      4: sit0: <NOARP> mtu 1480 qdisc noop

      link/sit 0.0.0.0 brd 0.0.0.0

      5: virbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue

      link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff

      6: tunl0: <NOARP> mtu 1480 qdisc noop

      link/ipip 0.0.0.0 brd 0.0.0.0

      7: gre0: <NOARP> mtu 1476 qdisc noop

      link/gre 0.0.0.0 brd 0.0.0.0

      8: tunnel0@NONE: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue

      link/gre 172.16.1.254 peer 192.168.1.1

      [root@localhost ~]# ip tunnel show

      sit0: ipv6/ip remote any local any ttl 64 nopmtudisc

      tunl0: ip/ip remote any local any ttl inherit nopmtudisc

      gre0: gre/ip remote any local any ttl inherit nopmtudisc

      tunnel0: gre/ip remote 192.168.1.1 local 172.16.1.254 ttl 255

      [root@localhost ~]# ip route show

      10.10.34.0/24 dev tunnel0 scope link

      192.168.0.0/24 dev eth1 proto kernel scope link src 192.168.0.1

      172.16.1.0/24 dev eth0 proto kernel scope link src 172.16.1.254

      192.168.122.0/24 dev virbr0 proto kernel scope link src 192.168.122.1

      [root@localhost ~]# ping 10.10.34.1

      PING 10.10.34.1 (10.10.34.1) 56(84) bytes of data.

      64 bytes from 10.10.34.1: icmp_seq=1 ttl=255 time=6.31 ms

      64 bytes from 10.10.34.1: icmp_seq=2 ttl=255 time=2.47 ms

      64 bytes from 10.10.34.1: icmp_seq=3 ttl=255 time=12.4 ms

      64 bytes from 10.10.34.1: icmp_seq=4 ttl=255 time=11.6 ms

      64 bytes from 10.10.34.1: icmp_seq=5 ttl=255 time=12.5 ms

      --- 10.10.34.1 ping statistics ---

      5 packets transmitted, 5 received, 0% packet loss, time 4002ms

      rtt min/avg/max/mdev = 2.477/9.102/12.578/4.045 ms

      

      Cisco

      Router-11#sh run int tunnel 1

      Building configuration...

      Current configuration : 148 bytes

      !

      interface Tunnel1

      ip address 10.100.2.1 255.255.255.252

      ip tcp adjust-mss 1400

      tunnel source 192.168.1.1

      tunnel destination 172.16.1.254

      end

      ip route 192.168.0.0 255.255.255.0 Tunnel1

      Router-11# traceroute 192.168.0.2

      Type escape sequence to abort.

      Tracing the route to ip-2-0-168-192.xxxx.com (192.168.0.2)

      1 10.100.2.2 [AS 65100] 0 msec

      ns1.xxxx.com (172.16.1.254) [AS 65100] 0 msec *

      可能会遇到MTU问题。需要调整MTUMSS参数

     

    转载于:https://www.cnblogs.com/jvava/p/4782207.html

    展开全文
  • <div><p>Hi, is it possible for centreon to monitor Zscaler GRE Tunnel. <p>Thanks</p><p>该提问来源于开源项目:centreon/centreon-plugins</p></div>
  • 在 korg 内核的 openvswitch 支持 GRE 之前,我们都是用内核原生的 GRE tunnel 来配置,而现在, korg 内核中的 openvswitch 也已经支持 GRE tunnel 了。有兴趣的可以看openvswitch: Add tunneling interface.和open...

    在 korg 内核的 openvswitch 支持 GRE 之前,我们都是用内核原生的 GRE tunnel 来配置,而现在, korg 内核中的 openvswitch 也已经支持 GRE tunnel 了。有兴趣的可以看 openvswitch: Add tunneling interface. 和 openvswitch: Add gre tunnel support. 这两个 commit。

    其实在 OVS 中添加 GRE 很简单,它无非就是把对 GRE 头和外部 IP 头的一些操作从原来的代码中抽象出来,做成内核“库函数”的形式,然后 OVS 中就可以直接调用它们了。难的是要从旧的 ip_gre 模块代码中抽象出这些“库函数”。详见 GRE: Refactor GRE tunneling code.

    值得注意的是,OVS GRE tunnel 没有注册网络设备,也就是说你无法通过 ip link 看到它,它只是一个 vport 而已,所以能通过 ovs-vsctl show 可以看到。这是故意这么设计的,虽然这简化了用户的操作,但刚注意到时难免会感觉有些奇怪。

    网上最流行的一篇讲解 OVS GRE tunnel 配置的教程是这篇文章,根据它我做了如下配置:

     

    ovs-vsctl add-br grebr0
    ovs-vsctl add-br phybr0
    ovs-vsctl add-port phybr0 p1p1
    ovs-vsctl add-port phybr0 tep0 — set Interface tep0 type=internal
    ifconfig tep0 192.168.88.1/24
    ifconfig p1p1 0.0.0.0
    ovs-vsctl add-port grebr0 vnet0
    ovs-vsctl add-port grebr0 gre1 — set Interface gre1 type=gre options:remote_ip=192.168.88.2


    但是仔细分析一下,其实完全没有必要使用两个 bridge,通过 gre1 的包其实可以直接进入 p1p1,即最后的物理网卡。所以优化后的配置如下:

     

     

    ovs-vsctl add-br grebr0
    ifconfig p1p1 192.168.88.1/24
    ovs-vsctl add-port grebr0 vnet0
    ovs-vsctl add-port grebr0 gre1 — set Interface gre1 type=gre options:remote_ip=192.168.88.2


    通过 GRE tunnel 的包是重新注入网络栈中的,所以它们会直接流向 p1p1,最终流向物理层。

     

    注意,这并没有结束。虽然通过这个配置你已经可以 ping 通对方 host 上的 VM 了,但是,如果你运行 netperf 测试的话,你会发现吞吐量非常低。这也是网络上的教程没有提到的地方。

    这里的原因是从 vnet0 里出来数据包很多是 MTU 的大小,我这里是1500。而经过 GRE tunnel 后外面又添加了 GRE 头和外层的 IP 头,所以包就会大于 1500。而物理网卡的 MTU 也是 1500!并且,这些包本身并不是 GSO 的,所以这些包最终会被 IP 层分片(fragment),所以性能非常差!

    这里有两种解决方法:

    1) 把 VM 里的网卡 MTU 调小,比如 1400,这样 host 上的 GRE 加上额外的头也不会超过 1500;

    2) 让 VM 里发出来的包依旧维持 GSO,这样 host 上收到的包也是 GSO,它们最终会被分段(segment),而不是分片(fragment)。这个可以通过给 qemu 传递 vnet_hdr=on 来完成(我没有试过,仅分析了源代码)。

    关于这个问题的进一步讨论可以看我提的问题

    转载于:https://www.cnblogs.com/fish001/articles/5626075.html

    展开全文
  • <div><p>IPSec encryption works for only GRE tunnel, so changes Agent config valiation to allow EnableIPSecTunnel only when the tunnel type is set to GRE. Also improve the logging config of strongSwan ...
  • CISCO官方配置手册GRE Tunnel
  • 深入理解 GRE tunnel

    2018-05-19 23:51:00
    深入理解 GRE tunnel时间2012-11-08 19:05:22A Geek's Page原文http://wangcong.org/blog/archives/2149主题路由器Linux我以前写过一篇介绍 tunnel 的文章,只是做了大体的介绍。里面多数 tunnel 是很容易理解的,...

    深入理解 GRE tunnel

    我以前写过一篇 介绍 tunnel 的文章 ,只是做了大体的介绍。里面多数 tunnel 是很容易理解的,因为它们多是一对一的,换句话说,是直接从一端到另一端。比如 IPv6 over IPv4 的 tunnel,也就是 SIT,它的原理如下图所示:

    显然,除了端点的 host A 和 host B之外,中间经过的任何设备都是看不到里面的 IPv6 的头,对于它们来说,经过 sit 发出的包和其它的 IPv4 的包没有任何区别。

    GRE tunnel 却不一样了,它的原理从根本上和 sit,ipip 这样的 tunnel 就不一样。除了外层的 IP 头和内层的 IP 头之间多了一个 GRE 头之外,它最大的不同是, tunnel 不是建立在最终的 host 上,而是在中间的 router 上 !换句话说,对于端点 host A 和 host B 来说,该 tunnel 是透明的(对比上面的 sit tunnel)。这是网上很多教程里没有直接告诉你的。理解这一点非常关键,正是因为它这么设计的,所以它才能解决 ipip tunnel 解决不了的问题。

    所以,经过 GRE tunnel 发送的包(从 host A 发送到 host B)大体过程是这样子的(仍然借用了 LARTC 中的例子 ):

    我们可以看出,从 host A 发出的包其实就是一个很普通的 IP 包,除了目的地址不直接可达外。该 GRE tunnel 的一端是建立在 router A上,另一段是建立在 router B上,所以添加外部的 IP 头是在 router A 上完成的,而去掉外面的 IP 头是在 router B上完成的,两个端点的 host 上几乎什么都不用做(除了配置路由,把发送到 10.0.2.0 的包路由到 router A)!

    这么设计的好处也就很容易看出来了,ipip tunnel 是端对端的,通信也就只能是点对点的,而 GRE tunnel 却可以进行多播。

    现在让我们看看Linux内核是怎么实现的,我们必须假设 router A 和 B 上都是运行的 Linux,而 host A 和 B上运行什么是无所谓的。

    发送过程是很简单的,因为 router A 上配置了一条路由规则,凡是发往 10.0.2.0 网络的包都要经过 netb 这个 tunnel 设备,在内核中经过 forward 之后就最终到达这个 GRE tunnel 设备的 ndo_start_xmit(),也就是 ipgre_tunnel_xmit() 函数。这个函数所做的事情无非就是通过 tunnel 的 header_ops 构造一个新的头,并把对应的外部 IP 地址填进去,最后发送出去。

    稍微难理解的是接收过程,即 router B 上面进行的操作。这里需要指出的一点是,GRE tunnel 自己定义了一个新的 IP proto,也就是 IPPROTO_GRE。当 router B 收到从 router A 过来的这个包时,它暂时还不知道这个是 GRE 的包,它首先会把它当作普通的 IP 包处理。因为外部的 IP 头的目的地址是该路由器的地址,所以它自己会接收这个包,把它交给上层,到了 IP 层之后才发现这个包不是 TCP,UDP,而是 GRE,这时内核会转交给 GRE 模块处理。

    GRE 模块注册了一个 hook:

    C:
    1. static const struct gre_protocol ipgre_protocol = {
    2.         . handler     = ipgre_rcv,
    3.         . err_handler = ipgre_err,
    4. } ;

    所以真正处理这个包的函数是 ipgre_rcv() 。ipgre_rcv() 所做的工作是:通过外层IP 头找到对应的 tunnel,然后剥去外层 IP 头,把这个“新的”包重新交给 IP 栈去处理,像接收到普通 IP 包一样。到了这里,“新的”包处理和其它普通的 IP 包已经没有什么两样了:根据 IP 头中目的地址转发给相应的 host。注意:这里我所谓的“新的”包其实并不新,内核用的还是同一个copy,只是skbuff 里相应的指针变了。

    以上就是Linux 内核对 GRE tunnel 的整个处理过程。另外,GRE 的头如下所示(图片来自 这里 ):

    IP header in GRE tunnel

    GRE header

    转载于:https://www.cnblogs.com/yisuo/p/9246865.html

    展开全文
  • To route several multicast from one interface(em2) to a GRE tunnel interface(gre00). <p>But when i try to setup the routing rule I get the error below: <pre><code> $ sudo smcroute -a em2 192.168.113....
  • 如何在Linux环境创建GRE Tunnel

    千次阅读 2016-12-14 10:27:07
    Question: I want to connect to remote networks by using a GRE tunnel. How can I create a GRE tunnel between two end points on Linux? GRE tunnels are IP-over-IP tunnels which can encapsulate IPv4/IPv6
  • 如果你是用 openvswitch 内置的 GRE tunnel,那么配置很简单,基本上就一条命令: ovs-vsctl add-port br0 gre0 -- set interface gre0 type=gre options:remote_ip=192.168.1.10 本文想谈的显然不是这个。因为 ...
  • <div><p>Summary: Adds a scratch table for access control, after the ip blacklist uplink packets will go to the gre tunnel filter scratch table. The allowed_gre_peers are obtained from the cloud ...
  • 【转载】深入理解 GRE tunnel

    千次阅读 2018-09-11 11:10:00
    深入理解 GRE tunnel 时间&nbsp;2012-11-08 19:05:22 A Geek’s Page ...
  • GRE tunnel 配置

    2019-10-01 00:33:04
     基本配置说明:  1)R1,R2的环回口分别为:192.168.1.1/24和192.168.2.1/24  2)链路两端的IP使用该路由器... Q2:如何建立GRE中的tunnel?  Q3:tunnel的一些细节。  Answer1:  tunnel是类似于环回...
  • I have the following situation trying to send multicast UDP packets over a GRE tunnel -- <p><img alt="untitled" src=...
  • <div><p>Hi Vincent! <p>I may me the one needing CDP over GRE ...<p>It would be nice to re-open this issue ( Support of GRE tunnel #9 ) <p>Thanks!</p><p>该提问来源于开源项目:lldpd/lldpd</p></div>
  • 在Ubuntu上创建并测试GRE tunnel

    千次阅读 2019-03-09 15:10:23
    使用两台Ubuntu虚拟机进行GREtunnel测试,则两台虚拟机位于同一网段,但并不影响观察测试结果。 测试环境: 在一台PC上同时运行两个Ubuntu虚拟机: ubuntu-gnome-16.04-desktop-amd64,IP为192.168.0.105,暂且...
  • 目录StrongSwan IKEv2 搭建Linux 与 Cisco的 GRE Tunnel over IPsec IKEv2环境效果图安装配置应用 StrongSwan IKEv2 搭建Linux 与 Cisco的 GRE Tunnel over IPsec IKEv2 环境 Linux: cat /proc/version Linux ...
  • GRE tunnel 2

    2018-10-29 11:44:00
    1、GRE简介 通用路由封装协议GRE(Generic Routing Encapsulation)可以对某些网络层协议(如IPX、ATM、IPv6、AppleTalk等)的数据报文进行封装,使这些被封装的数据报文能够在另一个网络层协议(如IPv4)中传输。 ...
  • Linux GRE Tunnel

    2017-07-11 09:47:00
    /sbin/modprobe ip_gre/sbin/iptunnel add tun0 mode gre remote 114.141.167.167 local 114.55.73.157/sbin/ifconfig tun0 122.115.74.170/sbin/route add 202.177.205.249/32 tun0/sbin/route add 72.46.244.2...
  • still same topology used as previous posts. Added GRE tunnel in the topology with two new OSPF areas. version 10.4R3.4;system { backup-router 10.50.2.1; root-authentication { encrypted-...
  • 思科路由器GRE tunnel配置案例

    千次阅读 2011-06-11 23:04:57
    某台湾企业在东莞有一个分公司,台湾总部及东莞分...要求使用这两个公网地址建立GRE tunnel,实现简单的×××连接,让台湾总部与东莞分公司的内部网路通过GRE tunnel互相通信。 一、网络拓扑图 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 503
精华内容 201
关键字:

gretunnel