Skip to content
KitploitKITPLOIT
도구블로그
Log in
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
netfence — Envoy xDS처럼, 하지만 eBPF 필터를 위한 | Kitploit
도구/GitHubGitHub/danthegoodman1/netfence
Cloud Infrastructure SecurityContainer SecurityIDS/IPS EvasionNetwork SecurityCloud SecurityDevSecOpsMisconfigurationDNS Analysis
GitHubdanthegoodman1/netfence

netfence

Envoy xDS처럼, 하지만 eBPF 필터를 위한

저장소 보기
10141611일 전Kitploit 검토 완료

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

Netfence

Like Envoy xDS, but for eBPF filters.

Netfence는 VM/컨테이너 호스트에서 데몬으로 실행되며, eBPF 필터 프로그램을 cgroup 및 네트워크 인터페이스에 자동으로 주입합니다. 허용된 도메인을 확인하고 IP 허용 목록을 채우는 내장 DNS 서버가 포함되어 있습니다.

Netfence 데몬은 로컬 Unix 소켓 API만으로 구동하거나, gRPC를 통해 구현하는 중앙 제어 플레인에 연결하여 백엔드와 허용 목록/차단 목록을 동기화할 수 있습니다.

제어 플레인은 연결된 인터페이스/cgroup에 ALLOW *.pypi.org 또는 ALLOW 10.0.0.0/16과 같은 네트워크 규칙을 푸시합니다. VM/컨테이너가 DNS를 쿼리하면 Netfence가 이를 확인하고, 해당 IP를 eBPF 필터에 추가하며, 알 수 없는 IP로의 트래픽은 호스트를 떠나기 전에 드롭합니다. 현재 벤치마크에서 워밍된 경로의 오버헤드는 일반 소켓 연결과 사실상 구별할 수 없습니다.

기능

  • eBPF 필터를 네트워크 인터페이스(TC) 또는 cgroup에 연결
  • 정책 모드: 비활성화, 허용 목록, 차단 목록, 모두 차단
  • 선택적 TTL이 포함된 IPv4 및 IPv6 CIDR 지원
  • 도메인 허용 목록/차단 목록과 순서 지정된 업스트림 재정의가 포함된 연결별 UDP/TCP DNS 서버
  • 도메인 규칙은 하위 도메인을 지원하며, 더 구체적인 규칙이 우선함
  • 확인된 도메인이 자동으로 IP 필터에 추가됨
  • 데몬 및 연결에 대한 메타데이터로 VM ID, 테넌트 등과 연결 가능
  • DNS 쿼리를 제어 플레인에 프록시하여 연결별 DNS 결정을 내리는 기능 지원

보안 참고: 기본 제외( carve-out )

허용 목록 모드에서 IPv4 링크-로컬(169.254.0.0/16)은 더 이상 기본적으로 자동 허용되지 않습니다 — 따라서 클라우드 메타데이터 서비스(169.254.169.254)는 명시적으로 허용 목록에 추가되지 않으면 차단됩니다. 이는 의도적인 것입니다: 메타데이터 서비스는 자격 증명 도용 대상이며, 샌드박스된 워크로드는 암묵적으로 이에 접근할 수 없어야 합니다. 로컬호스트(127.0.0.0/8, ::1) 및 IPv6 이웃 탐색(fe80::/10, ff02::/16)은 기본적으로 허용되어 기본 연결 및 NDP가 계속 작동합니다. 워크로드에 메타데이터 서비스를 허용하려면 169.254.169.254/32를 허용 목록에 추가하십시오 (제어 플레인을 통한 연결별 제외 재정의는 추후 예정).

IPv4 브로드캐스트(255.255.255.255) 및 멀티캐스트(224.0.0.0/4)는 제외되지 않으며 정책의 적용을 받으므로, TC 허용 목록 모드에서 DHCP 갱신 브로드캐스트와 같은 트래픽은 명시적으로 허용되지 않으면 차단됩니다. 제외 검사는 차단 목록보다 먼저 실행되므로, 제외된 범위는 제외를 해제해야만 차단할 수 있습니다. 그리고 IPv4 링크-로컬이 이제 기본적으로 꺼져 있으므로, 차단 목록 모드에서도 메타데이터 서비스를 차단할 수 있습니다.

다른 옵션과의 차이점

이 솔루션은 일반적으로 다른 옵션이 지원하지 않는 몇 가지 주요 이점을 제공합니다:

  • IP를 허용하지 않도록 규칙이 변경될 때 기존 연결을 즉시 종료(인터페이스 연결만 해당)
  • 모든 네트워크 프로토콜을 지원하며, IP 네트워킹에 직접 연결 가능. 예를 들어 훌륭한 httpjail은 IP에 직접 연결하거나 데이터베이스 연결과 같은 직접 TCP/UDP 연결을 허용하지 않습니다.
  • DNS의 동적 확인 및 사전 확인 필터링 (따라서 secretdata.someattacker.com과 같은 데이터 유출이 없음)

제가 알기로는 다른 솔루션은 이러한 모든 기능을 함께 제공하지 않습니다.

알려진 제한 사항: cgroup 연결은 소켓 계층(connect/sendmsg 후크)에서 필터링하므로, CAP_NET_RAW 권한이 있는 프로세스는 이를 우회하는 원시 패킷을 생성할 수 있습니다. CAP_NET_RAW를 보유할 수 있는 워크로드에는 장치 계층에서 필터링하는 TC(인터페이스) 연결을 사용하십시오.

하지만, 이것은 httpjail과 같은 것보다 약간 더 많은 오버헤드가 있습니다.

성능 요약

이 수치는 권한 있는 Docker Linux 게이트(linux/arm64)에서 make bench-docker를 사용하여 측정되었습니다. 값은 5개 샘플의 중앙값입니다.

웜 소켓 경로

웜 소켓 벤치마크는 연결된 UDP 소켓을 사용하여 cgroup/connect4 eBPF 후크 비용을 TCP 핸드셰이크 지연 시간과 분리합니다. 이 경로에서는 DNS가 이미 도메인을 확인했고, IP가 여전히 TTL 내에 있으며, IP/CIDR이 이미 eBPF 맵에 존재합니다.

경로중앙값 지연 시간
일반 소켓 연결, eBPF 없음~2.647 us
웜 허용 목록, 보호된 LPM 적중~2.691 us
웜 허용 목록, DNS 정확한 호스트 적중~2.741 us
허용 목록 미스, 로컬 차단~1.652 us

일반, 보호된 LPM 및 DNS 정확한 호스트 연결 경로 간의 측정된 차이는 샘플 노이즈 범위 내에 있습니다.

현재 "커널 미스가 부모 프로세스에 묻는" 경로는 없습니다. cgroup 허용 목록 미스는 eBPF에 의해 로컬에서 결정되며 즉시 차단됩니다.

DNS 쿼리 경로

이 수치는 웜 소켓 연결 경로가 아닌 DNS 서버 경로를 측정합니다.

경로중앙값 지연 시간
프록시 쿼리 콜드, 프로세스 내 정책 함수~31.336 us
프록시 쿼리 웜~27.964 us
허용 목록 쿼리 콜드, 로컬 업스트림 사용~53.510 us
허용 목록 쿼리 웜, 로컬 업스트림 사용~53.432 us

콜드 행은 실제 연결 돌연변이 배리어를 동기화하고, 쿼리 사이에 벤치마크 소유권 그래프와 가상 정확 맵 스냅샷을 지웁니다. 타이머는 UDP 스케줄러 지역성을 유지하기 위해 계속 실행되며, ns/op은 별도로 보고된 fixture-reset-ns/op 월 시간(클라이언트가 패킷을 수신한 후 이전 핸들러의 꼬리 포함)을 빼서 현재 클라이언트 Exchange를 측정합니다. raw-total-ns/op은 둘을 함께 보고합니다. 재설정은 구성된 정책 도메인과 백업 저장소를 유지하며, 벤치마크는 쿼리당 하나의 물리적 정확 맵 추가를 단정합니다. 웜 행은 소유권을 한 번 초기화하고 실행 전반에 걸쳐 하나의 물리적 추가를 단정합니다.

아래의 내부 소유권 마이크로벤치마크는 확장성 진단 도구이며, 종단 간 DNS 쿼리 경로 승인 행이 아닙니다. 캐시된 헬퍼는 테스트 및 벤치마크용으로만 유지됩니다. 한 번에 하나의 레코드를 래핑하고 도메인 유효성 검사를 반복합니다. 이와 일반 리졸버 트래픽 모두 연결 돌연변이 배리어를 통과하며, 일반 리졸버 트래픽은 각 완전한 응답을 하나의 트랜잭션으로 인정합니다.

내부 확장성 진단현재 중앙값메모리 / 할당
콜드 새 키 승인, 빈 소유권 그래프~370.3 ns232 B, 5 allocs/op
콜드 새 키 승인, 4,095개의 관련 없는 항목~451.2 ns232 B, 5 allocs/op
물리적 용량 압력 및 LRU 교체~3.820 ms~4.23 MB (4,226,243 B), 4,336 allocs/op
물리적 예산 소진 사전 검사~611.9 ns344 B, 9 allocs/op
최대 에지 압력, 64개 주소 응답~6.849 ms~7.66 MB (7,658,774 B), 2,233 allocs/op
최대 그래프 작업 가드, 허용된 전체 계획~2.763 ms~4.26 MB (4,264,386 B), 3,074 allocs/op
최대 그래프 작업 가드, 사전 투영 거부로 소진~10.935 us8.76 KB (8,760 B), 14 allocs/op
숫자 상한 근처의 이탈 예산 작업~18.98 ns0 B, 0 allocs/op
일관된 소유권 통계 스냅샷~2.094 ns0 B, 0 allocs/op
4,095개 항목에 대한 무작동 만료 검사~74.849 us/scan0 B, 0 allocs/op

설계

아키텍처```

+------------------+ +-------------------------+ | Your Control |<------->| Daemon (per host) | | Plane (gRPC) | stream | | +------------------+ | +-------------------+ | | | DNS Server | | | | (per-attachment) | | | +-------------------+ | +-------------------------+ | +------+------+ | | TC Filter Cgroup Filter (veth, eth) (containers)

각 첨부된 워크로드는 데몬에 의해 제공되는 고유한 DNS 주소(포트)를 받습니다. 컨테이너/VM은 할당된 DNS 주소를 사용하도록 구성되어야 합니다. 일반 워크로드 DNS 트래픽을 필터링해도 투명하게 리디렉션되지 않습니다.

### DNS 리졸버 토폴로지 및 동작

`dns.listen_addr`는 연결된 모든 워크로드가 도달할 수 있는 하나의 구체적인 IPv4 또는 IPv6 주소를 식별해야 합니다. 와일드카드 주소는 리졸버 엔드포인트로 광고될 수 없기 때문에 거부됩니다. 구성된 호스트 이름은 데몬이 시작될 때 한 번 확인되며, 결과 구체적인 IP는 바인딩, 광고, 지속성 및 필터 부트스트랩에 사용됩니다. 기본값 `127.0.0.1`은 워크로드가 데몬의 네트워크 네임스페이스를 공유하는 경우에만 적합합니다. 다른 네임스페이스에 있는 컨테이너나 VM은 일반적으로 대신 도달 가능한 호스트/브릿지 주소가 필요합니다.```yaml
dns:
  listen_addr: 10.0.0.1
  port_min: 11000
  port_max: 11500
  # Daemon-global fallback when DnsConfig.upstream_servers is empty.
  upstream: 1.1.1.1:53
  # Hard daemon ceilings for each attachment's bounded DNS exact ownership.
  # Zero/unset uses these defaults (max_ips_per_family instead derives from
  # filter.max_dns_rule_entries).
  max_ips_per_family: 4096
  max_ips_per_response: 64
  max_ips_per_policy_domain: 1024
  max_tracked_domains: 1024
  max_ownership_edges: 8192
  # Rolling physical-admission/LRU mutation budget and slow-planning work
  # allowance. The window is daemon-global and immutable until restart;
  # DnsConfig.max_churn_units may only lower the daemon ceiling.
  max_churn_units: 8192
  churn_window: 1m

Attach는 구체적인 dns_address를 반환합니다. 정확히 해당 주소를 작업 부하의 해석기로 구성하세요. Netfence는 리스너 IP에 대한 보호된 만료되지 않는 /32 또는 /128 허용 항목을 설치하므로 허용 목록 모드가 제어 평면 DNS-IP 규칙 없이 부트스트랩할 수 있습니다. 현재 필터는 IP 접두사를 적용하고 대상 포트는 적용하지 않으므로, 보호된 항목은 리스너 IP의 모든 포트(DNS 포트뿐만 아니라)를 허용합니다. 이는 cgroup 연결 위협 모델에서 특히 중요합니다. 더 넓은 연결성이 허용되지 않는 경우 전용 리스너 IP를 사용하세요.

할당된 엔드포인트는 UDP와 TCP를 모두 제공합니다. UDP 응답은 레거시 클라이언트의 512바이트 제한 또는 광고된 EDNS 크기로 잘리며, 필요 시 TC 플래그를 설정하여 작업 부하가 동일한 엔드포인트로 TCP 재시도를 할 수 있도록 합니다. 업스트림 해석의 경우, 잘린 UDP 응답은 먼저 동일한 업스트림에 대해 TCP로 재시도됩니다. 전송 실패, SERVFAIL 또는 REFUSED가 발생하면 구성된 다음 업스트림으로 순서대로 진행됩니다.

DnsConfig.upstream_servers는 하나의 첨부에 대해 데몬 전역 dns.upstream을 재정의합니다. 항목은 host:port 구문(IPv6 리터럴은 대괄호 사용)을 사용하며, 정규화되고 처음 본 순서대로 중복 제거되며, 최대 8개의 고유 서버로 제한됩니다. 빈 목록은 전역 폴백을 선택합니다.

필터링 모드에서 Netfence는 HTTPS/SVCB 응답에서 ipv4hint 및 ipv6hint 매개변수(해당 mandatory 참조 포함)를 제거합니다. 힌트된 주소가 필터 승인을 독립적으로 통과하지 못했기 때문입니다. 비활성화 모드는 업스트림 응답을 변경하지 않고 유지합니다.

DNS 쿼리 카운터는 상호 배타적입니다. dns_queries_allowed는 정책이 허용하는 성공적으로 응답된 쿼리(NXDOMAIN 포함)를 계산하고, dns_queries_blocked는 정책 REFUSED 응답을 계산하며, dns_queries_errors는 해석기, 프록시, 필터 승인, 응답 쓰기 및 기타 오류 경로를 계산합니다. 각 쿼리는 정확히 하나의 버킷을 증가시킵니다.

필터링 DNS 모드에서 주소를 포함하는 모든 응답은 A/AAAA 응답, 권한, 추가 섹션의 주소가 반환되기 전에 한 번의 트랜잭션으로 첨부의 정확한 IPv4/IPv6 HASH 계층에 승인됩니다. 전체 응답을 표현할 수 없는 경우, 해석기는 주소 없이 SERVFAIL을 반환하고 이전에 승인된 작업 세트를 유지합니다. 주소를 반환하는 PROXY 결정은 add_to_filter를 설정해야 합니다. 그렇지 않으면 SERVFAIL로 실패 폐쇄됩니다. 비활성화 DNS 모드는 명시적인 통과 예외입니다.

정확한 항목은 정규화된 쿼리에서 일치하는 정책 소유자까지의 TTL 간선을 전달합니다. 도메인을 제거하거나 거부하면 마지막 DNS 전용 정확한 주소가 신속히 제거되는 반면, 공유 주소는 다른 활성 쿼리 소유자가 존재하면 유지되고, 겹치는 제어 평면 CIDR은 보호된 LPM 계층에서 독립적으로 계속됩니다. DNS 거부 목록 기본 허용 및 명시적 허용 응답도 추적됩니다. 패킷 거부 목록이 정확한 허용을 무시하는 동안에도 추적되므로, 이후 패킷 모드가 허용 목록으로 전환될 때 재쿼리 없이 이미 반환된 캐시된 주소를 사용할 수 있습니다.

도구 다운로드