[Daily morning study] SDN (Software Defined Networking)๊ณผ OpenFlow ๊ฐ๋
#daily morning study
์ ํต์ ์ธ ๋คํธ์ํฌ์ ํ๊ณ
๊ธฐ์กด ๋คํธ์ํฌ ์ฅ๋น(๋ผ์ฐํฐ, ์ค์์น)๋ ์ ์ด ๋ก์ง๊ณผ ํจํท ์ ๋ฌ ๊ธฐ๋ฅ์ด ํ๋์ ์ฅ๋น์ ํตํฉ๋์ด ์๋ค. ๊ฐ ์ฅ๋น๊ฐ ๋ ์์ ์ผ๋ก ๊ฒฝ๋ก๋ฅผ ๊ณ์ฐํ๊ณ , ์ฅ๋น๋ง๋ค ๋ฐ๋ก CLI๋ก ์ ๊ทผํด์ ์ค์ ํด์ผ ํ๋ค. ๋๊ท๋ชจ ๋ฐ์ดํฐ์ผํฐ ํ๊ฒฝ์์๋ ์ด๋ฐ ๋ฐฉ์์ ๋ช ๊ฐ์ง ๋ฌธ์ ๊ฐ ์๊ธด๋ค.
- ๋คํธ์ํฌ ์ ์ฑ ๋ณ๊ฒฝ ์ ์๋ฐฑ ๋์ ์ฅ๋น๋ฅผ ์ผ์ผ์ด ์ค์ ํด์ผ ํจ
- ๋ฒค๋(Cisco, Juniper ๋ฑ)์ ์ข ์๋ ๋ ์ ์ํํธ์จ์ด์ ํ๋์จ์ด
- ํธ๋ํฝ ํจํด ๋ณํ์ ์ ์ฐํ๊ฒ ๋์ํ๊ธฐ ์ด๋ ค์
- ์๋ํ์ ํ๋ก๊ทธ๋๋ฐ์ด ์ ํ์
SDN์ด๋?
SDN(Software Defined Networking)์ ๋คํธ์ํฌ์ ์ ์ด ํ๋ฉด(Control Plane)๊ณผ ๋ฐ์ดํฐ ํ๋ฉด(Data Plane)์ ๋ถ๋ฆฌํด์, ์ค์ ์ง์คํ ์ํํธ์จ์ด ์ปจํธ๋กค๋ฌ๋ก ๋คํธ์ํฌ ์ ์ฒด๋ฅผ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก ๊ด๋ฆฌํ๋ ์ํคํ ์ฒ๋ค.
ํต์ฌ ์์ด๋์ด๋ ๊ฐ๋จํ๋ค. ๋ผ์ฐํ ๊ฒฐ์ ์ ์ค์ ์ปจํธ๋กค๋ฌ๊ฐ ํ๊ณ , ์ค์์น/๋ผ์ฐํฐ๋ ๊ทธ ๊ฒฐ์ ์ ๋ฐ๋ผ ํจํท์ ์ ๋ฌํ๋ ๋จ์ํ ์ฅ๋น๋ก ๋ง๋๋ ๊ฒ์ด๋ค.
SDN 3๊ณ์ธต ์ํคํ ์ฒ
SDN์ ์ธ ๊ฐ์ ๊ณ์ธต์ผ๋ก ๊ตฌ์ฑ๋๋ค.
| ๊ณ์ธต | ์ญํ | ์์ |
|---|---|---|
| Application Layer | ๋คํธ์ํฌ ์ ์ฑ ์ ์, ๋น์ฆ๋์ค ๋ก์ง | ๋ก๋๋ฐธ๋ฐ์, ๋ฐฉํ๋ฒฝ, ํธ๋ํฝ ์์ง๋์ด๋ง ์ฑ |
| Control Layer | ์ค์ ์ง์ค์ ์ ์ด, ๊ธ๋ก๋ฒ ๋คํธ์ํฌ ๋ทฐ | SDN ์ปจํธ๋กค๋ฌ (ONOS, OpenDaylight) |
| Infrastructure Layer | ์ค์ ํจํท ์ ๋ฌ, ํฌ์๋ฉ | OpenFlow ์ง์ ์ค์์น, ๋ผ์ฐํฐ |
Application Layer โ Control Layer ์ฌ์ด์ ์ธํฐํ์ด์ค๋ฅผ Northbound API(์ฃผ๋ก REST)๋ผ๊ณ ํ๊ณ ,
Control Layer โ Infrastructure Layer ์ฌ์ด๋ฅผ Southbound API(์ฃผ๋ก OpenFlow)๋ผ๊ณ ํ๋ค.
Control Plane๊ณผ Data Plane ๋ถ๋ฆฌ
Control Plane(์ ์ด ํ๋ฉด)์ ์ด๋ค ๊ฒฝ๋ก๋ก ํจํท์ ๋ณด๋ผ์ง ๊ฒฐ์ ํ๋ ๋๋ ์ญํ ์ด๋ค. ๋ผ์ฐํ ํ๋กํ ์ฝ(OSPF, BGP ๋ฑ)์ด ์ฌ๊ธฐ์ ์ํ๋ค.
Data Plane(๋ฐ์ดํฐ ํ๋ฉด)์ ๊ฒฐ์ ๋ ๊ฒฝ๋ก์ ๋ฐ๋ผ ์ค์ ๋ก ํจํท์ ํฌ์๋ฉํ๋ ์ญํ ์ด๋ค. FIB(Forwarding Information Base)๋ฅผ ์ฐธ์กฐํด์ ํจํท์ ๋ณด๋ธ๋ค.
์ ํต ๋คํธ์ํฌ์์๋ ๋ ๊ธฐ๋ฅ์ด ๊ฐ์ ์ฅ๋น์ ์๋ค. SDN์ Control Plane์ ๋ฝ์๋ด์ ์ค์ ์ปจํธ๋กค๋ฌ๋ก ์ฎ๊ธด๋ค.
[์ ํต ๋คํธ์ํฌ]
๋ผ์ฐํฐ A: Control Plane + Data Plane
๋ผ์ฐํฐ B: Control Plane + Data Plane
๋ผ์ฐํฐ C: Control Plane + Data Plane
โ ๊ฐ์ ๋
๋ฆฝ์ ์ผ๋ก ๊ฒฝ๋ก ๊ณ์ฐ
[SDN]
SDN ์ปจํธ๋กค๋ฌ: Control Plane (์ ์ฒด ํ ํด๋ก์ง ํ์
)
โ OpenFlow
์ค์์น A: Data Plane๋ง
์ค์์น B: Data Plane๋ง
์ค์์น C: Data Plane๋ง
โ ์ปจํธ๋กค๋ฌ ์ง์์ ๋ฐ๋ผ ํจํท ์ ๋ฌ
OpenFlow ํ๋กํ ์ฝ
OpenFlow๋ SDN ์ปจํธ๋กค๋ฌ์ ๋คํธ์ํฌ ์ค์์น ์ฌ์ด์ ํ์ค ํต์ ํ๋กํ ์ฝ์ด๋ค. ONF(Open Networking Foundation)์์ ๊ด๋ฆฌํ๋ค.
์ปจํธ๋กค๋ฌ๋ OpenFlow๋ฅผ ํตํด ์ค์์น์ ํ๋ก์ฐ ํ ์ด๋ธ(Flow Table)์ ์ง์ ์ฝ๊ณ ์ด๋ค.
ํ๋ก์ฐ ํ ์ด๋ธ ๊ตฌ์กฐ
ํ๋ก์ฐ ํ ์ด๋ธ์ ๊ฐ ํญ๋ชฉ(Flow Entry)์ ์ธ ๋ถ๋ถ์ผ๋ก ๊ตฌ์ฑ๋๋ค.
| ๊ตฌ์ฑ ์์ | ์ค๋ช |
|---|---|
| Match Fields | ํจํท๊ณผ ๋งค์นญํ ์กฐ๊ฑด (IP ์ฃผ์, ํฌํธ, MAC ์ฃผ์, VLAN ID ๋ฑ) |
| Priority | ์ฌ๋ฌ ๋ฃฐ์ด ๋งค์นญ๋ ๋ ์ฐ์ ์์ |
| Actions | ๋งค์นญ๋ ํจํท์ ์ํํ ๋์ |
| Counters | ๋งค์นญ ํ์, ๋ฐ์ดํธ ์ ํต๊ณ |
Actions ์ข ๋ฅ
OUTPUT: ์ง์ ํ ํฌํธ๋ก ํจํท ์ ์กDROP: ํจํท ๋ฒ๋ฆผFLOOD: ๋ชจ๋ ํฌํธ๋ก ๋ธ๋ก๋์บ์คํธCONTROLLER: ์ปจํธ๋กค๋ฌ๋ก ํจํท ์ ๋ฌ (์ฒ์ ๋ณด๋ ํจํท ์ฒ๋ฆฌ)MODIFY_FIELD: ํค๋ ํ๋ ์์ (NAT, QoS ๋ฑ)
ํจํท ์ฒ๋ฆฌ ํ๋ฆ
ํจํท ์์
โ
Flow Table ์กฐํ (Match)
โ
๋งค์นญ๋จ? โโYESโโโ Action ์คํ (์ ๋ฌ, ๋๋กญ ๋ฑ)
โ
NO
โ
Packet-In ๋ฉ์์ง๋ก ์ปจํธ๋กค๋ฌ์ ์ ๋ฌ
โ
์ปจํธ๋กค๋ฌ๊ฐ ๊ฒฝ๋ก ๊ณ์ฐ ํ Flow Rule ์ค์น
โ
์ค์์น๊ฐ Flow Entry์ ๋ฐ๋ผ ํจํท ์ ๋ฌ
์ฒ์ ๋ณด๋ ํ๋ก์ฐ์ ์ฒซ ๋ฒ์งธ ํจํท์ ์ปจํธ๋กค๋ฌ๋ก ์ฌ๋ผ๊ฐ์ ์ฒ๋ฆฌ๋๋ค. ์ปจํธ๋กค๋ฌ๊ฐ Flow Entry๋ฅผ ์ค์นํ๋ฉด ์ดํ ๊ฐ์ ํ๋ก์ฐ์ ํจํท์ ์ค์์น๊ฐ ์ง์ ์ฒ๋ฆฌํ๋ค.
์ฃผ์ SDN ์ปจํธ๋กค๋ฌ
ONOS (Open Network Operating System)
AT&T, ๊ตฌ๊ธ ๋ฑ ํต์ ์ฌ ์ค์ฌ์ผ๋ก ๊ฐ๋ฐ๋ ์คํ์์ค ์ปจํธ๋กค๋ฌ. ๊ณ ๊ฐ์ฉ์ฑ๊ณผ ๋ถ์ฐ ๊ตฌ์กฐ๋ฅผ ์ง์ํ๋ค. ๋๊ท๋ชจ WAN ํ๊ฒฝ์ ๊ฐํ๋ค.
OpenDaylight (ODL)
๋ฆฌ๋ ์ค ์ฌ๋จ ์ฐํ์ ์คํ์์ค ํ๋ก์ ํธ. Java ๊ธฐ๋ฐ์ด๋ฉฐ ๋ค์ํ ๋จํฅ ํ๋กํ ์ฝ(OpenFlow, NETCONF, OVSDB ๋ฑ)์ ์ง์ํ๋ค.
Ryu
Python์ผ๋ก ์์ฑ๋ ๊ฒฝ๋ SDN ์ปจํธ๋กค๋ฌ. ํ์ต๊ณผ ํ๋กํ ํ์ดํ์ ์ ํฉํ๋ค.
# Ryu ์ปจํธ๋กค๋ฌ ์์ - Packet-In ํธ๋ค๋ฌ
from ryu.base import app_manager
from ryu.controller import ofp_event
from ryu.controller.handler import MAIN_DISPATCHER, set_ev_cls
from ryu.ofproto import ofproto_v1_3
class SimpleSwitch(app_manager.RyuApp):
OFP_VERSIONS = [ofproto_v1_3.OFP_VERSION]
@set_ev_cls(ofp_event.EventOFPPacketIn, MAIN_DISPATCHER)
def packet_in_handler(self, ev):
msg = ev.msg
datapath = msg.datapath # ์ค์์น
ofproto = datapath.ofproto
parser = datapath.ofproto_parser
# ๋ชจ๋ ํฌํธ๋ก ํจํท ํ๋ฌ๋
actions = [parser.OFPActionOutput(ofproto.OFPP_FLOOD)]
out = parser.OFPPacketOut(
datapath=datapath,
buffer_id=msg.buffer_id,
in_port=msg.match['in_port'],
actions=actions
)
datapath.send_msg(out)
SDN์ ์ฅ์
์ค์ ์ง์ค์ ๊ด๋ฆฌ: ์ ์ฒด ๋คํธ์ํฌ๋ฅผ ํ ๊ณณ์์ ๋ณผ ์ ์์ด์ ์ ์ฑ ์ ์ฉ์ด ์ฝ๊ณ ์ผ๊ด์ฑ์ด ๋๋ค.
ํ๋ก๊ทธ๋๋ฐ ๊ฐ๋ฅ์ฑ: API๋ก ๋คํธ์ํฌ๋ฅผ ์ฝ๋๋ก ์ ์ดํ ์ ์์ด์ ์๋ํ์ CI/CD ํ์ดํ๋ผ์ธ ํตํฉ์ด ๊ฐ๋ฅํ๋ค.
ํ๋์จ์ด ๋ ๋ฆฝ์ฑ: ํ์ดํธ๋ฐ์ค ์ค์์น(๋ฒ์ฉ ํ๋์จ์ด)์ OpenFlow๋ฅผ ์ฌ๋ ค์ ๋น์ฉ์ ์ค์ผ ์ ์๋ค.
์ธ๋ฐํ ํธ๋ํฝ ์ ์ด: ํ๋ก์ฐ ๋จ์๋ก ๊ฒฝ๋ก์ ์ ์ฑ ์ ์ค์ ํ ์ ์์ด์ ํธ๋ํฝ ์์ง๋์ด๋ง์ด ์ ์ฐํ๋ค.
SDN์ ๋จ์
์ปจํธ๋กค๋ฌ ๋จ์ผ ์ฅ์ ์ : ์ปจํธ๋กค๋ฌ๊ฐ ์ฃฝ์ผ๋ฉด ์ ์ฒด ๋คํธ์ํฌ๊ฐ ๋ง๋น๋ ์ ์๋ค. ์ปจํธ๋กค๋ฌ ์ด์คํ ํ์.
์ง์ฐ: ์๋ก์ด ํ๋ก์ฐ๋ง๋ค ์ปจํธ๋กค๋ฌ ํต์ ์ด ํ์ํด์ ์ฒซ ๋ฒ์งธ ํจํท ์ฒ๋ฆฌ์ ์ง์ฐ์ด ์๊ธด๋ค.
ํ์ฅ์ฑ: ๋๊ท๋ชจ ๋คํธ์ํฌ์์ ์ปจํธ๋กค๋ฌ๊ฐ ์ฒ๋ฆฌํด์ผ ํ๋ ํ๋ก์ฐ ์ค์ ์์ฒญ์ด ๋ณ๋ชฉ์ด ๋ ์ ์๋ค.
๋ ๊ฑฐ์ ํธํ์ฑ: ๊ธฐ์กด ๋คํธ์ํฌ ์ฅ๋น์์ ํผ์ฉ์ด ๋ณต์กํ๋ค.
์ค์ ํ์ฉ ์ฌ๋ก
๊ตฌ๊ธ B4: ๊ตฌ๊ธ ๋ฐ์ดํฐ์ผํฐ ๊ฐ WAN(Wide Area Network)์ SDN์ ์ ์ฉํด์ ๋งํฌ ํ์ฉ๋ฅ ์ 95% ์ด์์ผ๋ก ๋์ด์ฌ๋ฆฐ ์ฌ๋ก๋ค. ๊ธฐ์กด IP ๋ผ์ฐํ ์ผ๋ก๋ 40~60%๊ฐ ํ๊ณ์๋ค.
๋ฐ์ดํฐ์ผํฐ ๊ฐ์ํ: VMware NSX, Open vSwitch(OVS) ๊ธฐ๋ฐ ์ค๋ฒ๋ ์ด ๋คํธ์ํฌ. ๊ฐ์ ๋จธ์ ๊ฐ ํธ๋ํฝ์ SDN์ผ๋ก ์ ์ดํ๋ค.
5G ์ฝ์ด ๋คํธ์ํฌ: 3GPP ํ์ค์์ 5G ์ฝ์ด๋ SDN/NFV ๊ธฐ๋ฐ์ ๋ถ๋ฆฌ๋ ์ ์ด/๋ฐ์ดํฐ ํ๋ฉด ๊ตฌ์กฐ๋ฅผ ์ฑํํ๋ค.
NFV์์ ๊ด๊ณ
SDN๊ณผ ์์ฃผ ๋ฌถ์ด๋ ๊ฐ๋ ์ผ๋ก NFV(Network Functions Virtualization)๊ฐ ์๋ค.
| ย | SDN | NFV |
|---|---|---|
| ๋ชฉ์ | ๋คํธ์ํฌ ์ ์ด ์ํํธ์จ์ดํ | ๋คํธ์ํฌ ๊ธฐ๋ฅ ์ํํธ์จ์ดํ |
| ๋์ | ์ค์์น/๋ผ์ฐํฐ์ Control Plane | ๋ฐฉํ๋ฒฝ, IDS, ๋ก๋๋ฐธ๋ฐ์ ๋ฑ |
| ๊ฒฐ๊ณผ | ํ๋ก๊ทธ๋๋จธ๋ธ ๋คํธ์ํฌ | ๊ฐ์ ๋คํธ์ํฌ ์ดํ๋ผ์ด์ธ์ค |
SDN๊ณผ NFV๋ ์ํธ ๋ณด์์ ์ด๋ค. SDN์ ํธ๋ํฝ ๊ฒฝ๋ก๋ฅผ ๊ฒฐ์ ํ๊ณ , NFV๋ ๊ทธ ๊ฒฝ๋ก ์์ ๊ฐ์ ๋คํธ์ํฌ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.