5.3. GRE 隧道

GRE 是一种隧道协议,最初由 Cisco 开发,它比 IP-in-IP 隧道可以做更多的事情。例如,您还可以通过 GRE 隧道传输组播流量和 IPv6。

在 Linux 中,您需要 ip_gre.o 模块。

5.3.1. IPv4 隧道

让我们先进行 IPv4 隧道

假设您有 3 个网络:内部网络 A 和 B,以及中间网络 C(或者说是互联网)。

所以我们有网络 A
network 10.0.1.0
netmask 255.255.255.0
router  10.0.1.1
路由器在网络 C 上的地址为 172.16.17.18。让我们称这个网络为 neta(好吧,没什么创意)

和网络 B
network 10.0.2.0
netmask 255.255.255.0
router  10.0.2.1
路由器在网络 C 上的地址为 172.19.20.21。让我们称这个网络为 netb(仍然没什么创意)

就网络 C 而言,我们假设它会传递从 A 发送到 B 以及从 B 发送到 A 的任何数据包。至于如何以及为什么,我们不关心。

在网络 A 的路由器上,您执行以下操作

ip tunnel add netb mode gre remote 172.19.20.21 local 172.16.17.18 ttl 255
ip link set netb up
ip addr add 10.0.1.1 dev netb
ip route add 10.0.2.0/24 dev netb

让我们稍微讨论一下这个。在第 1 行中,我们添加了一个隧道设备,并将其称为 netb(这很明显,因为那是我们想要去的地方)。此外,我们告诉它使用 GRE 协议 (mode gre),远程地址为 172.19.20.21(另一端的路由器),我们的隧道数据包应源自 172.16.17.18(这允许您的路由器在网络 C 上有多个 IP 地址,并让您决定使用哪个地址进行隧道传输),并且数据包的 TTL 字段应设置为 255 (ttl 255)。

第二行启用该设备。

在第三行中,我们为新生的接口 netb 分配了地址 10.0.1.1。这对于较小的网络来说是可以的,但是当您开始大规模挖掘(大量隧道)时,您可能需要考虑为隧道接口使用另一个 IP 范围(在本例中,您可以使用 10.0.3.0)。

在第四行中,我们设置了网络 B 的路由。请注意网络掩码的不同表示法。如果您不熟悉这种表示法,这里是它的工作原理:您以二进制形式写出网络掩码,然后计算所有 1 的个数。如果您不知道如何执行此操作,只需记住 255.0.0.0 是 /8,255.255.0.0 是 /16,而 255.255.255.0 是 /24。哦,还有 255.255.254.0 是 /23,以防您想知道。

但关于这个就够了,让我们继续网络 B 的路由器。
ip tunnel add neta mode gre remote 172.16.17.18 local 172.19.20.21 ttl 255
ip link set neta up
ip addr add 10.0.2.1 dev neta
ip route add 10.0.1.0/24 dev neta
当您想删除路由器 A 上的隧道时
ip link set netb down
ip tunnel del netb
当然,您可以将 netb 替换为路由器 B 的 neta。

5.3.2. IPv6 隧道

有关 IPv6 地址的简短介绍,请参见第 6 节。

继续隧道。

假设您有以下 IPv6 网络,并且想要将其连接到 6bone 或朋友。

Network 3ffe:406:5:1:5:a:2:1/96
您的 IPv4 地址是 172.16.17.18,而 6bone 路由器的 IPv4 地址是 172.22.23.24。

ip tunnel add sixbone mode sit remote 172.22.23.24 local 172.16.17.18 ttl 255
ip link set sixbone up
ip addr add 3ffe:406:5:1:5:a:2:1/96 dev sixbone
ip route add 3ffe::/15 dev sixbone 

让我们讨论一下这个。在第一行中,我们创建了一个名为 sixbone 的隧道设备。我们为其提供了模式 sit(即 IPv6 in IPv4 隧道),并告诉它要去哪里(remote)和从哪里来(local)。TTL 设置为最大值 255。接下来,我们使设备处于活动状态 (up)。之后,我们添加了自己的网络地址,并为 3ffe::/15(目前是整个 6bone)设置了通过隧道的路由。

GRE 隧道是目前首选的隧道类型。它是一个标准,也在 Linux 社区之外被广泛采用,因此是一件好事。