Ubuntu EC2 인스턴스에서 보조 네트워크 인터페이스를 사용하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2021년 1월 19일

Ubuntu Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스에서 보조 네트워크 인터페이스를 사용하려면 어떻게 해야 합니까?

간략한 설명

경고: 보조 탄력적 네트워크 인터페이스는 고급 사용자를 위한 것입니다. 단일 네트워크 인터페이스를 사용할 수 없고 동일한 서브넷에 속하는 두 개의 네트워크 인터페이스를 단일 인스턴스에 연결해야 하는 경우에만 두 번째 탄력적 네트워크 인터페이스를 사용해야 합니다. 비대칭 라우팅 문제를 방지하려면 탄력적 네트워크 인터페이스를 1개만 사용하거나 중복된 탄력적 네트워크 인터페이스를 겹치지 않는 서브넷에 배치합니다.

비 Amazon Linux EC2 인스턴스에 보조 네트워크 인터페이스를 추가하면 트래픽 흐름 문제가 발생합니다. 이러한 문제는 기본 및 보조 네트워크 인터페이스가 동일한 서브넷에 위치하고 게이트웨이 1개를 포함하는 라우팅 테이블이 1개이기 때문에 발생합니다. 보조 네트워크 인터페이스를 통해 들어오는 트래픽은 기본 네트워크 인터페이스를 통해 인스턴스에서 나갑니다. 하지만 보조 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

중요: 이전 예제에서 주 인터페이스에는 eth0, eth1 등의 이름이 지정됩니다. 그러나, 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 형식을 사용하므로 들여쓰기가 중요합니다. 아래 예제에서는 2칸 들여쓰기를 사용합니다.

참고: 루트 사용자 권한으로 모든 명령을 실행합니다. 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

이 문서가 도움이 되었나요?


결제 또는 기술 지원이 필요합니까?