如何在 Ubuntu EC2 实例中使用辅助网络接口?

3 分钟阅读
0

我想让我的辅助网络接口在我的 Ubuntu Amazon Elastic Compute Cloud(Amazon EC2)实例中运行。

简短描述

**警告:**辅助弹性网络接口的使用适用于高级用户。此解决方案仅用于以下用例: 您不能使用单个网络接口,必须将来自同一子网的两个网络接口连接到一个实例。为避免非对称路由问题,请使用单个弹性网络接口,或将重复的弹性网络接口放入非重叠子网中。或者,使用 Ubuntu 24.04 LTS 或更高版本。

向非 Amazon Linux EC2 实例添加辅助网络接口会导致流量问题。之所以出现这些问题,是因为主网络接口和辅助网络接口位于同一个子网中,并且只有一个路由表和一个网关。进入辅助网络接口的流量使用主网络接口来离开实例。由于辅助 IP 地址不属于主网络接口的 MAC 地址,因此辅助接口不起作用。

**注意:**对于 Ubuntu 24.04,不需要执行以下步骤。Ubuntu 24.04 会自动处理这种高级配置。

要在创建辅助接口后使其正常工作,请完成以下步骤:

  1. 配置路由表。
  2. 在自定义路由表策略数据库中设置规则,以便辅助接口的流量使用新的路由表。

在开始之前,请注意,Amazon EC2 实例位于 AWS 云中,因此并非所有用例都受益于多个接口。以下示例显示了何时可能不需要使用辅助网络接口:

  • 若想提高网络吞吐量,请执行以下操作: 由于限制是根据实例类型和大小设置的,因此网络吞吐量不会增加。有关更多信息,请参阅 Amazon EC2 实例类型
  • 要增加弹性 IP 地址,请执行以下操作: 如果每个接口的弹性 IP 地址很少,则可能不需要添加更多接口来获得更多的弹性 IP 地址。大多数应用程序都能很好地与域名系统配合使用。例如,Apache 可以使用基于名称的虚拟主机。有关更多信息,请参阅 Apache 网站上的 Name-based virtual host support

**注意:**对于以下每个 Ubuntu 版本,添加辅助网络接口的步骤都不同:

  • Ubuntu 14.04
  • Ubuntu 16.04
  • Ubuntu 18.04
  • Ubuntu 20.04
  • Ubuntu 22.04

解决方法

**注意:**尽管以下解决方案中的步骤是在列出的 Linux 版本上测试的,但您可能需要修改配置的自定义设置。所有步骤都必须以根用户权限运行。要么使用 sudo-i 成为根用户,要么使用 sudo 运行所有命令。

配置 Ubuntu 14.04 或 16.04

您可以使用单个文件创建辅助接口配置文件,配置路由表,然后为 Ubuntu 设置路由策略规则。

要配置 Ubuntu 14.04 或 16.04,请完成以下步骤:

  1. 要获取主网络接口的名称,请运行以下命令:

    ip a | grep ^[[:digit:]]

    您收到的输出类似于以下消息:

    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc pfifo_fast state UP group default qlen 1000
    3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000

    **重要事项:**在前面的示例中,主接口名为 eth0eth1 等。但是,对于支持增强联网的实例,例如 m4 和 m5 系列类型,您可能会看到命名不一致。例如,如果辅助节点名为 eth0,则主节点可能被命名为 ens3。当您在实例运行时添加辅助接口时,就会发生这种命名不一致的情况。为避免命名不一致,请在启动时添加接口或重启实例。或者,如果接口正在运行,则使用以下命令更改名称:

    ip link set eth0 name ens4 && ip link set ens4 up
  2. 为辅助接口创建配置文件:

    vi /etc/network/interfaces.d/51-eth1.cfg

    **注意:**更改 eth1 以匹配您的辅助接口名称。

    以下命令是单个 IP 地址 172.31.21.115 以及辅助接口上网关为 172.31.16.1 的示例:

    auto eth1iface eth1 inet static address 172.31.21.115
    netmask 255.255.240.0
    
    # Gateway configuration
    up ip route add default via 172.31.16.1 dev eth1 table 1000
    
    # Routes and rules
    up ip route add 172.31.21.115 dev eth1 table 1000
    up ip rule add from 172.31.21.115 lookup 1000

    **注意:**用您自己的信息替换示例 IP 地址和网关。您的网关必须是子网中的第一个有效 IP 地址。

    以下命令是多个 IP 地址的示例。在此示例中,IP 地址为 172.31.21.115172.31.18.46,网关为 172.31.16.1

    auto eth1# Enter one or more IP settings
    iface eth1 inet static
    address 172.31.21.115
    netmask 255.255.240.0
    
    iface eth1 inet static
    address 172.31.18.46
    netmask 255.255.240.0
    
    # Default gateway for eth1
    up ip route add default via 172.31.16.1 dev eth1 table 1000
    
    # A route for every IP
    up ip route add 172.31.21.115 dev eth1 table 1000
    up ip route add 172.31.18.46 dev eth1 table 1000
    
    # A policy rule for every IP
    up ip rule add from 172.31.21.115 lookup 1000
    up ip rule add from 172.31.18.46 lookup 1000

    **注意:**用您自己的信息替换示例 IP 地址和网关。

  3. 创建 restrict-default-gw 文件以防止主表上的默认网关被覆盖:

    vi /etc/dhcp/dhclient-enter-hooks.d/restrict-default-gw
  4. 将以下行添加到 restrict-default-gw 文件中:

    case ${interface} in  eth0)    ;;
      *)
        unset new_routers
        ;;
    esac

    **注意:**将 eth0 替换为您的主接口名称。

  5. 重启网络。

    对于 Ubuntu 14.04,运行以下命令:

    (ifdown eth1 && ifup eth1)

    对于 Ubuntu 16.04,运行以下命令:

    systemctl restart networking

配置 Ubuntu 18.04、20.04 和 22.04

Ubuntu 18.04、20.04 和 22.04 使用 Netplan 网络配置。请注意,Netplan 使用 YAML 格式。这种 YAML 格式意味着缩进至关重要。以下 Netplan 示例使用双空格缩进。

要配置 Ubuntu 18.04、20.04 和 22.04,请完成以下步骤:

  1. 为辅助接口创建配置文件:

    vi /etc/netplan/51-eth1.yaml
  2. 将以下行添加到 51-eth1.yaml 文件中:

    network:  version: 2  renderer: networkd
      ethernets:
        eth1:
          addresses:
           - 172.31.24.153/20
           - 172.31.28.195/20
          dhcp4: no
          routes:
           - to: 0.0.0.0/0
             via: 172.31.16.1 # Default gateway
             table: 1000
           - to: 172.31.24.153
             via: 0.0.0.0
             scope: link
             table: 1000
           - to: 172.31.28.195
             via: 0.0.0.0
             scope: link
             table: 1000
          routing-policy:
            - from: 172.31.24.153
              table: 1000
            - from: 172.31.28.195
              table: 1000

    **注意:**将前面的示例信息替换为特定于您的用例的信息。前面的示例 YAML 文件在 eth1(辅助接口)上配置了两个 IP 地址。

要查找要在 YAML 文件中使用的 CIDR 范围,请完成以下步骤:

  1. 打开 Amazon EC2 控制台 ,选择实例,然后选择实例。
  2. 网络选项卡上,滚动到网络接口,然后记下辅助网络接口的子网 ID。
  3. 打开Amazon Virtual Private Cloud (Amazon VPC) 控制台,选择子网,然后记下为子网 ID 列出的 IPv4 CIDR 范围。
  4. 要应用网络配置,请运行以下命令:
    netplan --debug apply

相关信息

配置路由表

AWS 官方
AWS 官方已更新 5 个月前