📌 Open vSwitch (OVS)란?
Open vSwitch
- 서로 다른 서버의 존재하는 "가상의" 네트워크끼리 통신하기 위한 "오버레이 네트워크"를 구성하는 툴
VPN이 "사설" 네트워크끼리의 오버레이네트워크
OVS는 "가상" 네트워크끼리의 오버레이네트워크
서로 다른 서버 kvm1, kvm2 두 개의 대역을 연결해 주는 느낌
Open vSwitch (OVS)는 가상화 환경에서 네트워크 스위치를 소프트웨어로 구현한 것
클라우드, 가상 머신(VM), 컨테이너 환경에서 고성능 네트워크를 관리할 때 사용 됨.
✅ 1. Open vSwitch의 역할
일반적인 네트워크에서는 물리적 스위치를 사용하지만,
가상화 환경(KVM, Xen, Docker, Kubernetes 등)에서는 가상 스위치(OVS)가 필요함.
🔹 OVS의 주요 기능:
✔ 가상 머신(VM) 간 네트워크 연결
✔ 물리적 네트워크와 가상 네트워크 연결
✔ VLAN, VXLAN, GRE 터널링 지원
✔ SDN(Software-Defined Networking) 환경에서 사용 가능
🎯 정리
✔ OVS는 가상 네트워크 스위치
✔ VM, 컨테이너 환경에서 가상 네트워크 구성 가능
✔ ovs-vsctl 명령어로 브리지 & 포트 관리
📌 GRE 터널 (Generic Routing Encapsulation, GRE Tunnel)란?
GRE 터널은 서로 다른 네트워크를 연결하기 위해 데이터를 캡슐화(Encapsulation)하는 기술임.
VPN이나 가상 네트워크를 만들 때 자주 사용함.
✅ GRE 터널이 필요한 이유
일반적으로 라우터는 공인 IP를 통해 통신해.
하지만 내부 네트워크(사설 IP)끼리는 직접 통신할 수 없음.
🔹 GRE 터널을 사용하면?
✔ 서로 다른 네트워크(예: 192.168.1.0/24 ↔ 10.0.0.0/24)를 연결할 수 있음
✔ 캡슐화(Encapsulation)를 통해 IP 패킷을 다른 IP 패킷 속에 감싸서 전달
✔ 멀티캐스트, IPv6, MPLS 등 다양한 프로토콜 지원
실습

- DHCP 꺼주기
<srv1 vm 생성>
2 X 2 core 8GB 20GB
vm & hostname : srv1
IP : 211.183.3.10 /24
OS : centos7 minimal
초기 설정
방화벽 & 셀리눅스 off & 레포 수정
sed -i s/SELINUX=enforcing/SELINUX=disabled/g /etc/selinux/config
reboot
systemctl stop firewalld
systemctl disable firewalld
cat <<EOF> /etc/yum.repos.d/CentOS-Base.repo
[base]
name=CentOS-$releasever - Base
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
baseurl=https://vault.centos.org/7.9.2009/os/x86_64/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
#released updates
[updates]
name=CentOS-$releasever - Updates
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates&infra=$infra
baseurl=https://vault.centos.org/7.9.2009/updates/x86_64/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras&infra=$infra
baseurl=https://vault.centos.org/7.9.2009/extras/x86_64/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-$releasever - Plus
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus&infra=$infra
baseurl=https://vault.centos.org/7.9.2009/centosplus/x86_64/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
#contrib - packages by Centos Users
[contrib]
name=CentOS-$releasever - Contrib
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=contrib&infra=$infra
baseurl=https://vault.centos.org/7.9.2009/contrib/x86_64/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
[root@srv1 ~]# yum install -y epel-release
[root@srv1 ~]# yum install -y openvswitch bridge-utils net-tools
[root@srv1 ~]# systemctl stop NetworkManager
[root@srv1 ~]# systemctl disable NetworkManager
# 네트워크 매니저 off 및 비활성화
[root@srv1 ~]# yum -y install epel-release https://www.rdoproject.org/repos/rdo-release.rpm
# 패키지 목록 업데이트
위에서 openvswitch를 설치해 줘도 systemctl status openvswitch를 했을 때 아무것도 안 나오다면 밑에 있는 레포를 복붙 하면 됨

[root@srv1 ~]# yum -y install wget openssl-devel gcc make python-devel openssl-devel kernel-devel graphviz kernel-debug-devel autoconf automake rpm-build redhat-rpm-config libtool python-twisted-core python-zope-interface PyQt4 desktop-file-utils libcap-ng-devel groff checkpolicy selinux-policy-devel
[root@srv1 ~]# mkdir -p ~/rpmbuild/SOURCES
[root@srv1 ~]# wget http://openvswitch.org/releases/openvswitch-2.5.4.tar.gz
[root@srv1 ~]# cp openvswitch-2.5.4.tar.gz ~/rpmbuild/SOURCES/
[root@srv1 ~]# tar xfz openvswitch-2.5.4.tar.gz
[root@srv1 ~]# rpmbuild -bb --nocheck openvswitch-2.5.4/rhel/openvswitch-fedora.spec
[root@srv1 ~]# yum localinstall ~/rpmbuild/RPMS/x86_64/openvswitch-2.5.4-1.el7.x86_64.rpm
[root@srv1 ~]# systemctl status openvswitch

- 활성화되면 안 됨, 아직 실행시켜 주면 안 됨!!!!!!!!!!!!
[root@srv1 ~]# yum install -y bridge-utils net-tools
[root@srv1 ~]# yum install -y openvswitch bridge-utils net-tools
# 패키지 설치
[root@srv1 ~]# cd /etc/sysconfig/network-scripts/

여기서부터 혹시 모르니까 스냅샷을 한 개 찍어두자
[root@srv1 ~]# cd /etc/sysconfig/network-scripts/
[root@srv1 network-scripts]#
여기서 스냅샷을 한번 더 찍어줌
[root@srv1 network-scripts]# vi ifcfg-ovsbr0
DEVICE=ovsbr0
DEVICETYPE=ovs
TYPE=OVSBridge
BOOTPROTO=none
NAME=ovsbr0
ONBOOT=yes
DNS1=8.8.8.8
IPADDR=211.183.3.10
PREFIX=24
GATEWAY=211.183.3.2
NM_CONTROLLED=no

[root@srv1 network-scripts]# vi ifcfg-eth0
NAME=eth0
DEVICE=eth0
DEVICETYPE=ovs
BOOTPROTO=none
TYPE=OVSPort
ONBOOT=yes
OVS_BRIDGE=ovsbr0
NM_CONTROLLED=no
[root@srv1 network-scripts]# vi /etc/default/grub
# 인터페이스 이름 수정을 위한 부트로더파일 수정.

[root@srv1 network-scripts]# grub2-mkconfig -o /boot/grub2/grub.cfg
# 반영
[root@srv1 network-scripts]# systemctl enable openvswitch
[root@srv1 network-scripts]# init 6
ifconfig 입력하면 ovsbr0에 ip가 부여받은 걸 확인할 수 있음

[root@srv1 ~]# yum -y install qemu-kvm libvirt virt-install virt-viewer virt-manager libguestfs*
# kvm관련 패키지들 설치.
[root@srv1 ~]# vi /etc/libvirt/qemu.conf

# 주석 해제
shift + ;
set mu
442
[root@srv1 ~]# systemctl enable --now libvirtd
[root@srv1 ~]# ovs-vsctl show


# ovs-vsctl show를 했을 때 현재 ovsbr0라는 스위치에 포트가 두 개 있는데, 하나는 eth0 다른 하나는 ovsbr0 임.
vswitch1 생성
우리는 현재 kvm에서 만든 vm들을 ovs에 두고 싶은 상황이다.
이를 위해 kvm에서 vswitch1이라는 네트워크를 하나 만들어주자.

[root@srv1 ~]# cd /etc/libvirt/qemu/networks/
- 경로 설정해 주고
[root@srv1 networks]# vi vswitch1.xml
<network>
<name>vswitch1</name>
<forward mode='bridge'/>
<bridge name='vswitch1'/>
<virtualport type='openvswitch'/>
</network>
# 대역대가 정의되지 않은 네트워크 생성.
[root@srv1 networks]# virsh net-define vswitch1.xml
- 실수로 여기까지 srv2에 하고 있었음 원래는 srv1 해야 됨
[root@srv1 networks]# virsh net-start vswitch1
[root@srv1 networks]# virsh net-autostart vswitch1


# kvm상에 네트워크가 잘 정의되어 활성화된 걸 확인 가능.
[root@srv1 networks]# ovs-vsctl add-br vswitch1
- bridge=br=스위치, ovs상에 vswitch1이라는 스위치를 추가.
[root@srv1 networks]# ovs-vsctl show
8d21ca65-7a0a-44e0-a2a3-f9c6ce36e4d3
Bridge "vswitch1"
Port "vswitch1"
Interface "vswitch1"
type: internal
Bridge "ovsbr0"
Port "eth0"
Interface "eth0"
Port "ovsbr0"
Interface "ovsbr0"
type: internal
ovs_version: "2.5.4"
[root@srv1 networks]# wget https://download.cirros-cloud.net/0.5.2/cirros-0.5.2-x86_64-disk.img
# 위에서 만든 스위치에 연결시킬 vm을 만들기 위해 cirros 이미지를 다운
[root@srv1 networks]# mkdir /vm
# vm들을 둘 디렉터리 생성
[root@srv1 networks]# mv cirros-0.5.2-x86_64-disk.img /vm/cirros.img
[root@srv1 networks]# cp /vm/cirros.img /vm/c1.img
[root@srv1 networks]# cp /vm/cirros.img /vm/c2.img
[root@srv1 networks]# cp /vm/cirros.img /vm/c3.img
[root@srv1 networks]# cp /vm/cirros.img /vm/c4.img
[root@srv1 networks]# chmod 777 -R /vm
# 테스트 용도로 4개의 이미지 복사
[root@srv1 networks]# virt-install --name c1 --ram=512 --disk /vm/c1.img --import --network virtualport_type='openvswitch',source=vswitch1,target=port1 --noautoconsole --graphics=vnc
# 가상의 포트 타입(virtualport_type='openvswitch')은 openvswitch
# source=vswitch1 이 포트는 vswitch이라는 이름을 갖는 ovs에 존재하는 포트이며
# target=port1 해당 포트의 이름은 port1이다. 이름은 내가 정하기 나름.
[root@srv1 networks]# virt-install --name c2 --ram=512 --disk /vm/c2.img --import --network virtualport_type='openvswitch',source=vswitch1,target=port2 --noautoconsole --graphics=vnc
# 비슷한 방식으로 c2를 한 개 더 만들자.

srv1
[root@srv1 networks]# virsh console c1
# 콘솔 접속
$ sudo ip a add 192.168.100.10/24 dev eth0
# eth0 인터페이스 장치의 아이피는 192.168.100.10/24
다시 세션을 복제해서
[root@srv1 networks]# virsh console c2
$ sudo ip a add 192.168.100.20/24 dev eth0
# eth0 인터페이스 장치의 아이피는 192.168.100.10/24

<srv2>
2 X 2 core 8GB 20GB
vm & hostname : srv2
IP : 211.183.3.20 /24
OS : centos7 minimal
실습) srv2에서 vswitch1을 구성하시고, port5, port6에 연결된 c5, c6을 만들어보세요. c5, c6에서 c1, c2로 통신이 되는지 확인해 보세요. srv2에서 스냅샷 한개 찍고 해 보세요.
[root@srv2 networks]# vi vswitch1.xml
<network>
<name>vswitch1</name>
<forward mode='bridge'/>
<bridge name='vswitch1'/>
<virtualport type='openvswitch'/>
</network>
[root@srv2 networks]# virsh net-define vswitch1.xml
[root@srv2 networks]# virsh net-start vswitch1
[root@srv2 networks]# virsh net-auto vswitch1
[root@srv2 networks]# virsh net-autostart vswitch1
[root@srv2 networks]# ovs-vsctl add-br vswitch1
[root@srv2 networks]# mkdir /vm
[root@srv2 networks]# cd /vm
[root@srv2 vm]# wget https://download.cirros-cloud.net/0.5.2/cirros-0.5.2-x86_64-disk.img
[root@srv2 vm]# cp cirros-0.5.2-x86_64-disk.img c5.img
[root@srv2 vm]# cp cirros-0.5.2-x86_64-disk.img c6.img
[root@srv2 vm]# cp cirros-0.5.2-x86_64-disk.img c7.img
[root@srv2 vm]# chmod 777 -R .

srv2
# 비슷한 방식으로 c2에 콘솔 접속하여 ip를 192.168.100.20/24로 구성해 보자.
[root@srv2 networks]# virsh console c1
# 콘솔 접속
$ sudo ip a add 192.168.100.50/24 dev eth0
[root@srv2 networks]# virsh console c2
# 콘솔 접속
$ sudo ip a add 192.168.100.60/24 dev eth0
# 너무도 당연하게, 같은 호스트(srv1)의 같은 스위치에 연결되어 있으므로 c2에서 c1으로 통신이 잘된다.
srv1에서 srv2에 ping이 잘 가는 걸 확인할 수 있음.
srv1

srv2


# vpn 할 때도 peer와 local을 정했던 것처럼 여기서도 ovs를 통해 비슷한 걸 할 예정임
[root@srv1 networks]# ovs-vsctl add-port vswitch1 gre12 -- set interface gre12 type=gre option:remote_ip=211.183.3.20
# srv1에서 srv2(211.183.3.20) 상대를 지정
[root@srv2 vm]# ovs-vsctl add-port vswitch1 gre21 -- set interface gre21 type=gre option:remote_ip=211.183.3.10
# srv2에서 srv1(211.183.3.10) 상대를 지정


# 양쪽에서 gre터널링을 구성 후에 c6에서 c1으로 통신이 되는 걸 확인 가능함. = 같은 스위치(커다란 스위치)에 연결되었고, 이미 ip대역은 동일하게 설정해 놓은 상태임.
=> 우리의 궁극적인 목적은 이렇게 서로 다른 호스트에 존재하는 VM끼리 통신이 됨


# 하나의 스위치이기 때문에 vlan으로 나눌 수도 있을 것 임.
distributed switch(분산스위치) = 보라색
srv1
virt-install --name c3 --ram=512 --disk /vm/c3.img --import --network virtualport_type='openvswitch',source=vswitch1,target=port3 --noautoconsole --graphics=vnc
virt-install --name c4 --ram=512 --disk /vm/c4.img --import --network virtualport_type='openvswitch',source=vswitch1,target=port4 --noautoconsole --graphics=vnc
c3의 ip설정
sudo ip addr add 192.168.100.30/24 dev eth0
c4의 ip설정
sudo ip addr add 192.168.200.40/24 dev eth0
[root@srv11 vm]# ovs-vsctl set port port3 tag=10
# vlan 10 태깅
[root@srv11 vm]# ovs-vsctl set port port4 tag=20
# vlan 20 태깅
srv2
virt-install --name c7 --ram=512 --disk /vm/c7.img --import --network virtualport_type='openvswitch',source=vswitch1,target=port7 --noautoconsole --graphics=vnc
virt-install --name c8 --ram=512 --disk /vm/c8.img --import --network virtualport_type='openvswitch',source=vswitch1,target=port8 --noautoconsole --graphics=vnc
c7의 ip설정
sudo ip addr add 192.168.100.70/24 dev eth0
c8의 ip설정
sudo ip addr add 192.168.200.80/24 dev eth0
[root@srv22 vm]# ovs-vsctl set port port3 tag=10
# vlan 10 태깅
[root@srv22 vm]# ovs-vsctl set port port4 tag=20
# vlan 20 태깅


오류/ 해결 방안
1. 파일 수정할 때 첫 번째 줄 #이 그대로인지 확인 잘해주기


🚨 ERROR: Unable to create tap device port1: Device or resource busy 해결 방법
이 오류는 네트워크 인터페이스(port1)가 이미 사용 중이거나, Open vSwitch가 제대로 설정되지 않아서 발생하는 거야.


먼저 생성해 줬지만 안 보이는 파일 먼저 삭제하고 다시 설치해 주겠습니다.

삭제를 하고 다시 생성했는데도 에러가 발생함.

포트를 안 바꿔줘서 그랬던 것... 허허
'AWS Cloud School 8기 > 서버가상화_클라우드 이미지' 카테고리의 다른 글
KVM(CLI) (2) | 2025.03.05 |
---|---|
KVM(Kernel-Based Virtual Machine)/ kvmnet (5) | 2025.02.20 |
Site-to-Site VPN (2) | 2025.02.17 |
Server-Client VPN/ 와이파이 대역 활용한 실습 (0) | 2025.02.13 |
VyOS 실습 (코드만) (1) | 2025.02.11 |