본문 바로가기
AWS Cloud School 8기/서버가상화_클라우드 이미지

Open vSwitch/ openvswitch 실행 안될 때

by YUNZEE 2025. 3. 6.
728x90

📌 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가 제대로 설정되지 않아서 발생하는 거야.

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

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

 포트를 안 바꿔줘서 그랬던 것... 허허

 

728x90