Cloud/GCP

[GCP/OS] 단일 instance에서 다중 Network interface 설정

달빛궁전- 2024. 1. 28. 18:26

배경
단일 instance에서 다중 NIC을 사용할 때의 방안을 찾아보고, 정리
사실 잘 사용하는 구성이 아니지만, VM 1대로 외부 public IP2개가 필요하다면.. 뭐 어째든 이렇게도 된다는 것을 정리

이번 문서의 핵심은
다중 네트워크 인터페이스를 설정하더라도 기본적으로 0.0.0.0/0 즉 지정되어 있지 않은 모든 트래픽은 default route를 타도록 되어있습니다.
만약 꼭 기본 인터페이스 외 추가된 인터페이스를 사용한다면 OS의 소스라우팅을 통해서 설정은 가능합니다.

 

  • on-premise, Cloud 공히 모두 다중 NIC설정은 됩니다.
  • 기본적으로 0.0.0.0/0에 대한 모든 트래픽은 default route를 타도록 되어 있습니다.

[전체 구성도]

 

  • 다만, 보통은 아래와 같이 어플라이언스 장비처럼
    외부로 연결되는 것은 1개, 그외 내부 네트워크 팜에 연결되는 형식이 많을 것이라 생각됩니다.

[보통 구성할일이 있다면, 이렇게 내부 zone에서 통신을 주고받는거야.. / 보통 저렇게 되어있는게 우리가 아는 방화벽 구성이다]

 

  • 테스트 환경은 다음과 같습니다.
    VPC2개 생성, 각 VPC에 NIC를 설정한 후 각 Public IP 설정

 

 

  • 기본 설정으로 테스트를 진행하면, public A, B IP 중에
    B IP는 외부로 나가지도, 들어오지도 못합니다.
    아래는 tcpdump를 통해 nic2번(public B IP)의 패킷 캡쳐를 한 부분입니다.
    외부에서 public B IP로 icmp를 보냈으나, 2번 NIC는 다음에 보낼 경로를 알지 못해 reply 패킷을 폐기해 버립니다.해당 방법을 해결하기 위한 방안은 아래와 같습니다.

  • 간단하게로는 아래와 같이 라우팅 하여 사용할 수 있습니다.
sudo ip route add "목적지IP" via "GatewayIP" dev eth1

via : 다음으로 보낼 IP주소
dev : 패킷을 보낼 네트워크 인터페이스
다만, 저경우에는 목적지 IP외에는 모두 default route 를 타게되며  
예를들어 8.8.8.8 목적지 IP를 eth1로 고정시키면, eth0에서는 8.8.8.8으로 패킷을 보낼 수가 없습니다.
  • 해당 환경에서 제일 좋은 방안은 외부에서 public IP A, B 모두 찾아올 수 있는 방안입니다.
    외부 → Public IP A
    외부 → Public IP B
    이때 제약사항은 B에서 외부로는 나갈 수 없습니다.
    목적지를 지정해서 B ip로 설정할 수 있으나 이때는 A ip로는 나갈 수 없습니다.
    또한 GCP 제약사항으로 도메인(url)을 통한 통신은 A로만 가능합니다.

 

  • 아래는 linux OS에서 사용자 라우팅을 통해 public IP B로 온 패킷을 응답할 수 있도록 하는 라우팅 방안입니다.
sudo ifconfig NIC IP_ADDRESS netmask NETMASK broadcast IP_ADDRESS mtu 1430
echo "1 rt1" | sudo tee -a /etc/iproute2/rt_tables
sudo ip route add GATEWAY src IP_ADDRESS dev NIC table rt1
sudo ip route add default via GATEWAY dev NIC table rt1
sudo ip rule add from IP_ADDRESS/PREFIX_LENGTH table rt1
sudo ip rule add to IP_ADDRESS/PREFIX_LENGTH  table rt1

 

해당 명령어를 각 설명 붙이면 아래와 같습니다.

  1. sudo ifconfig eth1 "NIC 2번 내부IP" netmask 255.255.255.255 broadcast "NIC 2번 내부IP" mtu 1430:
  • 네트워크 인터페이스 eth1을 내부 설정된 IP 주소 로 구성하며, 서브넷 마스크는 255.255.255.255로 설정됩니다 (호스트 전용) 브로드캐스트 주소역시 내부 설정된 IP로 설정되며, MTU는 1430으로 설정됩니다. MTU는 Maximum transmission unit로 NIC에서 목적지로 가는 패킷의 최대 길이를 설정해 주는 옵션입니다. 서버가 특별한 서비스를 제공하지 않는다면 1500이하로 두면 됩니다.
  1. echo "1 rt1" | sudo tee -a /etc/iproute2/rt_tables:
  • "/etc/iproute2/rt_tables" 파일에 ID가 1이고 이름이 "rt1"인 사용자 정의 라우팅 테이블을 추가합니다.
  1. sudo ip route add "GatewayIP" src "NIC 2번 내부IP" dev eth1 table rt1:
  • "rt1" 라우팅 테이블에 대상 IP가 GatewayIP인 경로를 추가하며, 소스 IP는 "NIC 2번 내부IP"이고, 나가는 네트워크 인터페이스는 eth1입니다.
  1. sudo ip route add default via 192.168.10.1 dev eth1 table rt1:
  • "rt1" 라우팅 테이블에 기본 경로를 추가하며, 기본 게이트웨이를 NIC 2번의 Gateway IP로 설정하고 나가는 네트워크 인터페이스를 eth1로 지정합니다.
  1. sudo ip rule add from 내부IP대역 (예시:192.168.10.4/20) table rt1:
  • IP 범위가 192.168.10.4/20에서 시작하는 트래픽이 "rt1" 라우팅 테이블을 사용하도록 하는 규칙을 추가합니다.
  1. sudo ip rule add to 내부IP대역 (예시:192.168.10.4/20) table rt1:
  • IP 범위가 192.168.10.4/20으로 향하는 트래픽이 "rt1" 라우팅 테이블을 사용하도록 하는 규칙을 추가합니다.

이렇게 하면, eth1 인터페이스 및 내부 IP대역 트래픽에 대한 라우팅 동작을 제어할 수 있는 사용자 정의 라우팅 테이블("rt1")을 구성할 수 있습니다.

 

위와 같이 구성하면 외부에서 ping, ssh등으로 통신 테스트를 하면 성공적으로 응답이 오는 것을 확인할 수 있습니다.

 

 

참고 :
https://cloud.google.com/vpc/docs/create-use-multiple-interfaces?hl=ko
https://groups.google.com/g/gce-discussion/c/t86EmHt13DI

 

One VM, Two Interfaces

Thanks Navi - I will take a look at the Centos information since the server is Centos 7. Thanks also for the stackoverflow lead too.  Admittedly, I did post a question there, explaining that I had already created a script that ran on a reboot and asked if

groups.google.com

 

다수의 네트워크 인터페이스가 있는 VM 만들기  |  VPC  |  Google Cloud

의견 보내기 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 다수의 네트워크 인터페이스가 있는 VM 만들기 기본적으로 Virtual Private Cloud(VPC) 네트워크의 모든

cloud.google.com

 

 

 

만약 내부IP가 dhcp고, 재부팅을 해야된다면 (위 명령어는 재부팅 되면, 삭제됩니다.)

다음 설정파일에 /etc/dhcp/dhclient-exit-hooks.d 위의 명령어를 작성해주면, 재부팅 후에도 동일하게 작동됩니다.

#!/bin/bash
#

if [[ $reason == "REBOOT" || $reason == "BOUND" ]] ; then
     sudo ifconfig NIC IP_ADDRESS netmask NETMASK broadcast IP_ADDRESS mtu 1430
     echo "1 rt1" | sudo tee -a /etc/iproute2/rt_tables
     sudo ip route add GATEWAY src IP_ADDRESS dev NIC table rt1
     sudo ip route add default via GATEWAY dev NIC table rt1
     sudo ip rule add from IP_ADDRESS/PREFIX_LENGTH table rt1
     sudo ip rule add to IP_ADDRESS/PREFIX_LENGTH  table rt1
fi

 

 

온프레미스에서도 다중 NIC인터페이스 사용시 기본 게이트웨이는 1개만 설정하도록 되어있습니다.
https://www.ni.com/en/support/documentation/supplemental/11/best-practices-for-using-multiple-network-interfaces--nics--with.html

 

Best Practices for Using Multiple Network Interfaces (NICs) with NI Products

It is becoming commonplace to have more than one Ethernet adapter in a PC or embedded controller, especially in systems where wired and wireless adapters are both present. However, the presence of more than one Network Interface Card (NIC) can cause connec

www.ni.com