macvlan = 하나의 NIC 위에 “MAC이 다른 여러 장비”를 만드는 기술 (L2 확장)
ipvlan = 하나의 NIC 위에 “IP만 다른 여러 endpoint”를 만드는 기술 (L3 확장)
기술이 발전하면서 서버1대에 여러개의 컨테이너를 만들어 여러개의 서비스를 실행할 수 있게 되었다.
그런데 이 각각의 컨테이너를 완전히 독립된 장비처럼 만들고싶어서 나온 기술이 macvlan과 ipvlan이다.
기존 컨테이너 네트워크는 NAT 기반으로 동작하기 때문에 외부 네트워크에서 컨테이너를 독립된 장비처럼 직접 접근하기 어려웠다.
그래서 진짜 서버처럼 보이지도 않았다.
그래서 물리 nic를 공유하면서 여러개의 가상 네트워크 인터페이스를 만들어 네트워크 엔트포인트가 되게 했다.
일단 컨테이너들은 호스트의 커널을 공유한다.
[ Container1 ] [ Container2 ]
│ │
└──────┬────────┘
↓
Host Kernel
↓
eth0
따라서 cpu, memeory , kernel을 전부 공유하며 namespace를 통해 격리된다.
또한 컨테이너끼리의 통신은 물리 NIC를 통하지 않고 커널 내부 네트워크를 통해 처리가 된다.
이러한 구조 때문에 컨테이너는 기본적으로 호스트 뒤에 존재하는 논리적인 네트워크 엔드포인트로 동작한다.
-> 이러한 한계를 해결하기 위해 등장한 기술이 macvlan과 ipvlan이다.

하나의 물리 인터페이스 위에 여러개의 논리 가상 인터페이스를 생성하고, 각 가상 인터페이스에 서로 다른 IP를 가지게 만드는 기술이다. 이때 mac주소는 물리 nic의 mac주소를 공유한다.
이 기술을 통해 하나의 서버안의 여러개의 컨테이너들이 하나의 장비처럼 보이면서도 ip 기반으로 독립적인 통신을 수행할 수 있게 된다.
(스위치 입장에서는 하나의 mac주소만 보이니까 하나의 장비처럼 보임)
[물리 랜카드]
│
eth0
┌──────┼
ipvlan0 ipvlan1
│ │
container container

각 가상 인터페이스가 서로 다른 mac주소와 ip 주소를 가지도록 만드는 데이터링크 기반 네트워크 가상화 기술이다.
이 기술을 통해 하나의 서버에서 실행되는 여러개의 컨테이너들이 같은 LAN에 존재하는 독립적인 물리 장비처럼 동작하게 만들 수 있다.
[물리 랜카드]
│
eth0 (parent)
┌──────-┼──────┐
macvlan0 macvlan1
│ │
container container
IPvlan은 설계상 호스트( parent 인터페이스)를 내부 Peer로 취급 하지 않는다. IPvlan드라이버의 내부 전달 대상은 child 인터페이스 뿐이다.
결과적으로 host와 child간의 통신은 차단되게 된다.
macvlan은 하나의 물리 NIC 위에 여러 개의 가상 인터페이스를 생성하고, 각각에게 독립적인 MAC 주소를 부여하는 기술이다.
-> 따라서 스위치 입장에서는 각각을 독립된 장비로 인식한다.
목적지 MAC이 같은 호스트의 다른 macvlan 인터페이스라면 커널 내부에서 직접 전달할 수 있다.
즉, 물리 NIC나 스위치를 거치지 않는다.
macvlan은 설계상 Parent 인터페이스(eth0)와 Child 인터페이스(macvlan0, macvlan1 등) 간의 직접 통신을 허용하지 않는다.
-> 따라서 패킷은 macvlan 드라이버 내부에서 전달되지 않는다.
결과적으로 Host와 Container 간 통신은 기본적으로 차단된다.
macVLAN과 ipVLAN은 결국 네트워크를 분리하고 가상화한다는 개념이기 때문에 리눅스에서 이렇게 불리는 거고, os, 서비스마다 다른 이름으로 해당 기술을 사용하고 있다.
예를 들어, Virtualbox에서는 macVLAN과 동이라한 기술을 bridged apater라고 한다.