eBPF (확장 버클리 패킷 필터 )는 신속하고 지속적으로 업데이트할 수 있으므로 빈번한 보안 구성 변경을 처리하는 데 이상적입니다.
더 나은 DDoS 보호를 위해 XDP/eBPF를 효과적으로 관리하는 방법 (저자 Ivan Koveshnikov) 에서 번역되었습니다 .
eBPF (Extended Berkeley Packet Filter ) 맵은 공유 메모리로 사용되는 공유 메모리 세그먼트의 원자 업데이트를 위한 상위 수준 인터페이스 역할을 하며 eBPF 프로그램을 위한 강력한 구성 인터페이스를 제공합니다. 읽기-복사-업데이트 메커니즘은 핫 경로의 성능 오버헤드를 최소화합니다. 또한 eBPF 매핑을 통해 공유 메모리 세그먼트에 대한 독점 액세스가 가능합니다. 혼합된 맵 유형(배열, 해시 테이블, 블룸 필터, 큐 및 링 버퍼)을 처리할 수 있으므로 보안 과 같은 복잡한 구성에 이상적입니다 .
구성 복잡성이 증가함에 따라 서로 다른 매핑 항목 간의 연결 필요성도 증가합니다. 맵 항목 사이에 연결이 너무 많으면 원자 구성 업데이트 기능이 저하되기 시작합니다. 하나의 맵 항목만 업데이트하면 다른 항목도 동시에 업데이트해야 하므로 업데이트 중에 불일치가 발생할 수 있습니다.
고급 트래픽 관리를 위해 XDP 적용
우선순위 5-튜플 규칙 세트를 기반으로 트래픽을 분류하고 필터링하는 간단한 XDP(eXpress Data Path) 프로그램을 생각해 보십시오. 프로그램은 규칙의 우선순위와 패킷의 소스 IP 주소, 대상 IP 주소, 프로토콜, 소스 및 대상 포트의 조합을 기반으로 다음 패킷을 처리합니다.
처리로 이어지는 분류 흐름도.
다음은 네트워크 구성 규칙의 예입니다.
- 서브넷 A의 모든 트래픽은 항상 허용됩니다.
- 서브넷 C의 클라이언트가 서브넷 B의 웹 서버에 액세스하지 못하도록 제한합니다.
- 서브넷 B의 웹 서버에 대한 액세스를 제한합니다.
- 다른 모든 액세스는 거부됩니다.
이러한 규칙에는 트래픽 분류 규칙 및 제한 사항을 구성에 저장해야 하며, 이는 eBPF 매핑을 사용하여 달성할 수 있습니다.
eBPF 프로그램 구성을 트리 구조로 이해
"구성 루트"를 기본으로 하여 구성을 계층적 트리로 시각화할 수 있습니다. 이 루트(아마도 가상)는 다양한 구성 엔터티를 구성하여 활성 구성을 형성합니다. 엔터티는 즉각적인 글로벌 액세스를 위해 루트에 직접 연결되거나 구조화된 조직을 위해 다른 엔터티 내에 중첩됩니다.
특정 엔터티에 대한 액세스는 루트에서 시작하여 원하는 엔터티에 도달할 때까지 순차적으로 진행됩니다(각 수준을 "역참조"). 예를 들어 컬렉션의 "옵션" 구조에서 부울 플래그를 검색하려면 컬렉션으로 이동하여 구조를 찾은 다음 플래그를 검색합니다.
eBPF의 복잡성 문제를 해결하기 위한 Gcore의 접근 방식
이 트리 구조는 모든 하위 트리의 원자 교환을 포함하여 구성 관리에 유연성을 제공하여 중단 없이 원활한 전환을 보장합니다. 그러나 복잡성이 증가하면 문제가 발생합니다. 구성이 더욱 복잡해지면 항목의 상호 연결도 더욱 커집니다. 여러 상위 항목이 단일 하위 항목을 가리키거나 항목이 엔터티의 속성과 컬렉션의 일부로서 이중 역할을 수행하는 것이 일반적입니다.
현대 프로그래밍 언어는 복잡한 구성을 관리하기 위한 메커니즘을 개발했습니다. 개발자는 안전한 업데이트를 보장하기 위해 참조 카운터, 변경 가능 및 불변 참조, 가비지 수집기를 사용합니다. 그러나 이러한 구성의 보안을 관리한다고 해서 구성 버전 간 전환 시 원자성이 보장되는 것은 아닙니다.
끊임없이 변화하는 온라인 트래픽 환경으로 인해 보안 운영 팀은 보안 정책을 자주 변경해야 합니다. 따라서 Gcore는 Gcore DDoS 보호 를 빠르고 자주 업데이트 하고 정규식 엔진 과 같은 중요한 기능을 통합했습니다. 우리는 자체 호스팅 솔루션에 대한 하루 1~2회의 표준 업데이트를 넘어 서비스 공급자가 요구하는 거의 지속적인 업데이트로 전환했습니다. Linux 애플리케이션에서 종종 간과되는 이러한 요구 사항으로 인해 eBPF 기술이 채택되어 빠르고 중단 없는 업데이트가 가능해졌습니다.
eBPF 솔루션을 탐색할 때 eBPF 구성이 가능한 최상의 방법으로 처리되도록 전략을 철저하게 탐색해야 합니다. 특히 eBPF 매핑의 한계로 인해 우리 팀은 구성 스토리지 전략을 다시 생각하게 되었습니다.
커널 보안 유효성 검사로 인해 eBPF 맵 항목은 임의의 메모리 세그먼트에 대한 직접 포인터를 저장할 수 없습니다. 이로 인해 맵 항목에 액세스하려면 검색 키가 필요하므로 조회 프로세스가 느려집니다. 그러나 이러한 단점은 이점을 제공합니다. 이를 통해 복잡한 구성 트리를 구성 루트에 직접 연결된 더 작고 관리하기 쉬운 세그먼트로 나눌 수 있습니다. 결과는 무엇입니까? 비원자적 업데이트 중에도 일관성이 유지됩니다.
우리의 연구 결과와 전략은 효율성을 최적화하기 위해 eBPF 프로그램의 신중한 계획과 실행의 중요성을 강조합니다. 이제 eBPF 환경에 대한 특정 구성 업데이트 전략과 시스템의 고유한 요구 사항 및 제한 사항에 대한 적용 가능성을 살펴보겠습니다.
보안 구성 업데이트 정책
우리는 높은 성능과 유연성을 보장하면서 프로그램 업데이트를 향상시키는 데 특히 효과적인 세 가지 업데이트 전략을 발견했습니다.
업데이트 전략 1: 점진적 전환
점진적 업데이트 전략은 여러 매핑에 걸쳐 증분 구성 업데이트를 의미합니다. 이는 한 지도의 데이터를 처리하여 다른 지도에 대한 조회 키를 제공할 때 유용한 옵션입니다. 이 경우 여러 맵 항목을 업데이트해야 하며 원자 변환이 불가능합니다. 그러나 정확하고 순차적인 업데이트 작업을 통해 구성을 체계적으로 업데이트할 수 있습니다. 참조된 구성 하위 트리에 대한 일부 작업은 올바른 순서로 수행되면 안전해집니다.
예를 들어 분류 및 처리의 맥락에서 분류 계층은 보안 정책 일치를 위한 조회 키를 제공합니다. 이는 업데이트 작업이 특정 순서를 따라야 함을 의미합니다.
- 새 정책이 아직 참조되지 않았으므로 새 보안 정책을 삽입해도 안전합니다 .
- 또한 기존 보안 정책을 개별적으로 업데이트해도 일반적으로 문제가 발생하지 않으므로 업데이트하는 것이 안전합니다 . 원자성 업데이트가 바람직하기는 하지만 상당한 이점을 제공하지는 않습니다.
- 새로운 보안 정책을 참조하도록 분류 계층 매핑을 업데이트하고 오래된 정책에 대한 참조를 제거하는 것이 안전합니다.
- 더 이상 참조되지 않는 사용되지 않는 보안 정책을 구성에서 제거하는 것이 안전합니다 .
원자성 업데이트가 없더라도 업데이트 프로세스의 순서를 적절하게 지정하여 보안 업데이트를 수행할 수 있습니다. 이 방법은 다른 매핑과 밀접하게 관련되지 않은 독립형 매핑에 가장 적합합니다.
전체 지도를 한 번에 업데이트하는 것보다 증분 업데이트를 수행하는 것이 좋습니다. 예를 들어 해시 맵 및 배열에 대한 증분 업데이트는 완전히 안전합니다. 그러나 LPM(Longest Prefix Match) 맵에 대한 증분 업데이트의 경우에는 검색이 이미 맵에 있는 요소에 따라 달라지기 때문에 해당되지 않습니다. 다른 테이블에 대한 조회 키를 생성하려면 여러 맵의 요소를 조작해야 하는 경우에도 동일한 문제가 발생합니다.
분류 계층은 종종 여러 LPM과 해시 테이블을 사용하여 구현되며 이러한 복잡성의 예를 제공합니다.
조회는 매핑 업데이트 문제 설명을 통해 분류에서 LPM 및 해싱으로, 분류에서 처리, 해싱으로 진행됩니다.
업데이트 전략 2: 매핑 교체
불일치 없이 증분 업데이트할 수 없는 매핑(예: LPM 매핑)의 경우 전체 매핑을 바꾸는 것이 가장 좋은 솔루션입니다. eBPF 프로그램의 매핑을 대체하려면 매핑의 매핑이 필요합니다. 사용자 공간 애플리케이션은 새 맵을 생성하고 필요한 항목으로 채운 다음 이전 맵을 원자적으로 바꿀 수 있습니다.
매핑된 매핑으로 인해 리소스 격리 및 교체 기능을 갖춘 두 개의 노드가 생성됩니다.
구성을 각각 단일 엔터티의 설정을 설명하는 별도의 맵으로 분할하면 리소스 격리의 추가 이점을 제공하고 부분 업데이트 중에 전체 구성을 다시 만들 필요가 없습니다. 각각의 여러 엔터티의 구성은 교체 가능한 맵에 저장될 수 있습니다.
이 방법에는 몇 가지 단점이 있습니다. 대체 매핑은 이전 매핑과 동일한 위치에 고정될 수 없기 때문에 사용자 공간은 이전 고정 경로를 유지하기 위해 이전 매핑의 고정을 해제해야 합니다. 이는 구성을 자주 업데이트하고 안정성을 위해 지도 고정에 의존하는 장기 프로그램에 특히 중요합니다.
업데이트 전략 3: 프로그램 교체
여러 지도를 함께 연결하면 지도 교체 방법이 실패할 수 있습니다. 매핑만 업데이트하면 이전 구성이나 예상되는 새 구성이 모두 반영되지 않는 일관되지 않거나 잘못된 상태가 발생할 수 있습니다.
이 문제를 해결하려면 원자적 업데이트가 더 높은 수준에서 이루어져야 합니다. eBPF에는 매핑 세트를 원자적으로 대체하는 메커니즘이 없지만 매핑은 일반적으로 특정 eBPF 프로그램에 연결됩니다. 이 문제는 상호 연결된 매핑과 해당 코드를 테일 호출로 연결된 별도의 eBPF 프로그램으로 나누면 해결될 수 있습니다.
프로그램 매핑 흐름도에 대한 패킷 파이프라인으로 eBPF 프로그램에 대한 교체 가능한 코드 및 매핑 패키지가 생성됩니다.
이를 달성하려면 새 eBPF 프로그램을 로드하고, 이에 대한 매핑을 생성 및 채우고, 둘 다 고정한 다음, 사용자 공간에서 프로그램 매핑을 업데이트해야 합니다. 이 프로세스는 단순한 매핑 교체보다 힘들지만 매핑 및 관련 코드를 동시에 업데이트할 수 있으므로 런타임 코드 조정이 용이해집니다. 그러나 이 접근 방식을 사용하는 것이 항상 특히 효율적이지는 않습니다. 특히 복잡한 프로그램에서 단일 맵 항목을 업데이트하기 위해 여러 맵과 서브루틴을 사용할 때 더욱 그렇습니다.
오류 처리
eBPF를 관리할 때 오류를 처리하는 것은 까다로울 수 있습니다. 불일치를 방지하려면 구성을 업데이트하는 것이 중요합니다. 업데이트 중에 오류가 발생하면 혼란이 발생할 수 있으므로 자동 백업을 사용하면 수동 수정의 필요성을 줄이는 데 도움이 될 수 있습니다.
오류는 복구 가능한 오류와 복구 불가능한 오류라는 두 가지 범주로 나눌 수 있습니다. 복구 가능한 오류의 경우 업데이트 중에 문제가 발생하면 간단히 중지하면 변경 사항이 적용되지 않습니다. 위험 없이 모든 버그를 수정할 수 있습니다.
복구할 수 없는 오류는 조금 더 까다롭습니다. 특정 구성 엔터티에 영향을 주어 전체 시스템을 손상시킬 수 있으므로 주의해서 처리해야 합니다.
업데이트 유형보다는 구성 엔터티별로 업데이트를 구성하는 것이 좋습니다. 이렇게 하면 오류가 발생하면 특정 구성 엔터티에만 영향을 미치고 모든 항목에 동시에 영향을 미치는 것은 아닙니다. 예를 들어, 서로 다른 네트워크 세그먼트에 대해 분류 규칙과 보안 정책이 정의된 경우 업데이트 유형보다는 네트워크 세그먼트를 기반으로 별도의 주기로 업데이트하는 것이 더 효율적입니다. 이를 통해 자동 백업을 더 쉽게 처리할 수 있으며, 복구할 수 없는 오류가 발생하는 경우 그 영향이 무엇인지 정확히 알 수 있습니다. 네트워크의 일부만 일관되지 않게 구성되고 나머지는 영향을 받지 않거나 새 구성으로 빠르게 전환할 수 있습니다.
업데이트를 위한 eBPF 프로그램 수명주기 관리
eBPF 프로그램의 수명주기를 추적하는 것은 지속성, 빈번한 업데이트 및 다양한 코드 인스턴스 간의 상태 보존이 필요한 프로그램에 중요합니다. 예를 들어 XDP 프로그램이 기존 클라이언트 세션을 유지하면서 빈번한 코드 업데이트가 필요한 경우 수명주기를 효과적으로 관리하는 것이 중요합니다.
유연성을 극대화하고 제약 조건을 피하려는 개발자의 목표는 다시 로드할 때마다 중요한 정보(비휘발성 스토리지에서 검색할 수 없는 데이터)만 유지하는 것입니다. 이렇게 하면 동적 구성 조정에 eBPF 매핑을 사용할 수 있습니다.
핫 코드 다시 로드 프로세스를 보다 간단하게 만들려면 상태 맵과 구성 맵을 구별하고, 다시 로드하는 동안 상태 맵을 재사용하고, 비휘발성 스토리지에서 구성 맵을 다시 채울 수 있어야 합니다. 이전 프로그램에서 새 프로그램으로 처리를 전환하고 모든 eBPF 매핑 사용자에게 변경 사항을 알리는 것은 다소 번거로울 수 있습니다.
전환을 구현하는 일반적인 방법에는 두 가지가 있습니다.
- 원자적 프로그램 교체 : 이 방법에는 XDP 프로그램을 네트워크 인터페이스에 직접 연결하고 업데이트 중에 원자적으로 교체하는 방법이 포함됩니다. 이는 다수의 사용자 공간 프로그램 및 맵과 상호 작용하는 크고 복잡한 eBPF 프로그램에 가장 적합하지 않을 수 있습니다.
- libxdp와 유사한 접근 방식 : 스케줄러 프로그램은 네트워크 인터페이스에 연결되고 테일 호출을 사용하여 실제 처리가 수행되는 프로그램 맵의 다음 프로그램에서 처리를 수행합니다. 지도 사용 및 고정을 관리하는 것 외에도 여러 핸들러를 조정하여 핸들러 간의 빠른 전환을 가능하게 합니다.
NIC(네트워크 인터페이스 카드)는 스케줄러, 프로그램 맵 및 상태 맵에 연결되어 실제 프로그램 구성을 생성합니다.
핫 리로드 프로세스는 구성 문제를 신속하게 감지 및 수정하고 필요한 경우 이전의 안정적인 버전으로 빠르게 되돌립니다. A/B 테스트와 같은 복잡한 시나리오의 경우 스케줄러는 분류 테이블을 사용하여 특정 트래픽을 새로운 버전의 XDP 프로그램으로 전달할 수 있습니다.
결론적으로
eBPF/XDP 프로그래밍을 통해 Gcore는 네트워크 보안 및 성능 최적화의 한계를 확장했습니다. 우리의 여정은 고급 eBPF/XDP 기능을 통해 새로운 위협에 맞서 싸우려는 우리의 의지를 보여줍니다. 우리는 패킷 처리 코어를 지속적으로 개선하면서 고객의 네트워크를 강력하고 민첩하게 유지하는 데 도움이 되는 최첨단 솔루션을 제공하기 위해 최선을 다하고 있습니다.
오픈 소스 Hongmeng을 포기하기로 결정했습니다 . 오픈 소스 Hongmeng의 아버지 Wang Chenglu: 오픈 소스 Hongmeng은 중국에서 유일하게 기초 소프트웨어 분야의 건축 혁신 산업 소프트웨어 행사입니다. OGG 1.0이 출시되고 Huawei는 모든 소스 코드를 제공합니다. Google 리더가 "코드 똥 산"에 의해 사망했습니다 Ubuntu 24.04 LTS 공식 출시 Fedora Linux 40 공식 출시 전에 Microsoft 개발자 : Windows 11 성능이 "어리석을 정도로 나쁩니다", Ma Huateng과 Zhou Hongyi가 악수하며 "원한을 제거합니다" 유명 게임 회사가 새로운 규정을 발표했습니다. 직원의 결혼 선물은 10만 위안을 초과할 수 없습니다. 핀둬둬는 부정 경쟁 혐의로 판결을 받았습니다. 보상금은 500만 위안입니다.이 기사는 Yunyunzhongsheng ( https://yylives.cc/ ) 에 처음 게재되었습니다 . 누구나 방문하실 수 있습니다.