반응형
작성일:  2024년 2월 9일

 

 

MACVLAN 가상 네트워크 포트 만들기

일반적으로 물리 네트워크 포트 1개에는 MAC address 1개, IP address 1개를 설정해서 사용한다.

(본업으로 Network 장비를 개발, 운영하는 사람이 아니라면 이런 단순한 구성이 익숙할 듯)

그런데 물리 네트워크 포트 1개에 '마치 여러 개의 네트워크 포트가 있는 것처럼' 동작하게 만들어야 할 때가 있다.

예를 들어,

  - 물리 포트 eth0에 2개 이상의 MAC address를 설정

  - 물리 포트 eth0에 2개 이상의 IP address를 설정

위 2가지를 모두 지원하는 가상 포트 타입이 'MACVLAN'이다.

[참고: Hypervisor, Virtual Machine Manager 에서 VM이 사용할 NIC 포트를 Bridge 타입으로 설정하면 위와 같은 형상이 된다)

 

Bridge 모드의 MACVLAN 포트 동작 방식 (출처: Red Hat Developer Blog)

 

아래 예시 명령과 같이 따라해보면 바로 이해가 될 듯.

(명령을 실행했던 OS: Ubuntu 22.04)

 

## 물리 NIC 포트 'eth0'에 IP address 설정
ip address add 10.1.4.55/24  dev eth0

## 물리 포트 'eth0'에 가상 포트 'macvlan1'을 만들기
ip link   add   macvlan1 link eth0 type macvlan mode bridge

## network namespace 'net1' 만들기
ip netns  add   net1

## network namespace 'net1'에 가상 포트 'macvlan1'을 추가
ip link   set   macvlan1 netns net1

## 가상 포트 'macvlan1'을 활성화(up)하기
ip netns  exec  net1 ip link set dev macvlan1 up

## 가상 포트에 IP address를 설정
ip netns  exec  net1 ip address  add 10.1.4.51/24 dev macvlan1

## IP 통신이 잘 되는지 'ping test'하기
ip netns  exec  net1 /usr/bin/ping 10.1.4.56


## 테스트 종료, 가상 포트 'macvlan1' 지우기
ip netns  exec  net1 ip link del macvlan1

 

위 예시에서 'mode bridge'로 설정한 부분이 있는데, bridge 모드 외에도 아래와 같은 다양한 모드를 설정할 수 있다.

  - Private

  - VEPA

  - Bridge

  - Passthru

  - Source

위 5 가지 모드에 대한 자세한 설명은 이 문서(Redhat Blod)를 참고할 것!

 

추천 문서

Redhat / Linux interfaces for virtual networking (2018년 10월)

https://developers.redhat.com/blog/2018/10/22/introduction-to-linux-interfaces-for-virtual-networking

 

 

 

 

 

 

 


 

 

반응형
작성일: 2024년 2월 7일

 


장비는 1대 밖에 없는데, 여러 개의 Network node가 서로 다른 MAC address & IP address를 생성하여 Network packet을 만드는 테스트를 해보고 싶다면, 아래와 같이 따라하면 된다.

 

(Case A) 기본 Network Namespace에 가상 Port를 만들기

아래 예시는 3개의 서로 다른 MAC address를 가지는 가상 network interface를 생성하고, 각 가상 network interface에 IP address를 할당하고 ping test하는 것을 보여준다.

 

$ ip link add macvlan1 link enp7s0 type macvlan mode bridge

$ ip link add macvlan2 link enp7s0 type macvlan mode bridge

$ ip link add macvlan3 link enp7s0 type macvlan mode bridge

$ ifconfig macvlan1 10.1.4.11/24

$ ifconfig macvlan2 10.1.4.12/24

$ ifconfig macvlan3 10.1.4.13/24


##
## 위 명령을 수행한 장비의 외부에서 ping을 보내면서 MAC Address가 서로 다르게 보이는지 확인한다.
##
$ ping 10.1.4.11

$ ping 10.1.4.12

$ ping 10.1.4.13

 

 

(Case B)  새 Network Namespace를 만들고, 새로운 Network Namespace에 가상 Port를 만들기

(Case A)처럼 가상 Port를 구성하여 사용했을 때, IP Address를 여러 개 사용할 수 있기는 하지만

1개의 MAC Address에 여러 개 IP Address를 Binding하게 된다.

(가상 포트에서 출발한 IP packet이 enp7s0 물리 포트를 경유해서 다른 장비로 forward되는 경우, 다른 장비에서는 MAC address가 다 똑같이 보인다)

각 IP Address마다 MAC Address를 다르게 할당하도록 하고 싶다면, 각 가상 포트마다 Network namespace를 연결해주어야 한다.

긴 설명보다는 아래 예시를 보는 것이 이해가 빠를 것이다.

 

##  MACVLAN type의 가상 포트를 생성한다.
$  ip link   add macvlan1  link enp2s0  type macvlan  mode bridge

## Network namespace를 생성한다.
$  ip netns  add net1

## 가상 포트 macvlan1을 network namespace net1에 연결한다. (연결한다 = 포함시킨다)
$  ip link   set macvlan1  netns net1

## 가상 포트에 IP address를 설정한다.
$  ip netns  exec net1  ip address  add 10.10.1.222/24  dev macvlan1

## Network namespace 'net1' 내부에서 ping 테스트한다.
$  ip netns  exec net1  /usr/bin/ping 10.10.1.2

## 
## 위 테스트에서 확인할 사항:
##   - 10.10.1.2 장비에서 'arp table'을 확인했을 때, 10.10.1.222의 mac address가
##     enp2s0 포트의 mac address와 다르게 보인다면, 구성과 테스트는 성공 !!
##


##
## 테스트가 끝났으면 가상 포트(MACVLAN Port)를 삭제한다.
##
$  ip netns  exec net1  ip link del macvlan`

 

 


 

Linux OS에서 virtual networking을 제공하는 방식이 여러 가지가 있는데, 이론적인 내용은 아래 Web docs를 참고.

(RedHat 공식 문서)

https://developers.redhat.com/blog/2018/10/22/introduction-to-linux-interfaces-for-virtual-networking

 


 

+ Recent posts