Red Hat Training

A Red Hat training course is available for RHEL 8

44장. RHEL 8의 eBPF 네트워킹 기능 이해

eBPF(Extended Berkeley Packet Filter)는 커널 공간에서 코드를 실행할 수 있는 커널 내 가상 시스템입니다. 이 코드는 제한된 기능 집합만 액세스할 수 있는 제한된 샌드박스 환경에서 실행됩니다.

네트워킹에서는 eBPF를 사용하여 커널 패킷 처리를 보완하거나 교체할 수 있습니다. 사용하는 후크에 따라 eBPF 프로그램에는 다음이 포함됩니다. 예를 들면 다음과 같습니다.

  • 패킷 데이터 및 메타 데이터에 대한 읽기 및 쓰기 액세스
  • 소켓 및 경로를 찾을 수 있습니다.
  • 소켓 옵션을 설정할 수 있습니다
  • 패킷을 리디렉션할 수 있습니다

44.1. RHEL 8의 네트워킹 eBPF 기능 개요

확장 eBPF(extended Berkeley Packet Filter) 네트워킹 프로그램을 RHEL의 다음 후크에 연결할 수 있습니다.

  • XDP(Express Express Data Path): 커널 네트워킹 스택이 처리하기 전에 수신된 패킷에 대한 초기 액세스를 제공합니다.
  • TC eBPF (직접 동작 플래그 포함): 수신 및 송신에서 강력한 패킷 처리를 제공합니다.
  • Control Groups 버전 2 (cgroup v2): 제어 그룹의 프로그램에서 수행하는 소켓 기반 작업을 필터링하고 재정의할 수 있습니다.
  • 소켓 필터링: 소켓에서 수신된 패킷 필터링을 활성화합니다. 이 기능은 cBPF(Certified Berkeley Packet Filter)에서도 제공되었지만 eBPF 프로그램을 지원하도록 확장되었습니다.
  • 스트림 구문 분석기: 스트림을 개별 메시지로 분할하고 필터링하고 소켓으로 리디렉션할 수 있습니다.
  • SO_REUSEPORT 소켓 선택: reuseport 소켓 그룹에서 수신 소켓의 프로그래밍 가능 선택을 제공합니다.
  • 흐름 분산 장치: 커널이 특정 상황에서 패킷 헤더를 구문 분석하는 방법을 재정의할 수 있습니다.
  • TCP 혼잡 제어 콜백: 사용자 지정 TCP 혼잡 제어 알고리즘을 구현할 수 있습니다.
  • 캡슐화가 있는 경로: 사용자 지정 터널 캡슐화를 생성할 수 있습니다.

Red Hat은 RHEL에서 사용 가능하며 여기에 설명된 모든 eBPF 기능을 지원하지 않습니다. 자세한 내용 및 개별 후크의 지원 상태는 RHEL 8 릴리스 노트 및 다음 개요를 참조하십시오.

XDP

BPF_PROG_TYPE_XDP 유형의 프로그램을 네트워크 인터페이스에 연결할 수 있습니다. 그런 다음 커널은 커널 네트워크 스택 처리를 시작하기 전에 수신된 패킷에서 프로그램을 실행합니다. 따라서 빠른 패킷 삭제와 같은 특정 상황에서 빠른 패킷 전달을 통해 분산된 서비스 거부(DDoS) 공격 및 로드 밸런싱 시나리오에 대한 빠른 패킷 리디렉션을 방지할 수 있습니다.

XDP를 다양한 형태의 패킷 모니터링 및 샘플링에도 사용할 수 있습니다. 커널을 사용하면 XDP 프로그램에서 패킷을 수정하고 커널 네트워크 스택에 추가 처리를 위해 패킷을 전달할 수 있습니다.

사용 가능한 XDP 모드는 다음과 같습니다.

  • 네이티브(드라이버) XDP: 커널은 패킷 수신 중에 가능한 가장 빠른 지점에서 프로그램을 실행합니다. 현재 커널은 패킷을 구문 분석하지 않았으므로 커널에서 제공하는 메타데이터를 사용할 수 없습니다. 이 모드에서는 네트워크 인터페이스 드라이버가 XDP를 지원해야 하지만 일부 드라이버가 이 기본 모드를 지원하지는 않습니다.
  • 일반 XDP: 커널 네트워크 스택은 처리 초기에 XDP 프로그램을 실행합니다. 이 시점에서 커널 데이터 구조가 할당되었으며 패킷이 미리 처리되었습니다. 패킷을 삭제하거나 리디렉션해야 하는 경우 네이티브 모드에 비해 상당한 오버헤드가 필요합니다. 그러나 일반 모드에서는 네트워크 인터페이스 드라이버가 지원할 필요가 없으며 모든 네트워크 인터페이스에서 작동합니다.
  • 오프로드된 XDP: 커널은 호스트 CPU 대신 네트워크 인터페이스에서 XDP 프로그램을 실행합니다. 이 작업에는 특정 하드웨어가 필요하며 이 모드에서 특정 eBPF 기능만 사용할 수 있습니다.

RHEL에서 libxdp 라이브러리를 사용하여 모든 XDP 프로그램을 로드합니다. 이 라이브러리를 사용하면 시스템 제어 XDP 사용을 사용할 수 있습니다.

참고

현재 XDP 프로그램에 대한 몇 가지 시스템 구성 제한 사항이 있습니다. 예를 들어 수신 인터페이스에서 특정 하드웨어 오프로드 기능을 비활성화해야 합니다. 또한 기본 모드를 지원하는 모든 드라이버에서 일부 기능을 사용할 수 있는 것은 아닙니다.

RHEL 8.7에서 Red Hat은 다음 조건이 모두 적용되는 경우에만 XDP 기능을 지원합니다.

  • AMD 또는 Intel 64비트 아키텍처에서 XDP 프로그램을 로드합니다.
  • libxdp 라이브러리를 사용하여 프로그램을 커널에 로드합니다.
  • XDP 프로그램은 XDP 하드웨어 오프로딩을 사용하지 않습니다.

또한 Red Hat은 지원되지 않는 기술 프리뷰로 XDP 기능을 다음과 같이 사용합니다.

  • AMD 및 Intel 64비트가 아닌 아키텍처에 XDP 프로그램 로드. libxdp 라이브러리는 AMD 및 Intel 64비트 이외의 아키텍처에서는 사용할 수 없습니다.
  • XDP 하드웨어 오프로딩.

AF_XDP

패킷을 필터링하고 지정된 AF_XDP 소켓으로 리디렉션하는 XDP 프로그램을 사용하면 AF_XDP 프로토콜 제품군에서 하나 이상의 소켓을 사용하여 커널에서 사용자 공간으로 패킷을 빠르게 복사할 수 있습니다.

RHEL 8.7에서 Red Hat은 지원되지 않는 기술 프리뷰로 이 기능을 제공합니다.

트래픽 제어

트래픽 제어(tc) 하위 시스템은 다음과 같은 유형의 eBPF 프로그램을 제공합니다.

  • BPF_PROG_TYPE_SCHED_CLS
  • BPF_PROG_TYPE_SCHED_ACT

이러한 유형을 사용하면 eBPF에서 사용자 정의 tctc 작업을 작성할 수 있습니다. tc 에코시스템의 부분과 함께 이것은 강력한 패킷 처리 기능을 제공하며 여러 컨테이너 네트워킹 오케스트레이션 솔루션의 핵심 요소입니다.

대부분의 경우 classifier만 direct-action 플래그와 마찬가지로 eBPF 분류기에서 동일한 eBPF 프로그램에서 직접 작업을 실행할 수 있습니다. clsact Queueing Discipline (qdisc)은 Ingress 측에서 이를 사용하도록 설계되었습니다.

flow dissector eBPF 프로그램을 사용하면 다른 일부 qdiscstc ECDHE의 작동에 영향을 미칠 수 있습니다.

eBPF for tc 기능은 RHEL 8.2 이상에서 완전하게 지원됩니다.

소켓 필터

소켓에서 수신된 패킷 필터링을 위해 여러 유틸리티에서 CBPF(Certified Berkeley Packet Filter)를 사용하거나 사용했습니다. 예를 들어 tcpdump 유틸리티를 사용하면 사용자가 표현식을 지정할 수 있으며 tcpdump 는 cBPF 코드로 변환됩니다.

cBPF의 대안으로, 커널은 동일한 목적으로 BPF_PROG_TYPE_SOCKET_FILTER 유형의 eBPF 프로그램을 허용합니다.

RHEL 8.7에서 Red Hat은 지원되지 않는 기술 프리뷰로 이 기능을 제공합니다.

컨트롤 그룹

RHEL에서는 cgroup에 연결할 수 있는 여러 유형의 eBPF 프로그램을 사용할 수 있습니다. 지정된 cgroup의 프로그램이 작업을 수행할 때 커널은 이 프로그램을 실행합니다. cgroup 버전 2만 사용할 수 있습니다.

RHEL에서는 다음 네트워킹 관련 cgroup eBPF 프로그램을 사용할 수 있습니다.

  • BPF_PROG_TYPE_SOCK_OPS: 커널은 다양한 TCP 이벤트에서 이 프로그램을 호출합니다. 프로그램은 사용자 지정 TCP 헤더 옵션을 포함하여 커널 TCP 스택의 동작을 조정할 수 있습니다.
  • BPF_PROG_TYPE_CGROUP_SOCK_ADDR: 커널은 connect,bind to ,sendto,recvmsg,getpeername, getsockname 작업 중에 이 프로그램을 호출합니다. 이 프로그램을 통해 IP 주소 및 포트를 변경할 수 있습니다. 이는 eBPF에서 소켓 기반 NAT(네트워크 주소 변환)를 구현할 때 유용합니다.
  • BPF_PROG_TYPE_CGROUP_SOCKOPT: 커널은 setsockoptgetsockopt 작업 중에 이 프로그램을 호출하고 옵션을 변경할 수 있습니다.
  • BPF_PROG_TYPE_CGROUP_SOCK: 커널은 소켓 생성, 소켓 해제 및 주소 바인딩 중에 이 프로그램을 호출합니다. 이러한 프로그램을 사용하여 작업을 허용하거나 거부하거나 통계에 대한 소켓 생성을 검사하는 데만 사용할 수 있습니다.
  • BPF_PROG_TYPE_CGROUP_SKB: 이 프로그램은 수신 및 송신에서 개별 패킷을 필터링하고 패킷을 수락하거나 거부할 수 있습니다.
  • BPF_PROG_TYPE_CGROUP_SYSCTL: 이 프로그램을 사용하면 시스템 제어 (sysctl)에 대한 액세스를 필터링할 수 있습니다.
  • BPF_CGROUP_INET4_GETPEERNAME,BPF_CGROUP_INET6_GETPEERNAME,BPF_CGROUP_INET4_GETSOCKNAME, BPF_CGROUP_INET6_GETSOCKNAME: : 이러한 프로그램을 사용하면 getsocknamegetpeername 시스템 호출 결과를 덮어쓸 수 있습니다. 이는 eBPF에서 소켓 기반 NAT(네트워크 주소 변환)를 구현할 때 유용합니다.

RHEL 8.7에서 Red Hat은 지원되지 않는 기술 프리뷰로 이 기능을 제공합니다.

스트림 구문

스트림 구문 분석기는 특수 eBPF 맵에 추가된 소켓 그룹에서 작동합니다. 그런 다음 eBPF 프로그램은 커널이 해당 소켓을 수신하거나 보내는 패킷을 처리합니다.

RHEL에서는 다음 스트림 구문 분석기 eBPF 프로그램을 사용할 수 있습니다.

  • BPF_PROG_TYPE_SK_SKB: eBPF 프로그램은 소켓에서 수신한 패킷을 개별 메시지로 구문 분석하고 커널에 해당 메시지를 삭제하거나 그룹의 다른 소켓으로 보내도록 지시합니다.
  • BPF_PROG_TYPE_SK_MSG: 이 프로그램은 송신 메시지를 필터링합니다. eBPF 프로그램은 패킷을 개별 메시지로 구문 분석하고 패킷을 승인 또는 거부합니다.

RHEL 8.7에서 Red Hat은 지원되지 않는 기술 프리뷰로 이 기능을 제공합니다.

SO_REUSEPORT 소켓 선택

이 소켓 옵션을 사용하여 여러 소켓을 동일한 IP 주소 및 포트에 바인딩할 수 있습니다. eBPF가 없으면 커널은 연결 해시를 기반으로 수신 소켓을 선택합니다. BPF_PROG_TYPE_SK_REUSEPORT 프로그램을 사용하면 수신 소켓을 완전히 프로그래밍할 수 있습니다.

RHEL 8.7에서 Red Hat은 지원되지 않는 기술 프리뷰로 이 기능을 제공합니다.

흐름 분산 섹터

커널이 전체 프로토콜 디코딩을 거치지 않고 패킷 헤더를 처리해야 하는 경우, 분산 됩니다. 예를 들어 tc 하위 시스템, 다중 경로 라우팅, 본딩의 또는 패킷 해시 계산 시 이러한 상황이 발생합니다. 이 경우 커널은 패킷 헤더를 구문 분석하고 패킷 헤더의 정보로 내부 구조를 채웁니다. 이 내부 구문 분석은 BPF_PROG_TYPE_FLOW_DISSECTOR 프로그램을 사용하여 교체할 수 있습니다. RHEL의 eBPF에서 IPv4 및 IPv6을 통해서만 TCP 및 UDP를 차단할 수 있습니다.

RHEL 8.7에서 Red Hat은 지원되지 않는 기술 프리뷰로 이 기능을 제공합니다.

TCP 혼잡 제어

struct tcp_congestion_oops 콜백을 구현하는 BPF_PROG_TYPE_STRUCT_OPS 프로그램 그룹을 사용하여 사용자 지정 TCP 정체 제어 알고리즘을 작성할 수 있습니다. 이러한 방식으로 구현된 알고리즘을 시스템에서 기본 제공 커널 알고리즘과 함께 사용할 수 있습니다.

RHEL 8.7에서 Red Hat은 지원되지 않는 기술 프리뷰로 이 기능을 제공합니다.

캡슐화가 있는 경로

다음 eBPF 프로그램 유형 중 하나를 터널 캡슐화 특성으로 라우팅 테이블의 경로에 연결할 수 있습니다.

  • BPF_PROG_TYPE_LWT_IN
  • BPF_PROG_TYPE_LWT_OUT
  • BPF_PROG_TYPE_LWT_XMIT

이러한 eBPF 프로그램의 기능은 특정 터널 구성으로 제한되며 일반 캡슐화 또는 캡슐화 해제 솔루션을 생성할 수 없습니다.

RHEL 8.7에서 Red Hat은 지원되지 않는 기술 프리뷰로 이 기능을 제공합니다.

소켓 조회

바인딩 시스템 호출의 제한을 우회하려면 BPF_PROG_TYPE_SK_LOOKUP 유형의 eBPF 프로그램을 사용하십시오. 이러한 프로그램은 새로 들어오는 TCP 연결에 대해 수신 대기 소켓 또는 UDP 패킷에 대해 연결되지 않은 소켓을 선택할 수 있습니다.

RHEL 8.7에서 Red Hat은 지원되지 않는 기술 프리뷰로 이 기능을 제공합니다.