VPP (FD.io)

FD.io VPP(Vector Packet Processing)를 리눅스 커널 개발자 관점에서 단일 페이지(Page)로 정리합니다. 이 프로젝트에서는 VPP 항목을 하나의 문서로 유지하고, 방대한 세부 설명은 별도 VPP 전용 문서 프로젝트로 분리합니다.

별도 문서 안내: VPP에 대한 보다 상세한 내용은 별도의 독립 문서 프로젝트로 정리되어 있습니다. 상세 주제와 전체 목차는 VPP 전용 문서 사이트(minzkn.com/vpp)에서 확인할 수 있습니다. 이 페이지는 리눅스 커널 개발자 관점의 요약본으로 유지합니다.
전제 조건: 네트워크 스택(Network Stack), 라우팅(Routing), DPDK 문서를 먼저 읽으세요. VPP는 커널 네트워크 스택을 대체하는 것이 아니라, 특정 고성능 데이터 경로를 사용자 공간(User Space)에서 별도로 구성하는 방식입니다.
일상 비유: VPP는 차량을 한 대씩 처리하는 톨게이트 대신 같은 방향 차량 묶음을 한 번에 통과시키는 전용 차로와 비슷합니다. 패킷(Packet)을 벡터 단위로 묶어 같은 노드에서 연속 처리하므로 캐시(Cache) 지역성과 분기 예측(Branch Prediction) 효율을 크게 높입니다.

핵심 요약

  • 벡터 패킷 처리 — 패킷을 하나씩 처리하지 않고 배열 단위로 묶어 같은 그래프 노드를 통과시킵니다.
  • 그래프 노드 — 입력, 파싱, 룩업, 재작성, 출력, ACL, NAT, IPsec 같은 기능을 방향성 그래프로 연결합니다.
  • 커널 바이패스 — DPDK, VFIO, hugepage, memif, AF_XDP, vhost-user 같은 경로로 커널 네트워크 스택의 일부 비용을 우회합니다.
  • 세션 레이어 — VCL/VLS를 통해 TCP, UDP, TLS, QUIC 애플리케이션을 VPP 내부 전송 계층에 붙입니다.
  • 운영 경계 — VPP는 고성능 데이터 평면에 강하지만, 정책, 감사, 인증서, 배포 자동화는 별도 제어 평면 설계가 필요합니다.

단계별 이해

  1. VPP가 커널과 다른 지점을 봅니다
    커널은 범용성, 보안 경계, 드라이버 생태계가 강점입니다. VPP는 전용 코어, polling, hugepage, 벡터 처리를 통해 고정된 데이터 경로의 처리량(Throughput)과 지연(Latency) 시간을 최적화합니다.
  2. 패킷이 노드 그래프를 따라 이동하는 방식을 봅니다
    dpdk-input, ethernet-input, ip4-lookup, ip4-rewrite, interface-output처럼 노드가 이어지고, 플러그인이 feature arc에 삽입됩니다.
  3. 커널 인터페이스를 구분합니다
    TAP/TUN, AF_PACKET, AF_XDP, vhost-user, memif는 목적이 다릅니다. 개발 편의, VM 연결, 컨테이너(Container) 연결, zero-copy 서비스 체이닝 중 무엇이 중요한지 먼저 정해야 합니다.
  4. 운영 모델을 먼저 설계합니다
    CPU pinning, NUMA, hugepage, NIC queue, API socket 권한, 로그, stats segment, 무중단 변경 절차를 데이터 경로보다 늦게 설계하면 장애 분석이 어려워집니다.

개요

VPP는 Linux Foundation 산하 FD.io 프로젝트의 고성능 사용자 공간 패킷 처리 플랫폼입니다. 핵심 목표는 범용 커널 네트워크 스택이 제공하는 폭넓은 기능을 그대로 복제하는 것이 아니라, 라우터, 게이트웨이, 방화벽(Firewall), 서비스 체이닝, NFV, DPU 같은 환경에서 반복되는 패킷 처리 경로를 CPU 친화적으로 구성하는 것입니다.

커널 네트워크 스택은 시스템 콜(System Call), 소켓(Socket), sk_buff, qdisc, Netfilter, 드라이버, 네임스페이스(Namespace), cgroup과 긴밀히 통합됩니다. 반면 VPP는 vlib_buffer_t 인덱스를 중심으로 패킷 메타데이터를 전달하고, 워커 스레드(Thread)가 poll mode로 NIC 큐를 계속 확인합니다. 이 구조는 대량 패킷 처리에서는 유리하지만, 커널이 기본 제공하는 정책과 관측 지점을 직접 설계해야 한다는 비용이 있습니다.

VPP 위치와 주요 연결 경로 Linux 커널 소켓 · Netfilter · qdisc TAP/TUN · AF_XDP VFIO/UIO · vhost 제어 평면과 호환성 경로 VPP 프로세스 vlib 메인 루프 · 워커 스레드 polling · barrier sync · frame dispatch 그래프 노드 데이터 경로 L2 · L3 · ACL · NAT · IPsec · QoS Feature Arc로 기능 삽입 세션 레이어 VCL/VLS · TCP · TLS · QUIC · HTTP 애플리케이션 VCL · VLS · LD_PRELOAD 프록시 · 게이트웨이 · 테스트 앱 하드웨어 NIC · SmartNIC · DPU QAT · cryptodev · SR-IOV TAP/AF_XDP linux-cp API DPDK

아키텍처

VPP는 크게 clib, vlib, vnet, 플러그인, 애플리케이션 API 계층으로 나눌 수 있습니다. clib은 벡터, 풀, 해시(Hash), 시간 측정, 원자 연산 같은 기반 자료구조를 제공합니다. vlib은 메인 루프, 노드 등록, 프레임 전달, 버퍼(Buffer) 풀, 스레드 런타임을 담당합니다. vnet은 인터페이스, FIB, L2/L3, ACL, NAT, IPsec 같은 네트워크 기능을 구현합니다.

패킷은 포인터 대신 버퍼 인덱스로 이동합니다. 각 노드는 입력 프레임에서 버퍼 인덱스 배열을 받아 필요한 헤더를 읽고, 다음 노드 인덱스와 에러 상태를 설정합니다. 같은 노드에서 여러 패킷을 연속 처리하므로 명령어 캐시가 따뜻하게 유지되고, 루프 전개와 prefetch 패턴을 적용하기 쉽습니다.

/* VPP 그래프 노드 처리 루프의 단순화된 형태 */
while (n_left_from > 0) {
    u32 bi0 = from[0];
    vlib_buffer_t *b0 = vlib_get_buffer(vm, bi0);

    /* 현재 노드는 헤더를 읽고 다음 노드를 결정합니다. */
    next0 = classify_packet(b0);
    to_next[0] = bi0;

    from += 1;
    to_next += 1;
    n_left_from -= 1;
}

데이터 경로

VPP 데이터 경로의 시작점은 보통 dpdk-input, af-packet-input, memif-input, tap-input 같은 입력 노드입니다. 이후 이더넷 파싱, VLAN 처리, L2 브릿징, L3 FIB 룩업, adjacency rewrite, output 노드를 거쳐 NIC TX 큐나 다른 인터페이스로 나갑니다.

DPDK를 사용할 때는 hugepage, IOVA 모드, VFIO 권한, NIC queue 수, RSS 해시, NUMA 배치가 성능의 기본 조건입니다. memif는 VPP 프로세스(Process)와 외부 프로세스 사이에서 공유 메모리 기반 서비스 체이닝을 구성할 때 적합하고, AF_XDP는 커널 XDP 경로와 사용자 공간 처리를 연결해야 할 때 검토합니다. TAP/TUN은 개발과 호환성에는 편하지만, 순수 성능 기준으로는 최종 배포 경로인지 반드시 재검토해야 합니다.

경로주요 용도장점주의점
DPDK PMDNIC 직접 처리최고 처리량, poll mode, 큐 제어hugepage, VFIO, CPU 전용화 필요
memif서비스 체이닝공유 메모리, 낮은 복사 비용프로세스 생명주기와 소켓 권한 관리 필요
AF_XDPXDP와 사용자 공간 연결커널 BPF 정책과 결합 가능드라이버 지원, UMEM 구성 확인 필요
TAP/TUN개발, VM, 커널 스택 연동구성 쉬움, 디버깅(Debugging) 쉬움복사 비용과 커널 경유 비용 존재
vhost-user가상 머신 데이터 경로QEMU/virtio 연동NUMA와 queue 매핑(Mapping)이 중요

보안과 터널(Tunnel)링

VPP는 ACL, NAT44/NAT64, IPsec, WireGuard, COP, policer 같은 보안 기능을 플러그인과 feature arc 형태로 제공합니다. 커널의 Netfilter처럼 시스템 전체 기본 경로에 자동으로 걸리는 모델이 아니므로, 어느 인터페이스와 어느 arc에 기능을 붙일지 명시적으로 설계해야 합니다.

IPsec에서는 SPD, SAD, tunnel/interface 모드, IKEv2, ESP 암호화(Encryption), anti-replay, cryptodev 오프로드가 핵심입니다. NAT와 ACL은 라우팅 테이블(Routing Table), VRF, conntrack 유사 상태 관리, 세션 만료 정책과 함께 봐야 합니다. 투명 프록시를 구성할 때는 커널 TPROXY의 목적지 보존 모델과 달리, VPP 세션 레이어 또는 memif 서비스 체이닝 중 어느 지점에서 원본 5튜플을 보존할지 먼저 정해야 합니다.

보안 경계 주의: VPP API socket, stats segment, memif socket, hugepage 파일, DPDK 장치 권한은 모두 공격 표면이 됩니다. 운영 환경에서는 전용 사용자, 파일 권한, systemd sandbox, 네임스페이스, 감사 로그를 함께 적용해야 합니다.

호스트 스택

VPP 호스트 스택은 애플리케이션이 커널 TCP/IP 스택 대신 VPP 세션 레이어를 사용하도록 만드는 기능입니다. VCL(VPP Communications Library)은 애플리케이션이 직접 vppcom_* API를 호출하게 하고, VLS(VPP Library Stack)는 POSIX 소켓에 가까운 래핑을 제공합니다. 기존 바이너리를 빠르게 실험할 때는 LD_PRELOAD 방식이 유용하지만, 장기 운영에서는 직접 VCL로 세션 수명, 워커 배치, FIFO 크기를 통제하는 편이 예측 가능성이 높습니다.

/* VCL TCP 서버의 매우 단순화된 흐름 */
int ls = vppcom_session_create(VPPCOM_PROTO_TCP, 0);
vppcom_session_bind(ls, &endpt);
vppcom_session_listen(ls, 1024);

for (;;) {
    int cs = vppcom_session_accept(ls, &client, 0);
    vppcom_session_read(cs, buf, sizeof(buf));
    vppcom_session_write(cs, buf, len);
}

TLS, QUIC, HTTP

VPP의 TLS는 세션 레이어 위에 전송 프로토콜처럼 붙습니다. tlsopenssl, tlsmbedtls, tlspicotls 같은 엔진 플러그인이 실제 핸드셰이크와 레코드 암복호화를 담당하고, 상위 애플리케이션은 일반 세션 읽기/쓰기와 비슷한 흐름으로 데이터를 처리합니다. QUIC은 UDP와 TLS 1.3, 스트림 멀티플렉싱이 결합된 구조이므로, 세션 배치와 패킷 손실 처리, 0-RTT 정책, ALPN 협상을 별도로 검증해야 합니다.

HTTP 게이트웨이나 HTTP/3 실험을 VPP 안에서 구현할 수는 있지만, VPP를 풀스펙 API 게이트웨이로 만드는 것은 신중해야 합니다. 라우팅, 기본 헤더 조작, 단순 캐시, 빠른 L4/L7 분류는 VPP에 어울리지만, 복잡한 인증, OpenAPI 검증, 사용자별 정책, 동적 스크립팅은 외부 프록시나 제어 평면으로 분리하는 구성이 더 안전합니다.

프록시와 SSL Inspection

VPP 기반 프록시는 크게 두 방향입니다. 첫째, VCL 애플리케이션이 TCP/TLS 세션을 직접 받아 업스트림과 다시 연결하는 인라인 프록시입니다. 둘째, VPP가 분류와 steering만 담당하고, 복호화(Decryption)와 콘텐츠 검사는 memif로 연결된 외부 프록시나 DLP 엔진에 위임하는 서비스 체이닝 방식입니다.

SSL Inspection은 기술보다 정책이 먼저입니다. 조직이 복호화할 수 있는 트래픽과 우회해야 하는 트래픽을 분리하고, 사용자 고지, 인증서 배포, 감사 로그, 키 보관, 예외 도메인, ECH(Encrypted ClientHello) 대응을 문서화해야 합니다. VPP는 빠른 데이터 경로를 제공하지만, 동적 인증서 발급과 법적 책임은 별도 시스템 설계에 속합니다.

운영과 확장

운영에서 가장 흔한 문제는 VPP 자체 기능보다 배치 조건에서 발생합니다. hugepage가 부족하거나 NUMA가 맞지 않거나, NIC queue와 worker가 일치하지 않거나, Linux IRQ가 같은 코어에 남아 있으면 벤치마크와 운영 성능이 크게 달라집니다. 따라서 startup.conf, CPU pinning, NIC RSS, queue 수, memory socket, CLI socket, API socket, log 경로를 한 번에 관리해야 합니다.

# /etc/vpp/startup.conf 예시: 역할을 보여주는 최소 골격
unix {
  nodaemon
  cli-listen /run/vpp/cli.sock
  log /var/log/vpp/vpp.log
}

cpu {
  main-core 1
  corelist-workers 2-7
}

dpdk {
  dev 0000:18:00.0
  dev 0000:18:00.1
  num-rx-queues 6
}

운영 관측은 show runtime, show interface, show errors, packet trace, event logger, stats segment, Prometheus exporter, CSIT 스타일 반복 테스트를 함께 사용합니다. 장애 대응 런북에는 인터페이스 상태, 워커별 vector rate, drop counter, buffer exhaustion, memif 연결 상태, API socket 권한, DPDK 장치 바인딩을 포함하는 편이 좋습니다.

DPU와 하드웨어 오프로드

DPU나 SmartNIC에 VPP를 배치하면 호스트 CPU에서 데이터 경로 일부를 분리할 수 있습니다. 예를 들어 BlueField 같은 장치에서는 Arm 코어 위에 VPP를 올리고, 호스트와 DPU 사이를 representor, virtio, SR-IOV, hairpin, cryptodev, memif 같은 경로로 연결할 수 있습니다. 이때 중요한 질문은 "무엇을 DPU로 옮길 것인가"입니다.

L2/L3 steering, 기본 ACL, IPsec ESP, TLS 암호화 일부, SSL Inspection 보조 경로는 DPU에 어울릴 수 있습니다. 반면 복잡한 L7 정책, 동적 인증서 생성, 사용자별 감사, 외부 데이터베이스 조회는 DPU 코어에서 처리하면 병목(Bottleneck)이 되기 쉽습니다. DPU는 빠른 패킷 경로와 암호 가속을 담당하고, 복잡한 정책 판단은 호스트나 제어 평면에 남기는 분리가 현실적입니다.

커널과의 연결 지점

리눅스 커널 개발자 관점에서 VPP를 볼 때 가장 중요한 연결 지점은 드라이버와 사용자 공간 경계입니다. DPDK는 VFIO/UIO와 hugepage에 의존하고, AF_XDP는 XDP 및 네트워크 드라이버의 zero-copy 지원 여부에 의존합니다. TAP/TUN과 vhost-user는 커널 가상 네트워크와 VM 연결을 이해해야 안정적으로 운영할 수 있습니다.

배포 체크리스트

영역확인 항목실패 시 증상
CPUmain core와 worker core 분리, irqbalance 영향 제거지연 시간 흔들림, worker 편중
메모리hugepage 크기, NUMA node, socket memory버퍼 부족, 초기화 실패, 성능 저하
NICDPDK 바인딩, queue 수, RSS, offload 설정단일 큐 병목, checksum 오류
보안API socket 권한, memif socket 권한, 로그 보존무단 제어, 감사 누락
운영startup.conf 버전 관리, 롤백(Rollback), 상태 확인 명령재시작(Reboot) 후 구성 불일치

VPP 최신 릴리스 하이라이트 (25.06, 25.10)

FD.io VPP는 분기 릴리스 주기를 유지하며 2025년에는 25.02, 25.06, 25.10 순으로 발표되었습니다. 주요 기능 변화는 다음과 같으며 상세 릴리스 노트는 s3-docs.fd.io/vpp/<버전>/aboutvpp/releasenotes/에서 확인할 수 있습니다.

릴리스공개일주요 변경
VPP 25.06 2025-06-25 28개 신규 기능 / 260+ 커밋. 호스트 스택 애플리케이션 기능, HTTP/2 확장, Marvell 디바이스 드라이버 기능, QUIC 엔진 API, Crypto Infra 개선
VPP 25.10 2025-10-29 17개 신규 기능 / 322+ 커밋. 호스트 스택 애플리케이션 확장, HTTP/2 성능 개선, Marvell 드라이버 기능 추가, snort 플러그인(오픈소스 IDS 연동), 운영 안정성 수정 129건

2026년 관점에서 주목할 영역

소스 확인: 25.06 릴리스 노트는 25.06 Release Notes, 25.10은 25.10 Release Notes에 공식 집계되어 있습니다.

사용 판단 기준

VPP는 모든 네트워크 문제의 기본 답이 아닙니다. 커널 네트워크 스택으로 충분한 트래픽, 복잡한 네임스페이스와 cgroup 통합이 중요한 환경, 배포 자동화와 보안 정책이 커널 도구에 이미 묶인 환경에서는 커널 경로가 더 단순합니다. 반대로 고정된 데이터 경로에서 수십 Mpps, 낮은 tail latency, NFV 서비스 체이닝, DPU 오프로드, 전용 L3/L4 게이트웨이를 목표로 한다면 VPP가 강한 후보가 됩니다.

실무 기준: 먼저 커널 경로로 요구 성능과 운영성을 측정하고, 병목이 시스템 콜, qdisc, Netfilter, sk_buff 처리, IRQ 모델에 있다는 근거가 있을 때 VPP 전환을 검토하는 편이 안전합니다.

참고자료

오픈소스 코드 인용 고지

라이선스 고지: 이 문서의 코드 예제에는 FD.io VPP, DPDK, Linux 커널 소스 코드에서 발췌·간략화한 내용이 포함될 수 있습니다. 해당 코드 블록에는 원본 프로젝트의 라이선스가 그대로 적용되며, 본 사이트의 CC BY-NC-SA 4.0 라이선스 대상에서 제외됩니다.
프로젝트저작권자라이선스공식 저장소
VPP (Vector Packet Processing) FD.io contributors Apache License 2.0 github.com/FDio/vpp
DPDK (Data Plane Development Kit) DPDK contributors BSD 3-Clause License github.com/DPDK/dpdk
Linux kernel Linux kernel contributors GPL-2.0-only WITH Linux-syscall-note git.kernel.org