Red Hat Training

A Red Hat training course is available for RHEL 8

第 16 章 配置 IP 隧道

与 VPN 类似,IP 隧道通过网络(如互联网)直接连接两个网络。然而,不是所有的隧道协议都支持加密。

两个建立隧道网络的路由器至少需要两个接口:

  • 一个连接到本地网络的接口
  • 一个连接到建立隧道的网络的接口。

要建立隧道,您可以在两个路由器中使用来自远程子网的 IP 地址创建一个虚拟接口。

NetworkManager 支持以下 IP 隧道:

  • 通用路由封装(GRE)
  • IPv6 上的通用路由封装(IP6GRE)
  • 通用路由封装终端接入点(GRETAP)
  • 通用路由登录在 IPv6(IP6GRETAP)上
  • IPv4 over IPv4(IPIP)
  • IPv4 over IPv6(IPIP6)
  • IPv6 over IPv6(IP6IP6)
  • 简单的互联网转换(SIT)

根据类型,这些通道在 Open Systems Interconnection(OSI)的第 2 层或 3 层动作。

16.1. 使用 nmcli 配置 IPIP 隧道来封装 IPv4 数据包中的 IPv4 流量

IP over IP(IPIP)隧道在 OSI 层 3 上运行,并封装 IPv4 数据包中的 IPv4 流量,如 RFC 2003 所述

重要

通过 IPIP 隧道发送的数据没有加密。出于安全考虑,只在已经加密的数据中使用隧道,比如 HTTPS。

请注意,IPIP 隧道只支持单播数据包。如果您需要支持多播的 IPv4 隧道,请参阅 使用 nmcli 配置 GRE 隧道来封装 IPv4 数据包中的第 3 层流量

此流程描述了如何在两个 RHEL 路由器之间创建 IPIP 隧道以通过互联网连接两个内部子网,如下图所示:

IPIP 隧道

先决条件

  • 每个 RHEL 路由器都有一个网络接口,它连接到其本地子网。
  • 每个 RHEL 路由器都有一个网络接口,它连接到互联网。
  • 您需要通过隧道发送的流量是 IPv4 单播。

流程

  1. 在网络 A 的 RHEL 路由器上:

    1. 创建名为 tun0 的 IPIP 隧道接口:

      # nmcli connection add type ip-tunnel ip-tunnel.mode ipip con-name tun0 ifname tun0 remote 198.51.100.5 local 203.0.113.10

      remotelocal 参数设置远程和本地路由器的公共 IP 地址。

    2. 将 IPv4 地址设置为 tun0 设备:

      # nmcli connection modify tun0 ipv4.addresses '10.0.1.1/30'

      请注意,有两个可用的 IP 地址的 /30 子网足以满足隧道的需要。

    3. tun0 连接配置为使用手动 IPv4 配置:

      # nmcli connection modify tun0 ipv4.method manual
    4. 添加将流量路由到 172.16.0.0/24 网络的静态路由到路由器 B 的隧道 IP:

      # nmcli connection modify tun0 +ipv4.routes "172.16.0.0/24 10.0.1.2"
    5. 启用 tun0 连接。

      # nmcli connection up tun0
    6. 启用数据包转发:

      # echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf
      # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf
  2. 在网络 B 中的 RHEL 路由器中:

    1. 创建名为 tun0 的 IPIP 隧道接口:

      # nmcli connection add type ip-tunnel ip-tunnel.mode ipip con-name tun0 ifname tun0 remote 203.0.113.10 local 198.51.100.5

      remotelocal 参数设置远程和本地路由器的公共 IP 地址。

    2. 将 IPv4 地址设置为 tun0 设备:

      # nmcli connection modify tun0 ipv4.addresses '10.0.1.2/30'
    3. tun0 连接配置为使用手动 IPv4 配置:

      # nmcli connection modify tun0 ipv4.method manual
    4. 添加将流量路由到 192.0.2.0/24 网络的静态路由到路由器 A 的隧道 IP:

      # nmcli connection modify tun0 +ipv4.routes "192.0.2.0/24 10.0.1.1"
    5. 启用 tun0 连接。

      # nmcli connection up tun0
    6. 启用数据包转发:

      # echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf
      # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf

验证步骤

  • 从每个 RHEL 路由器中,ping 路由器的内部接口的 IP 地址:

    1. 在路由器 A 中,ping 172.16.0.1:

      # ping 172.16.0.1
    2. 在路由器 B 中,ping 192.0.2.1:

      # ping 192.0.2.1

其它资源

  • 有关使用 nmcli 的详情,请查看 nmcli man page。
  • 有关您可以使用 nmcli 设定的隧道设置的详情,请查看 nm-settings(5) man page 中的 ip-tunnel settings 部分。

16.2. 使用 nmcli 配置 GRE 隧道来封装 IPv4 数据包中的层 3 流量

Generic Routing Encapsulation(GRE)隧道封装 IPv4 数据包中的第 3 层流量,如 RFC 2784 所述。GRE 隧道可以使用有效的以太网类型封装任何第 3 层协议。

重要

通过 GRE 隧道发送的数据没有加密。出于安全考虑,只在已经加密的数据中使用隧道,比如 HTTPS。

此流程描述了如何在两个 RHEL 路由器之间创建 GRE 隧道以通过互联网连接两个内部子网,如下图所示:

GRE 隧道
注意

gre0 设备名称被保留。为该设备使用 gre1 或者不同名称。

先决条件

  • 每个 RHEL 路由器都有一个网络接口,它连接到其本地子网。
  • 每个 RHEL 路由器都有一个网络接口,它连接到互联网。

流程

  1. 在网络 A 的 RHEL 路由器上:

    1. 创建名为 gre1 的 GRE 隧道接口:

      # nmcli connection add type ip-tunnel ip-tunnel.mode gre con-name gre1 ifname gre1 remote 198.51.100.5 local 203.0.113.10

      remotelocal 参数设置远程和本地路由器的公共 IP 地址。

    2. 将 IPv4 地址设置为 gre1 设备:

      # nmcli connection modify gre1 ipv4.addresses '10.0.1.1/30'

      请注意,有两个可用的 IP 地址的 /30 子网足以满足隧道的需要。

    3. gre1 连接配置为使用手动 IPv4 配置:

      # nmcli connection modify gre1 ipv4.method manual
    4. 添加将流量路由到 172.16.0.0/24 网络的静态路由到路由器 B 的隧道 IP:

      # nmcli connection modify tun0 +ipv4.routes "172.16.0.0/24 10.0.1.2"
    5. 启用 gre1 连接。

      # nmcli connection up gre1
    6. 启用数据包转发:

      # echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf
      # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf
  2. 在网络 B 中的 RHEL 路由器中:

    1. 创建名为 gre1 的 GRE 隧道接口:

      # nmcli connection add type ip-tunnel ip-tunnel.mode ipip con-name gre1 ifname gre1 remote 203.0.113.10 local 198.51.100.5

      remotelocal 参数设置远程和本地路由器的公共 IP 地址。

    2. 将 IPv4 地址设置为 gre1 设备:

      # nmcli connection modify gre1 ipv4.addresses '10.0.1.2/30'
    3. gre1 连接配置为使用手动 IPv4 配置:

      # nmcli connection modify gre1 ipv4.method manual
    4. 添加将流量路由到 192.0.2.0/24 网络的静态路由到路由器 A 的隧道 IP:

      # nmcli connection modify tun0 +ipv4.routes "192.0.2.0/24 10.0.1.1"
    5. 启用 gre1 连接。

      # nmcli connection up gre1
    6. 启用数据包转发:

      # echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf
      # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf

验证步骤

  1. 从每个 RHEL 路由器中,ping 路由器的内部接口的 IP 地址:

    1. 在路由器 A 中,ping 172.16.0.1:

      # ping 172.16.0.1
    2. 在路由器 B 中,ping 192.0.2.1:

      # ping 192.0.2.1

其它资源

  • 有关使用 nmcli 的详情,请查看 nmcli man page。
  • 有关您可以使用 nmcli 设定的隧道设置的详情,请查看 nm-settings(5) man page 中的 ip-tunnel settings 部分。

16.3. 配置 GRETAP 隧道来通过 IPv4 传输以太网帧

Generic Routing Encapsulation Terminal Access Point(GRETAP)隧道在 OSI 级别 2 上运行,并封装 IPv4 数据包中的以太网流量,如 RFC 2784 所述。

重要

通过 GRETAP 隧道发送的数据没有加密。出于安全考虑,通过 VPN 或不同的加密连接建立隧道。

此流程描述了如何在两个 RHEL 路由器之间创建 GRETAP 隧道以使用桥接连接两个网络,如下图所示:

GRETAP 隧道
注意

gretap0 设备名称被保留。为该设备使用 gretap1 或者不同名称。

先决条件

  • 每个 RHEL 路由器都有一个网络接口,它连接到其本地网络,接口没有分配 IP 配置。
  • 每个 RHEL 路由器都有一个网络接口,它连接到互联网。

流程

  1. 在网络 A 的 RHEL 路由器上:

    1. 创建名为 bridge0的网桥接口:

      # nmcli connection add type bridge con-name bridge0 ifname bridge0
    2. 配置网桥的 IP 设置:

      # nmcli connection modify bridge0 ipv4.addresses '192.0.2.1/24'
      # nmcli connection modify bridge0 ipv4.method manual
    3. 为连接到本地网络的接口添加新连接配置集到网桥:

      # nmcli connection add type ethernet slave-type bridge con-name bridge0-port1 ifname enp1s0 master bridge0
    4. 为网桥添加 GRETAP 隧道接口的新连接配置集:

      # nmcli connection add type ip-tunnel ip-tunnel.mode gretap slave-type bridge con-name bridge0-port2 ifname gretap1 remote 198.51.100.5 local 203.0.113.10 master bridge0

      remotelocal 参数设置远程和本地路由器的公共 IP 地址。

    5. 可选:如果您不需要,STP(Spanning Tree Protocol):

      # nmcli connection modify bridge0 bridge.stp no

      默认情况下,STP 被启用并导致在使用连接前出现延迟。

    6. 配置激活 bridge0 连接会自动激活网桥端口:

      # nmcli connection modify bridge0 connection.autoconnect-slaves 1
    7. 激活 bridge0 连接:

      # nmcli connection up bridge0
  2. 在网络 B 中的 RHEL 路由器中:

    1. 创建名为 bridge0的网桥接口:

      # nmcli connection add type bridge con-name bridge0 ifname bridge0
    2. 配置网桥的 IP 设置:

      # nmcli connection modify bridge0 ipv4.addresses '192.0.2.2/24'
      # nmcli connection modify bridge0 ipv4.method manual
    3. 为连接到本地网络的接口添加新连接配置集到网桥:

      # nmcli connection add type ethernet slave-type bridge con-name bridge0-port1 ifname enp1s0 master bridge0
    4. 为网桥添加 GRETAP 隧道接口的新连接配置集:

      # nmcli connection add type ip-tunnel ip-tunnel.mode gretap slave-type bridge con-name bridge0-port2 ifname gretap1 remote 203.0.113.10 local 198.51.100.5 master bridge0

      remotelocal 参数设置远程和本地路由器的公共 IP 地址。

    5. 可选:如果您不需要,STP(Spanning Tree Protocol):

      # nmcli connection modify bridge0 bridge.stp no
    6. 配置激活 bridge0 连接会自动激活网桥端口:

      # nmcli connection modify bridge0 connection.autoconnect-slaves 1
    7. 激活 bridge0 连接:

      # nmcli connection up bridge0

验证步骤

  1. 在两个路由器中,验证 enp1s0gretap1 连接是否已连接,并且 CONNECTION 列显示了端口的连接名称:

    # nmcli device
    nmcli device
    DEVICE   TYPE      STATE      CONNECTION
    ...
    bridge0  bridge    connected  bridge0
    enp1s0   ethernet  connected  bridge0-port1
    gretap1  iptunnel  connected  bridge0-port2
  2. 从每个 RHEL 路由器中,ping 路由器的内部接口的 IP 地址:

    1. 在路由器 A 中,ping 192.0.2.2:

      # ping 192.0.2.2
    2. 在路由器 B 中,ping 192.0.2.1:

      # ping 192.0.2.1

其它资源

  • 有关使用 nmcli 的详情,请查看 nmcli man page。
  • 有关您可以使用 nmcli 设定的隧道设置的详情,请查看 nm-settings(5) man page 中的 ip-tunnel settings 部分。

16.4. 其它资源

  • 有关隧道接口列表以及使用 ip 程序临时配置隧道的详情,请查看 ip-link(8) man page。