장비는 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를 참고.
C language, Go(Golang), Netfilter, Netlink를 이용하여 Linux network을 제어하고 모니터링하는 방법을 알아보자~
개념 이해하기: Netfilter hooks into Linux networking packet flows
The following schematic shows packet flows through Linux networking:
Linux Netfilter + C example code
참고 문서: https://pr0gr4m.github.io/linux/kernel/netfilter/ 이론 설명과 함께 잘 동작하는 예시가 있어서 쉽게 이해할 수 있다. 아래는 위 블로그의 끝 부분에 있는 HTTP Traffic만 선별하여 Drop하는 예제 코드인데, 그냥 이 예제 코드만 봐도 이해할 수 있을 것이다.