# Berkeley Packet Filter (BPF) 백과사전
Berkeley Packet Filter(BPF)은 네트워크 패킷 트래픽에서 특정 조건의 피킷만을 캡처하거나 처리하기 위해 설계된 경량 가상 머신과 그 명령 체계이다. 원래 1990년대 초의 libpcap/tcpdump 생태계에서 네트워크 캡처의 효율화를 목표로 개발되었으며, 현재까지도 다양한 네트워크 도구와 커널 구성에 널리 사용된다. BPF의 핵심 아이디어는 커널 또는 사용자 공간에서 패킷에 대한 간단하고 안전한 필터를 실행 가능한 바이트코드로 표현하고, 이를 해석 또는 JIT로 실행하는 것이다. 이 문서는 BPF의 역사, 아키텍처, 명령어 세트, 필터 작성 방법, 구현 현황 및 응용 분야 등을 포괄적으로 다룬다.
---
## 개요
- BPF의 목적
- 패킷 캡처 시스템의 필터링 비용을 줄이고, 필요한 패킷만을 선택적으로 전달하도록 하는 것.
- 캡처 버퍼의 효율적 사용과 CPU 부하 감소를 목표로 한다.
- 동작의 기본 아이디어
- 패킷 스트림에 대해 사전에 정의된 필터를 바이트코드 형태로 실행.
- 각 패킷은 바이트코드의 명령 흐름에 의해 검사되어, 조건 만족 시에만 상위 시스템으로 전달된다.
- 용어
- BPF VM: 패킷 필터를 실행하는 가상 머신.
- BPF program: 필터를 표현한 일련의 명령들의 모음.
- pcap: 패킷 캡처 형식/프레임워크로, BPF 필터를 사용해 캡처 조건을 정의한다.
---
## 역사
- 초기 배경
- 1980년대 말 리눅스/유닉스 커널에서의 네트워크 트래픽 모니터링 필요성에 의해 개발된 것이 계기가 된다.
- 발전 방향
- 원래의 BPF는 간단한 필터 표현에 집중했으며, 이후 확장된 기능과 더 나은 성능을 위해 eBPF(Extended BPF)로 발전하였다.
- 현재 위치
- libpcap, tcpdump, Wireshark 등 주요 네트워크 분석 도구의 기반 필터링 엔진으로 여전히 널리 채택되어 있다.
- 커널 레벨의 패킷 필터링 및 네트워크 진단 도구의 핵심 구성 요소로 사용된다.
---
## 아키텍처
- 구성 요소
- BPF VM: 독립적 실행 엔진으로, 바이트코드를 해석하거나 JIT(Just-In-Time)으로 컴파일하여 실행한다.
- 필터 바이트코드: 패킷의 특정 필드나 조건에 기반한 비교 및 분기 명령의 시퀀스.
- 명령 어휘: 각 명령은 코드(code), 두 개의 분기 인덱스(jt, jf), 상수 k로 구성된다.
- 명령 구조
- 일반적으로 8바이트 명령으로 구성되며, 코드, jt, jf, k의 조합으로 표현된다.
- 구조체 예시:
- struct bpf_insn {
uint16_t code;
uint8_t jt;
uint8_t jf;
uint32_t k;
};
- 실행 흐름은 각 명령의 code에 따라 패킷의 필드를 비교하고, jt/jf에 따라 분기한다.
- 실행 모델
- 패킷은 가장 처음 명령부터 순차적으로 해석되며, 특정 조건에 의해 결과가 결정되면 더 이상 필터링 없이 상위 시스템으로 전달되거나 버려진다.
- 성능 측면에서 바이트코드의 간결성과 해석/제이트의 최적화가 중요한 역할을 한다.
---
## 명령어 세트와 실행 모델
- 기본 분류
- LD: 데이터를 읽어오는 로드 명령
- ALU: 산술/비교 연산
- JMP: 조건 분기
-RET: 패킷의 반환 동작(예: 캡처 허용, 버림)
- 예시 명령 구성
- 코드(code) 필드는 명령의 종류를 나타내며, jt/jf는 분기 시도 시의 대상 명령 인덱스를 가리킨다.
- k는 즉시 상수값으로, 비교나 계산에 사용된다.
- 간단한 예
- 예를 들어 TCP 포트가 80인 패킷을 필터링하는 경우, 포트 번호를 읽고 비교한 뒤, 참일 때만 RET로 패킷을 전달한다.
- 시간 복잡도 및 성능
- 일반적으로 필터의 복잡도는 명령 수에 비례한다. 실행 시간은 패킷 수와 필터의 복잡도에 따라 달라지며, 간단한 필터일수록 빠르게 처리된다.
- 수식으로 표현하면 예를 들어 패킷 n개를 처리하는 총 시간은 $T \approx n \cdot c$이며, 여기서 $c$는 한 패킷당 처리 상수이다. 경우에 따라 JIT를 활용하면 $T$가 감소할 수 있다.
---
## BPF 프로그램의 구조
- 프로그램 언어의 레이어
- 필터 표현식은 고수준 언어로 작성되며, libpcap의 필터 컴파일러가 이를 바이트코드로 변환한다.
- 변환된 바이트코드는 커널 또는 사용자 공간의 BPF VM에서 실행된다.
- 명령 흐름의 특징
- 각 명령은 고정된 포맷으로 구성되며, k를 이용한 즉시 상수를 비교/연산에 사용한다.
- RET 명령은 필터의 최종 반환값으로, 패킷의 전달 여부를 결정한다.
- 예시 구조
- 간단한 필터 예:
- "tcp port 80"은 TCP 헤더의 포트 필드를 읽어 포트 80과의 비교 후, 일치 시에만 패킷을 캡처하도록 구성된다.
---
## 필터 작성 및 컴파일
- 고수준 표현에서의 작성
- pcap 필터 문자열로 작성: 예를 들어 "tcp port 80" 또는 "ip and not broadcast"
- 이 문자열은 libpcap의 필터 컴파일러에 의해 BPF 바이트코드로 변환된다.
- 바이트코드 컴파일 프로세스
- 소스 문자열 → 파싱 → 최적화 → 바이트코드 생성(8바이트 명령 단위)
- 생성된 바이트코드는 BPF VM에서 실행되며, 필요 시 JIT 컴파일로 성능 향상이 가능하다.
- 하위 시스템/도구
- tcpdump, Wireshark: 입력된 BPF 필터를 사용해 캡처 트래픽을 제한
- libpcap: 다양한 플랫폼에서의 캡처 추상화 레이어 제공
- 옵시디언 수식 예
- 필터의 연산 시간 복잡도를 나타낼 때: $O(n)$
- 특정 패킷 집합의 필터링 확률을 나타낼 때: $P(\text{match})$
---
## 예제 필터
- 간단한 예: TCP 포트 80 필터
- 문자열 표기: "tcp port 80"
- 동작: TCP 헤더의 포트 필드를 검사하여 포트 80인 패킷만 전달
- 복합 예: IP 패킷 중에서 ICMP 비허용
- 문자열 표기: "ip proto icmp"
- 동작: IP 프로토콜 필드가 ICMP인 패킷만 전달
- 특정 서브넷에서의 트래픽
- 문자열 표기: "net 192.168.0.0/16"
- 동작: 주어진 서브넷으로의 트래픽만 필터링
참고: 실제 필터 표현식은 사용하는 툴의 버전에 따라 다를 수 있으며, 특정 필터의 문법은 libpcap/pcap-filter의 문서를 참조하는 것이 좋다.
---
## 구현 현황 및 확장성
- 고전 BPF의 한계
- 간단한 필터 표현에 최적화되어 있지만, 복잡한 흐름 제어 및 고급 패킷 분석에는 한계가 있다.
- eBPF로의 확장
- Extended BPF(eBPF)는 자유로운 메모리 접근, 지도(Maps), 루프, 함수 호출 등 확장된 기능을 제공한다.
- 커널에서의 실행 환경이 개선되며, 네트워크 구현자에게 더욱 강력한 도구가 되었다.
- 보안 및 안전성
- 필터 코드의 실행은 커널 수준에서의 실행보장 및 샌드박스화된 환경 하에 수행되어야 한다.
- 악의적 필터나 잘못된 바이트코드로 인한 커널 크래시를 방지하기 위한 안전성 메커니즘이 포함된다.
---
## 응용 분야
- 네트워크 진단 및 모니터링
- 특정 트래픽만 수집하여 분석하고자 할 때 BPF 필터를 사용한다.
- 침입 탐지 시스템(IDS) 및 네트워크 보안 연구
- 특정 프로토콜, 포트 조합, IP 대역에 대한 트래픽을 선별적으로 분석한다.
- 네트워크 디버깅 및 트래픽 샘플링
- 대용량 트래픽 환경에서 필요한 샘플링만 수행하는 데 유용하다.
- 커널/네트워크 성능 연구
- 캡처 경로의 병목 지점을 파악하고 분석하는 데 BPF 기반 필터를 활용한다.
---
## 도구 및 구현 현황
- 주요 구현체
- libpcap: 패킷 캡처 및 필터링의 핵심 라이브러리로, 다양한 플랫폼에서 사용된다.
- tcpdump: 커맨드라인 네트워크 분석 도구로 BPF 필터를 이용한 캡처/출력을 지원한다.
- Wireshark: GUI 기반 패킷 분석 도구로 BPF 기반 캡처 필터를 사용한다.
- 개발 및 확장성 방향
- eBPF의 도입으로 네트워크 커널 내 트래픽 제어 및 분석의 가능성이 확장되었다.
- JIT 컴파일러의 최적화 및 다양한 맵(Map) 지원 등으로 성능과 기능이 지속적으로 개선되고 있다.
---
## 비교 및 관련 기술
- BPF vs eBPF
- BPF는 원래의 간단한 패킷 필터링 가상 머신이고, eBPF는 확장된 기능과 커널 통합으로 더 풍부한 프로그래밍 모델을 제공한다.
- pcap-filter vs BPF 템플릿
- 고수준 문자열 표현으로 시작해 바이트코드로 변환하는 흐름은 동일하나, 구현 세부사항과 지원하는 기능에는 차이가 있다.
- 네트워크 캡처의 기타 방법과의 차이
- 하드웨어 가속, NIC 기반 필터링 등과 비교했을 때, 소프트웨어 레벨의 BPF 필터링은 유연성과 플랫폼 독립성을 제공한다.
---
## 참고 문헌 및 학습 자료
- libpcap 공식 문서 및 소스 코드
- tcpdump 매뉴얼 및 예제
- eBPF 커뮤니티 및 커널 문서
- Wireshark 필터링 관련 문서
---
## 요약
- BPF는 패킷 캡처 및 네트워크 분석을 위한 경량 가상 머신과 바이트코드 기반 필터링 체계를 제공한다.
- 명령어 구조와 실행 모델은 비교적 단순하지만, 강력한 필터링 표현과 빠른 실행을 가능하게 한다.
- 현재는 eBPF로의 확장과 함께 커널 수준의 고도화된 네트워크 제어까지 확장되고 있다.
- 다양한 네트워크 분석 도구와 연구 목적에서 여전히 핵심 기술로 작동한다.
---
관련 문서: [[eBPF]], [[libpcap]]