Ir para o conteúdo

Como faço minha interface de rede secundária funcionar em uma instância Ubuntu do Amazon EC2?

9 minuto de leitura
0

Quero fazer minha interface de rede secundária funcionar na minha instância Ubuntu do Amazon Elastic Compute Cloud (Amazon EC2).

Breve descrição

Importante: O uso de uma segunda interface de rede elástica destina-se a usuários avançados. Use essa solução somente quando você não puder usar uma única interface de rede.

Se você adicionar uma interface de rede secundária a uma instância que não seja do Amazon Linux EC2, poderá enfrentar problemas no fluxo de tráfego. Esses problemas ocorrem porque a interface de rede secundária encaminha o tráfego de entrada pela interface de rede primária. Como o endereço IP secundário não pertence ao endereço MAC da interface de rede primária, a interface secundária não funciona.

Observação: O Ubuntu 24.04 não exige as etapas a seguir e gerencia automaticamente essa configuração avançada.

Para fazer a interface secundária funcionar depois de criá-la, conclua as seguintes etapas:

  1. Configure a tabela de roteamento.
  2. Configure regras no banco de dados de políticas da tabela de roteamento personalizada para que o tráfego da interface secundária use a nova tabela de roteamento.

Observação: As instâncias do Amazon EC2 estão na Nuvem AWS e nem todas se beneficiam do uso de várias interfaces.

Talvez você não precise de uma segunda interface de rede para aumentar o throughput da rede. A AWS define cotas com base no tipo e no tamanho da instância, e essa configuração limita o throughput da rede. Para obter mais informações, consulte Tipos de instância do Amazon EC2.

Talvez você também não precise de uma segunda interface de rede para aumentar os endereços IP elásticos. Você não precisa adicionar endereços IP elásticos à sua instância porque a maioria das aplicações funciona bem com o DNS. Por exemplo, o Apache pode usar hosts virtuais baseados em nomes. Para obter mais informações, consulte Name-based virtual host support no site da Apache.

As etapas para adicionar uma interface de rede secundária são diferentes para os seguintes sistemas operacionais:

  • Ubuntu 14.04
  • Ubuntu 16.04
  • Ubuntu 18.04, 20.04 e 22.04
  • Debian 12 (sub-redes diferentes)

Resolução

Observação: As etapas na resolução a seguir foram testadas nas versões Linux listadas. Modifique as configurações personalizadas da sua configuração para executar as etapas a seguir com permissões de usuário-raiz. Use o usuário-raiz com sudo -i ou execute todos os comandos com sudo.

Configurar o Ubuntu 14.04 ou 16.04

Use um único arquivo para criar o arquivo de configuração da interface secundária, configurar a tabela de roteamento e, em seguida, definir as regras da política de roteamento para o Ubuntu.

Conclua as seguintes etapas:

  1. Para obter o nome da interface de rede primária, execute o seguinte comando:

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

    Exemplo de saída:

    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

    Importante: No exemplo anterior, as interfaces primárias são denominadas eth0 e eth1. No entanto, para instâncias compatíveis com redes aprimoradas, como os tipos de famílias m4 e m5, você pode ver uma inconsistência de nomenclatura. Por exemplo, a interface primária poderá ser denominada ens3 quando a secundária for eth0. Essa inconsistência de nomenclatura ocorre quando você adiciona a interface secundária enquanto a instância está em execução. Para evitar uma inconsistência de nomenclatura, adicione a interface no momento da inicialização ou reinicialize a instância. Se a interface estiver em execução, use o seguinte comando para alterar o nome:

    ip link set eth0 name ens4
    ip link set ens4 up
    ip link show ens4
  2. Crie um arquivo de configuração para a interface secundária:

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

    Observação: Substitua eth1 pelo nome da interface secundária.

    O comando abaixo é um exemplo para um único endereço IP de 172.31.21.115 com um gateway de 172.31.16.1 na interface secundária:

    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

    Observação: Substitua 172.31.21.115 pelo seu endereço IP e 172.31.16.1 pelo seu gateway. Seu gateway deve ser o primeiro endereço IP válido em sua sub-rede.
    O seguinte comando é um exemplo para vários endereços 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

    Observação: Substitua 172.31.21.115 e 172.31.18.46 pelos endereços IP e 172.31.16.1 pelo gateway.

  3. Crie o arquivo restrict-default-gw para evitar que o gateway padrão seja sobrescrito na tabela principal:

    vi /etc/dhcp/dhclient-enter-hooks.d/restrict-default-gw
  4. Adicione as seguintes linhas ao arquivo restrict-default-gw:

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

    Observação: Substitua eth0 pelo nome da sua interface primária.

  5. Reinicie a rede.
    Para o Ubuntu 14.04, execute o seguinte comando:

    (ifdown eth1 && ifup eth1)

    Para o Ubuntu 16.04, execute o seguinte comando:

    systemctl restart networking

Configurar o Ubuntu 18.04, 20.04 e 22.04

O Ubuntu 18.04, 20.04 e 22.04 usam a configuração de rede Netplan. O Netplan usa o formato YAML. A indentação correta é crítica no formato YAML. O exemplo do Netplan a seguir usa indentação de dois espaços.

Conclua as seguintes etapas:

  1. Crie um arquivo de configuração para a interface secundária:

    vi /etc/netplan/51-eth1.yaml
  2. Adicione as seguintes linhas ao arquivo 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

    Observação: Substitua as informações do exemplo anterior por informações específicas do seu caso de uso. O exemplo anterior de arquivo YAML configura dois endereços IP em eth1, a interface secundária.

Para encontrar o intervalo CIDR a ser usado no arquivo YAML, conclua as seguintes etapas:

  1. Abra o console do Amazon EC2.
  2. Escolha Instâncias e, em seguida, selecione a instância.
  3. Na guia Rede, vá até Interfaces de rede e anote o ID da sub-rede da sua interface de rede secundária.
  4. Abra o console da Amazon VPC.
  5. Escolha Sub-redes e, em seguida, anote o intervalo CIDR IPv4 listado para o ID da sub-rede.
  6. Para aplicar a configuração de rede, execute o seguinte comando:
    netplan --debug apply

Configurar o Debian 12 com um ENI secundário em outra sub-rede

O Debian 12 usa o systemd-networkd para configuração de rede por padrão. Ao colocar um ENI secundário em outra sub-rede, você deve criar uma tabela de roteamento de políticas com regras de roteamento baseadas na origem. Sem essas regras, o tráfego da interface secundária usa a rota padrão da interface primária e falha.

Importante: Esta seção aborda outra configuração de sub-rede. As seções do Ubuntu acima abrangem somente as configurações da mesma sub-rede.

Conclua as seguintes etapas:

  1. Confirme se systemd-networkd é o serviço de rede ativo:

    for SVC in networking systemd-networkd NetworkManager; do echo "${SVC}: $(systemctl is-active "${SVC}")"; done

    Saída esperada:

    networking: inactive
    systemd-networkd: active
    NetworkManager: inactive

    Se o systemd-networkd não estiver ativo, ative-o antes de continuar.

  2. Teste a configuração manualmente antes de torná-la persistente:

    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

    Observação: Substitua ens6 pelo nome da interface secundária, 10.0.2.100 pelo IP ENI secundário, 10.0.2.64/26 pelo CIDR da sub-rede secundária e 10.0.2.65 pelo gateway da sub-rede secundária.

  3. Verifique se a interface secundária é roteada por meio de seu próprio gateway:

    ip route get 8.8.8.8 from 10.0.2.100

    Saída esperada:

    8.8.8.8 from 10.0.2.100 via 10.0.2.65 dev ens6 table 101 uid 0
        cache
  4. Se o teste for bem-sucedido, desfaça a configuração temporária:

    sudo ip rule del from $IP/32 lookup $TABLE priority $TABLE
    sudo ip route flush table $TABLE
    sudo ip addr flush dev $IF
  5. Crie um arquivo de configuração persistente do systemd-networkd:

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

    Observação: Substitua ens6 pelo nome da interface secundária.

  6. Adicione o seguinte conteúdo ao arquivo 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

    Observação: Substitua ens6 pelo nome da interface secundária, 10.0.2.100/26 pelo CIDR e IP ENI secundário, 10.0.2.65 pelo gateway da sub-rede secundária e 10.0.2.64/26 pelo CIDR da sub-rede secundária.

  7. Recarregue a configuração de rede:

    sudo networkctl reload && sudo networkctl reconfigure ens6

    Observação: Substitua ens6 pelo nome da interface secundária.

  8. Defina o filtro de caminho reverso para o modo flexível para permitir o tráfego de entrada na interface secundária. Verifique os valores atuais:

    sysctl net.ipv4.conf.all.rp_filter net.ipv4.conf.ens6.rp_filter

    Se algum dos valores for 1, crie ou atualize /etc/sysctl.d/99-multihome.conf com as seguintes linhas:

    net.ipv4.conf.all.rp_filter = 2
    net.ipv4.conf.default.rp_filter = 2

    Aplique as alterações:

    sudo sysctl --system

    Observação: Configurar rp_filter=2 ativa o modo flexível. Isso permite que os pacotes cheguem à interface secundária, mesmo que o caminho de retorno use outra interface.

  9. Verifique se cada interface é roteada por meio de seu próprio gateway.

    Para o ENI primário:

    ip route get 8.8.8.8 from 10.0.2.12

    Saída esperada:

    8.8.8.8 from 10.0.2.12 via 10.0.2.1 dev ens5 uid 0
        cache

    Para o ENI secundário:

    ip route get 8.8.8.8 from 10.0.2.100

    Saída esperada:

    8.8.8.8 from 10.0.2.100 via 10.0.2.65 dev ens6 table 101 uid 0
        cache
  10. Reinicialize a instância e repita os comandos de verificação na etapa 9 para confirmar se a configuração persiste.

Informações relacionadas

Configurar tabelas de rotas

Interfaces de rede elástica

AWS OFICIALAtualizada há um mês