跳至内容

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

5 分钟阅读
0

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

简述

重要信息: 辅助弹性网络接口的使用适用于高级用户。仅当您无法使用单个网络接口时才使用此解决方案。

如果您向非 Amazon Linux EC2 实例添加辅助网络接口,则可能会遇到流量传输问题。出现这些问题的原因是辅助网络接口通过主网络接口路由传入流量。由于辅助 IP 地址不属于主网络接口的 MAC 地址,因此辅助接口不起作用。

注意: Ubuntu 24.04 不需要以下步骤,它会自动处理此高级配置。

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

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

注意: 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 设置路由策略规则。

完成以下步骤:

  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
    ip link show ens4
  2. 为辅助接口创建配置文件:

    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.115172.31.18.46 替换为您的 IP 地址,将 172.31.16.1 替换为您的网关。

  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 示例使用双空格缩进。

完成以下步骤:

  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
              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. 选择实例,然后选择实例。
  3. 网络选项卡,网络接口中,记下辅助网络接口的子网 ID。
  4. 打开 Amazon VPC 控制台
  5. 选择子网,然后记下该子网 ID 所列的 IPv4 CIDR 范围。
  6. 要应用网络配置,请运行以下命令:
    netplan --debug apply

在不同子网中为 Debian 12 配置辅助 ENI

Debian 12 默认使用 systemd-networkd 进行网络配置。当您将辅助 ENI 放置在不同的子网中时,必须创建带有基于源地址的路由规则的策略路由表。如果没有这些规则,来自辅助接口的流量将使用主接口的默认路由,从而导致流量失败。

重要信息: 本节介绍不同子网的配置。上面的 Ubuntu 部分仅涵盖相同子网的配置。

完成以下步骤:

  1. 确认 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 未处于活动状态,请在继续之前将其激活。

  2. 在将配置设为持久化之前,先手动测试配置:

    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 替换为辅助子网的网关。

  3. 验证辅助接口通过其自身的网关进行路由:

    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
  4. 如果测试成功,请拆除临时配置:

    sudo ip rule del from $IP/32 lookup $TABLE priority $TABLE
    sudo ip route flush table $TABLE
    sudo ip addr flush dev $IF
  5. 创建持久化的 systemd-networkd 配置文件:

    sudo touch /etc/systemd/network/60-ens6.network

    注意:ens6 替换为您的辅助接口名称。

  6. 将以下内容添加到 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。

  7. 重新加载网络配置:

    sudo networkctl reload && sudo networkctl reconfigure ens6

    注意:ens6 替换为您的辅助接口名称。

  8. 将反向路径过滤器设置为宽松模式,以允许辅助接口上的入站流量。检查当前值:

    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 会激活松散模式。这允许数据包到达辅助接口,即使返回路径使用不同的接口也是如此。

  9. 验证每个接口通过其各自的网关进行路由。

    对于主要 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
  10. 重启实例并重复步骤 9 中的验证命令,以确认配置已持久化。

相关信息

配置路由表

弹性网络接口

AWS 官方已更新 18 天前