개요
OVS를 간단히 알아보기 위해서는 먼저, SDN 개념을 살짝 이해하면 좋다.
필자도 아주 살짝.. 이해하고 있으며, 관련 용어를 정리한 문서를 아래 링크로 첨부하였다.
본 페이지에서는 SDN 컨트롤러 없이 OVS에서 제공하는 CLI 만을 사용해 Data Plane의 라우팅 경로를 수정해보는 튜토리얼을 소개한다.
OVS 튜토리얼 진행을 위해 네트워크 토폴로지 셋팅을 해주어야 함으로 먼저, 리눅스 컨테이너인 LXC를 사용해 토폴로지 셋팅을 진행한다. 그 후 OVS에서 제공하는 CLI를 통해 튜토리얼을 진행한다.
따라서, 본 페이지의 목차는 아래와 같다.
- LXC를 활용해 OVS 테스트 환경 셋팅
- OVS CLI 스크립트를 테스트 환경에 적용
- 테스트 결과
1. LXC를 활용해 OVS 테스트 환경 셋팅
OVS 테스트를 위해 네트워크 토폴로지 환경을 셋팅해야 함으로 Host 머신에 LXC와 OVS를 설치해준다.
필자는 Host 머신으로 Ubuntu 22.04를 사용했다.
$ sudo apt-get install lxc lxc-templates
$ sudo apt-get install openvswitch-switch
LXC 관련 패키지를 Host 머신에 설치하였으면, 이제 위 그림과 같은 토폴로지 셋팅을 위해 3개의 LXC를 Host 머신에 올려주면 된다.
$ sudo lxc-create -n ubuntu-lxc-1 -t ubuntu
$ sudo lxc-create -n ubuntu-lxc-2 -t ubuntu
$ sudo lxc-create -n ubuntu-lxc-3 -t ubuntu
$ sudo lxc-ls --fancy
lxc-create 명령으로 3개의 LXC를 Host 머신에 올린 뒤, lxc-ls 명령을 사용하면 3개의 LXC가 STOPPED 상태로 Host 머신에 올라간 것을 확인할 수 있다.
이제 올라간 3개의 LXC의 콘솔로 접근하여서 OVS 테스트에 필요한 패키지를 설치해주도록 하자.
Ubuntu 타입 LXC의 초기 ID/PW : ubuntu/ubuntu
(host)$ sudo lxc-start -n ubuntu-lxc-1
(host)$ sudo lxc-start -n ubuntu-lxc-2
(host)$ sudo lxc-start -n ubuntu-lxc-3
(host)$ sudo lxc-console -n ubuntu-lxc-1
(ubuntu-lxc-1)$ sudo apt-get install net-tools tcpdump arping
(ubuntu-lxc-1)$ sudo shutdown -h now
(host)$ sudo lxc-console -n ubuntu-lxc-2
(ubuntu-lxc-2)$ sudo apt-get install net-tools tcpdump arping
(ubuntu-lxc-2)$ sudo shutdown -h now
(host)$ sudo lxc-console -n ubuntu-lxc-3
(ubuntu-lxc-3)$ sudo apt-get install net-tools tcpdump arping
(ubuntu-lxc-3)$ sudo shutdown -h now
각 LXC에 OVS 테스트를 위한 패키지(net-tools, tcpdump, arping)들을 모두 설치하였다면, shutdown 명령으로 LXC를 모두 종료해준다.
LXC가 모두 종료되었다면, 이제 OVS 테스트를 위해 LXC들의 네트워크 인터페이스 설정을 수정해준다.
이 설정을 마친 뒤에는 LXC에서 외부망 접근이 불가능해진다. 그래서 먼저 필요 패키지들을 설치해준 것이다.
(host)$ sudo vi /var/lib/lxc/ubuntu-lxc-1/config
(host)$ sudo vi /var/lib/lxc/ubuntu-lxc-2/config
(host)$ sudo vi /var/lib/lxc/ubuntu-lxc-3/config
각 LXC의 설정 파일로 접근하여서 아래와 같이 파일을 수정해준다.
빨간색 박스로 되어있는 부분이 수정하거나 추가할 부분이다.
- LXC_1
/var/lib/lxc/ubuntu-lxc-1/config
- LXC_2
/var/lib/lxc/ubuntu-lxc-2/config
- LXC_3
/var/lib/lxc/ubuntu-lxc-3/config
모든 LXC의 네트워크 인터페이스 수정을 완료하였다면, LXC를 다시 구동시켜주자.
(host)$ sudo lxc-start -n ubuntu-lxc-1
(host)$ sudo lxc-start -n ubuntu-lxc-2
(host)$ sudo lxc-start -n ubuntu-lxc-3
여기까지 진행하였다면, 네트워크 토폴로지는 아래와 같다.
이제 여기서 OVS 브릿지를 중간에 추가해주어서 테스트 환경 셋팅을 마무리 해주자.
OVS 브릿지를 3개의 LXC 사이에 추가해주기 위해 OVS CLI 중 ovs-vsctl을 활용하면 된다.
마지막에 사용된 ovs-ofctl 명령은 OVS 브릿지 생성 시 초기에 브릿지 내에 존재하는 Flow Entry를 지워주기 위해서 사용하였다.
(host)$ sudo ovs-vsctl add-br ovs-br
(host)$ sudo ovs-vsctl add-port ovs-br lxc_1_eth0
(host)$ sudo ovs-vsctl add-port ovs-br lxc_2_eth0
(host)$ sudo ovs-vsctl add-port ovs-br lxc_3_eth0
(host)$ sudo ovs-ofctl del-flows ovs-br
여기까지 진행하였다면 이제 아래와 같은 OVS 테스트를 위한 네트워크 토폴로지 환경 셋팅이 완료된 것이다.
이제, OVS CLI 중 ovs-ofctl 명령을 활용해서 LXC 간의 라우팅 경로를 주기적으로 수정하는 OVS 튜토리얼을 진행해보자.
ovs-ofctl을 통해 OVS 브릿지 내의 Flow Table을 수정하여 라우팅 경로를 임의로 수정해줄 수 있다.
2. OVS CLI 스크립트를 테스트 환경에 적용
LXC 간의 라우팅 경로를 수정하기 위한 OVS CLI 스크립트는 아래와 같다.
이 스크립트를 Host 머신에서 실행시키면 LXC 간에 흐르는 패킷의 경로를 주기적으로 변경할 수 있다.
#!/bin/bash
sudo ovs-ofctl add-flow ovs-br in_port=lxc_2_eth0,actions=output:lxc_1_eth0
sudo ovs-ofctl add-flow ovs-br in_port=lxc_3_eth0,actions=output:lxc_1_eth0
sudo ovs-ofctl add-flow ovs-br in_port=lxc_1_eth0,actions=output:lxc_2_eth0
count=0
while :
do
count=$(($count + 1))
count=$(($count % 2))
if [ ${count} -eq 0 ];then
echo "sudo ovs-ofctl mod-flows ovs-br in_port=lxc_1_eth0,actions=output:lxc_2_eth0"
echo "-- Flow Table --"
sudo ovs-ofctl mod-flows ovs-br in_port=lxc_1_eth0,actions=output:lxc_2_eth0
sudo ovs-ofctl dump-flows ovs-br
else
echo "sudo ovs-ofctl mod-flows ovs-br in_port=lxc_1_eth0,actions=output:lxc_3_eth0"
echo "-- Flow Table --"
sudo ovs-ofctl mod-flows ovs-br in_port=lxc_1_eth0,actions=output:lxc_3_eth0
sudo ovs-ofctl dump-flows ovs-br
fi
echo ""
sleep 5
done
위 스크립트를 실행시키면, LXC_2와 LXC_3의 패킷은 무조건 LXC_1로 향하게 된다.
그리고 LXC_1에서 LXC_2와 LXC_3으로 향하는 패킷은 5초 간격으로 경로가 수정된다.
3. 테스트 결과
LXC_1의 콘솔로 접근해서 arping 명령을 활용해 OVS 테스트의 결과를 확인해보자.
(host)$ sudo lxc-console -n ubuntu-lxc-1
(ubuntu-lxc-1)$ sudo arping 10.1.1.2
LXC_1에서의 결과는 아래 캡처본과 같을 것이다.
LXC_1에서 arping 명령을 통해 ARP Request 패킷을 주기적으로 브로드캐스트 할 것이다.
그리고 OVS 브릿지는 LXC_1로부터 들어오는 패킷의 목적지를 LXC_2나 LXC_3으로 5초마다 변경해줄 것이다.
따라서, 결과는 위 캡처본과 같이 LXC_1의 arping 결과에 보이는 MAC 주소가 5초마다 변경되는 것을 확인할 수 있다.
LXC_1, 2, 3 모두에 tcpdump를 설치하였으므로 패킷이 어떻게 전달되는지 확인 또한 할 수 있을 것이다.
특정 LXC로 접근하여서 sudo tcpdump -i any arp -n -e를 실행시켜주면 된다.
References
https://manpages.ubuntu.com/manpages/bionic/man8/ovs-ofctl.8.html
https://stackoverflow.com/questions/31888639/the-difference-between-ovs-vsctl-and-ovs-dpctl