본문 바로가기
일반IT/리눅스

eBPF로 네트워크 트래픽을 후킹하는 기술: 리눅스 커널의 특별한 '감시자'

by gasbugs 2025. 8. 4.

안녕하세요, 여러분! 오늘은 리눅스 네트워킹의 깊숙한 곳을 들여다보는 흥미로운 주제, 바로 eBPF(extended Berkeley Packet Filter)에 대해 이야기해보려고 합니다. 특히, eBPF가 어떻게 네트워크 트래픽을 가로채고 분석하는지, 그 원리를 최대한 쉽고 상세하게 설명해 드릴게요.

https://ebpf.io/ko-kr/what-is-ebpf/

 

1. eBPF, 대체 무엇인가요?

eBPF를 한 문장으로 정의하자면, 리눅스 커널 내부에서 안전하게 실행되는 샌드박스형 가상 머신(VM)이라고 할 수 있습니다. 과거의 BPF(Berkeley Packet Filter)가 네트워크 패킷 필터링에만 국한되었다면, eBPF는 훨씬 더 광범위한 분야(네트워킹, 보안, 성능 분석 등)에 활용될 수 있도록 확장되었습니다.

가장 중요한 특징은 커널 코드를 수정하지 않고도 커널의 동작을 변경하거나 확장할 수 있다는 점입니다. 이는 커널 개발자에게 엄청난 유연성을 제공할 뿐만 아니라, 사용자에게도 커널의 내부 동작을 들여다볼 수 있는 강력한 도구를 제공합니다.

2. eBPF, 어떻게 네트워크 트래픽을 가로챌까요?

네, 사용자께서 말씀하신 'TCP 관련 이벤트 발생 시 후킹해서 가져간다'는 설명은 매우 핵심적인 부분을 짚어주신 것입니다. eBPF는 바로 이 '후킹(Hooking)'이라는 개념을 통해 작동합니다.

리눅스 커널은 네트워크 트래픽이 들어오고 나가는 모든 과정(패킷 수신, TCP 연결 설정, 데이터 전송 등)에서 미리 정해진 지점들을 가지고 있습니다. 이 지점들을 '훅 포인트(Hook Point)'라고 부릅니다. eBPF 프로그램은 이 훅 포인트에 자신을 '부착(Attach)'시켜놓고, 특정 이벤트가 발생하기를 기다립니다.

좀 더 구체적인 과정을 살펴볼까요?

2.1. eBPF 프로그램 작성 및 로딩

  1. eBPF 프로그램 작성: 먼저, C 언어의 서브셋으로 eBPF 프로그램을 작성합니다. 이 프로그램은 특정한 훅 포인트에서 실행될 로직(예: 패킷 헤더 정보 읽기, 특정 포트의 트래픽만 필터링하기, 패킷 내용 변경하기 등)을 담고 있습니다.
  2. eBPF 프로그램 검증: 작성된 eBPF 프로그램은 eBPF 검증기(Verifier)를 통과해야만 커널에 로딩될 수 있습니다. 검증기는 프로그램이 무한 루프에 빠지거나, 커널 메모리에 잘못된 접근을 시도하는 등의 위험한 동작을 하지 않는지 철저히 검사합니다. 이는 eBPF의 가장 중요한 보안 메커니즘입니다.
  3. eBPF 프로그램 커널 로딩: 검증을 통과한 프로그램은 커널에 안전하게 로딩됩니다.

2.2. 훅 포인트에 부착(Attach)

이제 커널에 로딩된 eBPF 프로그램을 특정 훅 포인트에 부착합니다.

  • 예시 1: 소켓 필터링(Socket Filtering)
    • SO_ATTACH_BPF 소켓 옵션을 사용하여 특정 소켓에 eBPF 프로그램을 부착할 수 있습니다.
    • 이 경우, 해당 소켓으로 들어오는 모든 패킷이 eBPF 프로그램의 필터링 로직을 거치게 됩니다.
  • 예시 2: tc(traffic control)
    • 네트워크 인터페이스의 tc 훅 포인트에 eBPF 프로그램을 부착할 수 있습니다.
    • 이 경우, 네트워크 인터페이스를 통과하는 모든 패킷(수신, 송신)을 감시하거나 조작할 수 있습니다. 예를 들어, 특정 IP 주소로 가는 트래픽을 차단하거나, 패킷의 우선순위를 변경하는 등의 고급 네트워킹 기능 구현이 가능합니다.

2.3. 이벤트 발생과 프로그램 실행

부착이 완료되면, 이제 기다리면 됩니다.

  • 예를 들어, tc 훅 포인트에 부착된 경우, 네트워크 인터페이스에 새로운 패킷이 도착할 때마다 커널은 해당 훅 포인트에 부착된 eBPF 프로그램을 실행합니다.
  • eBPF 프로그램은 실행되면서 패킷의 데이터를 읽고, 미리 정의된 로직에 따라 필터링, 수정, 또는 다른 동작을 수행할 수 있습니다.

핵심은 바로 이것입니다. eBPF 프로그램은 리눅스 커널이 네트워크 트래픽을 처리하는 '바로 그 순간'에 끼어들어(후킹하여) 자신의 역할을 수행하는 것입니다. 이 과정은 사용자 공간(User space)의 프로그램보다 훨씬 빠르고 효율적으로 작동합니다.

3. 왜 eBPF를 사용할까요?

eBPF를 이용한 네트워크 트래픽 후킹 기술이 각광받는 이유는 다음과 같습니다.

  • 뛰어난 성능: 커널 내에서 직접 실행되므로 사용자 공간으로 데이터를 복사하는 오버헤드가 없습니다. 이는 고성능 네트워킹 애플리케이션에 필수적입니다.
  • 안전성: 앞서 언급한 검증기(Verifier) 덕분에 커널의 안정성을 해치지 않습니다.
  • 유연성: 커널을 재컴파일하거나 모듈을 로드하지 않고도 동적으로 커널의 동작을 변경할 수 있습니다.
  • 다양한 활용: 패킷 필터링 외에도 로드 밸런싱, DDoS 방어, 네트워크 모니터링, 보안 감사 등 다양한 분야에 활용됩니다.

마무리

eBPF는 리눅스 커널의 강력한 '감시자'이자 '컨트롤러' 역할을 수행합니다. 네트워크 트래픽이 발생하는 순간을 놓치지 않고 후킹하여 필요한 작업을 수행하는 이 기술은 현대의 복잡한 네트워킹 환경에서 없어서는 안 될 중요한 도구가 되었습니다.

다음번에는 eBPF를 이용한 실제 예제(예: 특정 포트 트래픽 모니터링)를 통해 더욱 깊이 있는 내용을 다뤄보겠습니다. 궁금한 점이 있다면 언제든지 댓글로 남겨주세요!