如何让我的辅助网络接口在我的 Ubuntu EC2 实例中工作?

上次更新时间:2021 年 1 月 19 日

如何让我的辅助网络接口在我的 Ubuntu Amazon Elastic Compute Cloud (Amazon EC2) 实例中工作?

简短描述

警告:第二个弹性网络接口专供高级用户使用。仅当您无法使用单个网络接口且必须将属于同一子网的两个网络接口连接到单个实例时,才可以使用第二个弹性网络接口。为避免出现不对称路由问题,请使用单个弹性网络接口,或将重复的弹性网络接口放入互不重叠的子网中。

将辅助网络接口添加到非 Amazon Linux EC2 实例会引起流量流问题。这些问题发生的原因在于主要和辅助网络接口位于同一子网中,且有一个带一个网关的路由表。进入辅助网络接口的流量将使用主网络接口离开实例。但这种情况是不允许的,因为辅助 IP 地址不属于主网络接口的 MAC 地址。

要使辅助接口在创建后正常工作,请执行以下操作:

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

在开始之前,请了解一点,Amazon EC2 实例位于 AWS 云中,因此多个接口并非适用于所有使用案例。以下是您可能不需要使用辅助网络接口的示例:

  • 增加网络吞吐量。网络吞吐量不会增加,因为根据实例类型和大小设置了限值。有关更多信息,请参阅 Amazon EC2 实例类型
  • 增加弹性 IP 地址。如果每个接口的弹性 IP 地址不足,则您可能不需要添加更多接口即可获得更多弹性 IP 地址。大多数应用程序可以很好地与域名系统配合使用。例如,Apache 可以使用基于名称的虚拟主机

注意:为以下 Ubuntu 版本添加辅助网络接口的步骤各不相同:

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

解决方法

注意:尽管下列解决方法中的步骤已在列出的 Linux 版本上经过测试,但由于配置的自定义设置不同,可能需要稍作修改。

配置 Ubuntu 14.04 或 16.04

为 Ubuntu 创建辅助接口配置文件、配置路由表和设置路由策略规则可以使用单个文件完成。

所有过程必须使用根用户权限执行。使用 sudo -i 成为根用户,或者使用 sudo 运行所有命令。

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.    为辅助接口创建一个配置文件。本示例使用辅助接口“eth1”。确保更改“eth1”以匹配在第 1 步中发现的辅助接口名称。

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

下面是一个示例,其中包含单个 IP 地址 172.31.21.115 和辅助接口上的网关 172.31.16.1。确保根据您的实际情况更改 IP 地址和网关。另请注意,您的网关必须是您的子网中的第一个有效 IP 地址。

auto eth1
iface 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 地址为 172.31.21.115 和 172.31.18.46,网关为 172.31.16.1。确保根据您的实际情况更新 IP 地址和网关。

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

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

vi /etc/dhcp/dhclient-enter-hooks.d/restrict-default-gw

4.    将以下行添加到 restrict-default-gw 文件。确保更改“eth0”以匹配在第 1 步中发现的主接口名称。

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

5.    重启网络:

Ubuntu 14.04:

(ifdown eth1 && ifup eth1)

Ubuntu 16.04:

systemctl restart networking

配置 Ubuntu 18.04 和 20.04

Ubuntu 18.04 和 20.04 使用 Netplan 联网配置。以下示例使用了 Netplan 配置。请注意,Netplan 使用了 YAML 格式,这意味着缩进很重要。下面的示例使用了一个双空格缩进。

注意:使用根用户权限运行所有命令。使用“sudo -i”成为根用户,或者使用“sudo”运行所有命令。

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 控制台,选择 Instances(实例),然后选择该实例。 

2.    在 Networking(联网)选项卡上,滚动到 Network interfaces(网络接口)并记下辅助网络接口的子网 ID。

3.    打开 Amazon Virtual Private Cloud (Amazon VPC) 控制台,选择 Subnets(子网),然后记下针对子网 ID 列出的 IPv4 CIDR 范围。

4.    应用网络配置:

netplan --debug apply

这篇文章对您有帮助吗?


您是否需要账单或技术支持?