가끔씩, 멋진 기술은 실제 비즈니스 요구와 해당 기술의 강점이 교차하는 변곡점에 도달합니다. 이는 이 기술을 실현 가능할 뿐만 아니라 실용적으로 만듭니다. 버클리 패킷 필터 (BPF)는 최근 리눅스 개발자들 사이에서 이 지점에 도달했습니다. BPF는 Linux 호스트에서 매우 효율적인 가로채기 및 처리 지점으로, 조만간 Windows 서버로 확장될 예정입니다. 사용 가능한 데이터의 범위가 광범위하여 사이트 안정성 엔지니어링(SRE) 운영 작업에 대한 전체 스택 가시성을 직접적으로 높여줍니다. 이는 보안 및 교통 관리와 관련된 과제를 해결하는 데에도 자연스럽게 부합합니다. 후크의 범위도 마찬가지로 광범위하여 관찰성, 보안 및 네트워크 전문가에게 어필하는 BPF 애플리케이션에 유용한 트리거 포인트를 다양하게 제공합니다. BPF는 비용을 들이지 않고도 관찰 가능성을 구현할 수 있는 적합한 기술입니다. 그리고 이 모든 것은 관찰로부터 시작됩니다.
BPF의 기본 설계는 가능한 한 컴퓨팅 작업에 가장 효율적인 방법이 되도록 합니다(와트당 비용). 더 나은 점은 툴체인이 사용자를 대신하여 바이트코드를 생성해 주므로, 저수준 어셈블리 언어 유형의 프로그래밍이 아닌 원하는 결과에 집중할 수 있다는 것입니다. 어떻게? BPF가 빛나는 이유는 다음 두 가지 디자인 특성 때문입니다.
BPF의 소프트웨어 설계는 의도적으로 새로운 현대 CPU 아키텍처의 설계를 본떠 만들어졌습니다. 실제로 프로세서 용어는 BPF 요소와 사용법을 정확하게 설명하기 때문에 사용됩니다. BPF에는 레지스터와 명령어가 있습니다. 이러한 메모리는 CPU에서 직접 소비되도록 설계되었습니다. BSD 패킷 필터 설계(1992)를 기반으로 하는 BPF는 현대의 레지스터 기반 CPU 아키텍처에 더 적합한 재설계된 패킷 캡처 필터 머신입니다. 이 디자인은 2014년 Linux 커널 v3.18 에서 "Enhanced Berkeley Packet Filter" 또는 eBPF가 출시되면서 자연스럽게 향상되었습니다. eBPF는 출시 후 초기에는 Classic Berkeley Packet Filter(cBPF)와 중요한 차이점이었습니다. 오늘날에는 지원되는 모든 버전의 커널에 2014년 개선 사항이 포함되어 있기 때문에 이러한 구분은 그다지 중요하지 않습니다. 주목할 만한 사항은 다음과 같습니다. 더 넓은 레지스터(32비트에서 64비트로 확장하면 캐시 라인/클럭 사이클당 더 많은 작업이 처리됨), 더 많은 레지스터(2개에서 10개로 확장하면 최신 CPU 레지스터와 커널 ABI 간의 1대1 매핑이 더 많아짐), 그리고 BPF 프로그램을 더 안전하고 유용하게 만들어 주는 몇 가지 추가 명령어 세트 향상.
BPF는 네트워크 탭과 패킷 필터로 구성됩니다. 탭은 패킷이 전선을 통해 주어진 네트워크 인터페이스로 전송될 때 데이터 링크 계층에서 작동합니다. 필터가 조사할 패킷을 복사합니다. 이 삽입 지점을 통해 Linux 호스트의 네트워크 경로를 완벽하게 파악할 수 있습니다. 유입 트래픽의 경우 호스트 프로세서가 작업을 시작하기 전을 의미하고, 유출 트래픽의 경우 호스트를 떠나기 위해 전선에 연결되기 직전을 의미합니다. 이 다이어그램은 BPF가 데이터 링크 계층 에서 수신 패킷 경로를 교차하는 것을 보여줍니다.
이 데이터를 사용하면 패킷 필터링을 사용자 정의하는 정책을 정의할 수 있습니다. 다음 정책은 특정 대상 IP 주소로 전송되는 TCP 패킷을 필터링합니다.
관찰성을 위해 eBPF를 활용하면 BOGO(하나 사면 하나 무료) 혜택이 있습니다. 관찰된 데이터는 관찰 이외의 다른 목적으로도 활용될 수 있습니다. 예를 들어, 교통 라우팅이나 보안 등입니다.
이전에 공유했던 데이터 세트를 다시 참조하면, Linux 호스트의 트래픽 유입 경로를 관찰하는 데 사용된 데이터 세트의 일부는 다른 용도로도 유용합니다. 예를 들어, 소스 IP, 대상 IP, 대상 호스트 및 포트는 유입 트래픽 라우팅과 액세스 제한에 모두 유용합니다.
사용 여부와 관계없이 모든 것은 BPF 탭에 의한 패킷 복사로 시작됩니다. 복사가 완료되면 데이터를 메모리에 넣을 수 있습니다( BPF 맵 에서 자세히 알아보세요). 그런 다음 원격 측정 스트림으로 내보낼 수 있고, 정책 및 필터링 작업을 지정하는 다른 BPF 프로그램에서 동시에 활용할 수도 있습니다. 여기가 관찰 가능성에서 교통 관리 및 보안으로의 분기가 발생하는 곳입니다. BPF의 극도의 효율성을 활용하려면 필요한 데이터가 무엇이고, 그 데이터를 어떻게 사용하는지에 대한 명확한 그림을 그리는 것이 시작점입니다. 이 시리즈의 다음 게시물에서는 동료인 Muhammad Waseem Sarwar가 Linux 네트워크 스택의 다양한 위치에서 BPF 프로그래밍 옵션을 살펴보겠습니다.