Open vSwitch 데이터 경로 및 Linux 브리지

Open vSwitch 데이터 경로 및 Linux 브리지

저는 Open vSwitch가 Linux 인프라의 내부 요소, 특히 OVS 브리지와 br-xx(Linux 브리지)의 차이점을 어떻게 활용하는지 이해하려고 노력하고 있습니다. 나는 이 분야에 익숙하지 않기 때문에 여러 수준에서 틀릴 수 있습니다.

배경: 지금까지 나는 가상 네트워크를 생성하기 위해 네트워크 네임스페이스를 사용하여 호스트(네트워크의 끝점)를 시뮬레이션할 수 있고 veth 쌍을 두 노드를 연결하는 링크로 사용할 수 있다는 것을 알고 있습니다. 또한 iproute2 패키지를 사용하면 브리지(br-xx)를 설정하고 여기에 가상 인터페이스를 추가하여 가상 네트워크를 완성할 수 있습니다.

OVS 브리지와 iproute2에서 만든 Linux 브리지의 차이점을 이해하기 위해 mininet 코드를 살펴보았습니다. 내가 알 수 있는 한 가지는 mininet이 ovs-vsctl을 사용하여 OVS 브리지를 생성한다는 것입니다. 나는 OVS 코드를 탐색하여 실제로 어떻게 설정되어 있는지, 그리고 Linux 브리지와 어떻게 다른지 알아보았지만 큰 성공을 거두지 못했습니다.

질문: OVS 브리지(ovs-vsctl을 사용하여 생성됨)와 Linux 브리지(iproute2를 사용하여 생성됨)의 내부 차이점은 무엇입니까? 나는 직관적으로 둘 다 뒤에 있는 두 개의 서로 다른 커널 모듈을 기반으로 한다고 생각합니다(Open vSwitch의 맥락에서 데이터 경로라고 하며 Linux 브리지의 커널 모듈이 무엇인지는 확실하지 않습니다). 내 직감이 맞나요? 그렇다면 자체 커널 모듈을 생성하고 이를 "백엔드"로 사용하여 브리지를 설정하려면 어떻게 해야 합니까?

답변1

여기서 약간의 이해를 공유하면, 이 수준/측면에 많은 노력을 기울이지 않기 때문에 이것은 생각만큼 낮은 수준이 아닐 수 있습니다.

첫째, Linux 브리지는 커널 스택에 의존합니다.단순 L2 전달. 즉, 패킷은 시스템 ARP 캐시에 저장된 매핑 규칙 src_mac에 따라 전달됩니다.in_port

전달 규칙 나열(매핑) iproute2:

$ ip neigh show
192.168.157.2 dev ens33 lladdr f0:50:54:fd:b2:34 STALE
192.168.157.254 dev ens33 lladdr f0:50:54:fd:b2:34 STALE

구식이지만 인쇄가 예쁜 명령을 사용하십시오 arp.

$ arp -n
Address                  HWtype  HWaddress           Flags Mask            Iface
192.168.157.2            ether   f0:50:54:fd:b2:34   C                     ens33
192.168.157.254          ether   f0:50:54:fd:b2:34   C                     ens33

또한 모든 일반 네트워크 도구는 Linux 브리지(veth pair, tun/tap)의 장치에서 제대로 작동합니다.

flow table대신 OVS는 각각 및 라고 하는 자체 전달 테이블과 전달 규칙을 유지 관리합니다 flow. 패킷이 OVS 브리지에 들어가면 흐름(규칙)과 일치하는지 확인한 다음 규칙에 지정된 작업을 수행합니다. 이 전달 메커니즘은 더욱 유연하고 확장 가능하며 가장 중요하게는 프로그래밍이 가능합니다.

다음 흐름표의 두 번째 규칙을 예로 들어 보겠습니다.

$ ovs-ofctl dump-flows br-int
NXST_FLOW reply (xid=0x4):
 cookie=0x9661, duration=8986958.206s, table=0, n_packets=2285, n_bytes=82852, idle_age=0, hard_age=65534, priority=1 actions=NORMAL
 cookie=0x9661, duration=2944224.063s, table=0, n_packets=148, n_bytes=32018, idle_age=0, hard_age=65534, priority=3,in_port=1,dl_vlan=18 actions=mod_vlan_vid:43,NORMAL
 cookie=0x9661, duration=8986823.648s, table=0, n_packets=9151, n_bytes=17148, idle_age=0, hard_age=65534, priority=3,in_port=1,dl_vlan=21 actions=mod_vlan_vid:7,NORMAL
  • in_port=1일치 기준: VLAN 태그 18( )이 있는 포트 1( )의 dl_vlan=18수신 패킷 (이 OVS 브리지로)
  • 조치: 데이터 패킷의 VLAN 태그를 43( )으로 수정한 다음 OVS 브리지 내에서 mod_vlan_vid=43일반 L2 전달을 수행합니다 ( )( ).NORMALbr-int

해당 src_mac:in_port매핑은 자체 fdb(전달 데이터베이스)에도 저장됩니다.

$ ovs-appctl fdb/show br-int
 port  VLAN  MAC                Age
    1     5  fb:26:3f:e8:1e:1c  298
    1     8  fb:26:3f:b7:26:55  297

구체적으로,흐름 테이블에 다른 규칙이 지정되지 않은 경우 OVS 브리지는 기본 규칙( action=NORMAL)을 따르고 일반 Linux 브리지와 마찬가지로 일반 L2 전달을 수행합니다..

둘째, OVS는 커널 스택에서 패킷을 추출하므로 커널 스택에 의존하는 네트워크 도구는 OVS tcpdump에서 패킷을 캡처할 수 없는 등 OVS 장치(포트)에서 작동을 중지할 수 patch port있으며 iptables규칙은 OVS에서 작동하지 않습니다. 포트 둘 중 하나를 사용하십시오.

세 번째, 구현과 관련하여: Linux 브리지는 매우 간단합니다. 아마도 커널 스택에서 가장 초기의 네트워크 장치 중 하나일 것이며, 단 몇 백 줄의 코드만 있으면 됩니다. 확인해 보세요.여기에 코드를 입력하세요커널 5.1에서. 이와 대조적으로 OVS 코드는 프로그래밍 가능하고 강력하며 효율적이며 모든 기능을 갖춘 OpenFlow 스위치로 처리해야 할 부분이 많기 때문에 훨씬 더 복잡합니다. 최신 정보를 얻으려면 기능이 더 적은 이전 버전을 확인하세요.

관련 정보