AWS Builder Center: Learn, Build and Connect with builders in the AWS community
AWS Builder Center is the official home for builders on AWS. Share and read what others are working on, follow people who inspire you, explore training and workshops, and find tools to support what you're building.
如何在 Ubuntu Amazon EC2 实例中使用辅助网络接口?
我想让我的辅助网络接口在我的 Ubuntu Amazon Elastic Compute Cloud(Amazon EC2)实例中运行。
简述
重要信息: 辅助弹性网络接口的使用适用于高级用户。仅当您无法使用单个网络接口时才使用此解决方案。
如果您向非 Amazon Linux EC2 实例添加辅助网络接口,则可能会遇到流量传输问题。出现这些问题的原因是辅助网络接口通过主网络接口路由传入流量。由于辅助 IP 地址不属于主网络接口的 MAC 地址,因此辅助接口不起作用。
注意: Ubuntu 24.04 不需要以下步骤,它会自动处理此高级配置。
要在创建辅助接口后使其正常工作,请完成以下步骤:
- 配置路由表。
- 在自定义路由表策略数据库中设置规则,以便辅助接口的流量使用新的路由表。
注意: Amazon EC2 实例位于 AWS 云中,并非所有实例都能从使用多个接口中受益。
您可能不需要第二个网络接口来提高网络吞吐量。AWS 根据实例类型和大小设置配额,此配置会限制网络吞吐量。有关详细信息,请参阅 Amazon EC2 实例类型。
您也可能不需要第二个网络接口来增加弹性 IP 地址。您无需向实例添加弹性 IP 地址,因为大多数应用程序可以很好地与 DNS 配合工作。例如,Apache 可以使用基于名称的虚拟主机。有关详细信息,请参阅 Apache 网站上的基于名称的虚拟主机支持。
对于以下操作系统,添加辅助网络接口的步骤有所不同:
- Ubuntu 14.04
- Ubuntu 16.04
- Ubuntu 18.04、20.04 和 22.04
- Debian 12(不同的子网)
解决方法
注意: 以下解决方法中的步骤已在所列 Linux 版本上进行了测试。请修改您的配置的自定义设置,以根用户权限运行以下步骤。要么借助 sudo-i 使用根用户,要么使用 sudo 运行所有命令。
配置 Ubuntu 14.04 或 16.04
使用单个文件创建辅助接口配置文件,配置路由表,然后为 Ubuntu 设置路由策略规则。
完成以下步骤:
-
请运行以下命令,以获取主网络接口的名称:
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重要信息: 在前面的示例中,主接口名为 eth0 和 eth1。但是,对于支持增强联网的实例,例如 m4 和 m5 系列类型,您可能会看到命名不一致。例如,当辅助接口命名为 eth0 时,主接口可能命名为 ens3。当您在实例运行时添加辅助接口时,就会发生这种命名不一致的情况。为避免命名不一致,请在启动时添加接口或重启实例。如果接口正在运行,则使用以下命令更改名称:
ip link set eth0 name ens4 ip link set ens4 up ip link show ens4 -
为辅助接口创建配置文件:
vi /etc/network/interfaces.d/51-eth1.cfg注意: 将 eth1 替换为您的辅助接口名称。
以下命令是单个 IP 地址 172.31.21.115 以及辅助接口上网关为 172.31.16.1 的示例:
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注意: 将 172.31.21.115 替换为您的 IP 地址,将 172.31.16.1 替换为您的网关。您的网关必须是子网中的第一个有效 IP 地址。
以下命令是多个 IP 地址的示例:auto eth1 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注意: 将 172.31.21.115 和 172.31.18.46 替换为您的 IP 地址,将 172.31.16.1 替换为您的网关。
-
创建 restrict-default-gw 文件以防止主表上的默认网关被覆盖:
vi /etc/dhcp/dhclient-enter-hooks.d/restrict-default-gw -
将以下行添加到 restrict-default-gw 文件中:
case ${interface} in eth0) ;; *) unset new_routers ;; esac注意: 将 eth0 替换为您的主接口名称。
-
重启网络。
对于 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 示例使用双空格缩进。
完成以下步骤:
-
为辅助接口创建配置文件:
vi /etc/netplan/51-eth1.yaml -
将以下行添加到 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 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 范围,请完成以下步骤:
- 打开 Amazon EC2 控制台。
- 选择实例,然后选择实例。
- 在网络选项卡,网络接口中,记下辅助网络接口的子网 ID。
- 打开 Amazon VPC 控制台。
- 选择子网,然后记下该子网 ID 所列的 IPv4 CIDR 范围。
- 要应用网络配置,请运行以下命令:
netplan --debug apply
在不同子网中为 Debian 12 配置辅助 ENI
Debian 12 默认使用 systemd-networkd 进行网络配置。当您将辅助 ENI 放置在不同的子网中时,必须创建带有基于源地址的路由规则的策略路由表。如果没有这些规则,来自辅助接口的流量将使用主接口的默认路由,从而导致流量失败。
重要信息: 本节介绍不同子网的配置。上面的 Ubuntu 部分仅涵盖相同子网的配置。
完成以下步骤:
-
确认 systemd-networkd 是活动网络服务:
for SVC in networking systemd-networkd NetworkManager; do echo "${SVC}: $(systemctl is-active "${SVC}")"; done预期输出:
networking: inactive systemd-networkd: active NetworkManager: inactive如果 systemd-networkd 未处于活动状态,请在继续之前将其激活。
-
在将配置设为持久化之前,先手动测试配置:
IF=ens6 IP=10.0.2.100 CIDR=10.0.2.64/26 GW=10.0.2.65 TABLE=101 sudo ip link set $IF up mtu 9001 sudo ip addr add $IP/26 dev $IF sudo ip route add $CIDR dev $IF proto static src $IP table $TABLE sudo ip route add default via $GW dev $IF table $TABLE sudo ip rule add from $IP/32 lookup $TABLE priority $TABLE注意: 将 ens6 替换为您的辅助接口名称,将 10.0.2.100 替换为辅助 ENI IP,将 10.0.2.64/26 替换为辅助子网 CIDR,将 10.0.2.65 替换为辅助子网的网关。
-
验证辅助接口通过其自身的网关进行路由:
ip route get 8.8.8.8 from 10.0.2.100预期输出:
8.8.8.8 from 10.0.2.100 via 10.0.2.65 dev ens6 table 101 uid 0 cache -
如果测试成功,请拆除临时配置:
sudo ip rule del from $IP/32 lookup $TABLE priority $TABLE sudo ip route flush table $TABLE sudo ip addr flush dev $IF -
创建持久化的 systemd-networkd 配置文件:
sudo touch /etc/systemd/network/60-ens6.network注意: 将 ens6 替换为您的辅助接口名称。
-
将以下内容添加到 60-ens6.network 文件中:
[Match] Name=ens6 [Link] MTUBytes=9001 [Network] Address=10.0.2.100/26 IPv6AcceptRA=no [Route] Destination=0.0.0.0/0 Gateway=10.0.2.65 Table=101 [Route] Destination=10.0.2.64/26 Scope=link PreferredSource=10.0.2.100 Table=101 [RoutingPolicyRule] From=10.0.2.100/32 Table=101 Priority=101注意: 将 ens6 替换为您的辅助接口名称,将 10.0.2.100/26 替换为辅助 ENI IP 和 CIDR,将 10.0.2.65 替换为辅助子网的网关,将 10.0.2.64/26 替换为辅助子网 CIDR。
-
重新加载网络配置:
sudo networkctl reload && sudo networkctl reconfigure ens6注意: 将 ens6 替换为您的辅助接口名称。
-
将反向路径过滤器设置为宽松模式,以允许辅助接口上的入站流量。检查当前值:
sysctl net.ipv4.conf.all.rp_filter net.ipv4.conf.ens6.rp_filter如果任一值为
1,则使用以下行创建或更新 /etc/sysctl.d/99-multihome.conf:net.ipv4.conf.all.rp_filter = 2 net.ipv4.conf.default.rp_filter = 2应用更改:
sudo sysctl --system注意: 设置
rp_filter=2会激活松散模式。这允许数据包到达辅助接口,即使返回路径使用不同的接口也是如此。 -
验证每个接口通过其各自的网关进行路由。
对于主要 ENI:
ip route get 8.8.8.8 from 10.0.2.12预期输出:
8.8.8.8 from 10.0.2.12 via 10.0.2.1 dev ens5 uid 0 cache对于辅助 ENI:
ip route get 8.8.8.8 from 10.0.2.100预期输出:
8.8.8.8 from 10.0.2.100 via 10.0.2.65 dev ens6 table 101 uid 0 cache -
重启实例并重复步骤 9 中的验证命令,以确认配置已持久化。
相关信息
This article was reviewed and updated on 2026-08-26.
相关内容
AWS 官方已更新 8 个月前
