2017-12-01 3 views
2

I 컴파일 BPF의 예와 함께 작동하지 않습니다간단한 eBPF은 매우 간단 변화위원회 (리눅스 커널 트리에서) <code>samples/bpf/pare_simple.c</code>에서

SEC("simple") 
int handle_ingress(struct __sk_buff *skb) 
{ 
    return TC_ACT_SHOT; 
} 

그래서 나는 어떤 패킷이 삭제되고 싶어요. 다음과 같이 설치합니다 :

우분투 16.04.3 LTS에서 커널 4.4.0-98, llvm 및 패키지에서 3.8 버전의 clang이 설치되면 iproute2가 github의 최신 버전입니다.

$ tc qdisc add dev eth0 clsact 
$ tc filter add dev eth0 ingress bpf \ 
     object-file ./net-next.git/samples/bpf/parse_simple.o \ 
     section simple verbose 

Prog section 'simple' loaded (5)! 
- Type:   3 
- Instructions: 2 (0 over limit) 
- License:  GPL 

Verifier analysis: 

0: (b7) r0 = 2 
1: (95) exit 
processed 2 insns, stack depth 0 

는 그래서 내가 eth0 인터페이스, 예를 들어,에 유입 트래픽을 생성, 그것은 그러나이 필터/ebpf가 패킷을 드롭하지 않습니다 성공적으로 설치 보인다 ICMP, 그리고 그것을 전달합니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

+1

커맨드 라인에서'direct-action' tc 플래그로 시도해주십시오 ('verbose' 이전에) ([see here] (https://git.kernel.org/pub/scm/linux/kernel) /git/torvalds/linux.git/commit/?id=045efa82ff563cd4e656ca1c2e354fa5bf6bbda4)) – Qeole

+0

@Qeole, 정말로 도움이되었습니다. 감사합니다! 이 플래그는 무엇을 나타 냅니까? – Mark

+0

좋은 질문, 나는 그것에 대답하기 위해 블로그 게시물을 만들려고했지만 시간을 찾지 못했습니다 :) 여기에 적절한 대답의 몇 가지 설명이 있습니다 – Qeole

답변

2

TL; DR : 당신은

tc filter add dev eth0 ingress bpf \ 
    object-file ./net-next.git/samples/bpf/parse_simple.o \ 
    section simple direct-action verbose 
        ^^^^^^^^^^^^^ 

tc bpf filter bpf help에 대한 짧은 도움이 플래그를 언급에 같이 tc filter 명령에 direct-action 플래그를 추가해야하지만이에 tc-bpf(8) 매뉴얼 페이지에 그것의 방법을 만들어하지 않은됩니다 내가 정확히 기억한다면 시간.

이 플래그는 무엇인가요? 행동, 또는 분류 다음과 같음 :

eBPF 프로그램은 TC와 두 가지 방법으로 부착 할 수 있습니다. tc filter add과 함께 첨부 된 분류 자 ​​(Classifier)는 패킷 필터링에 사용되기로되어 있으며 기본적으로 동작을 적용하지 않습니다. ,

0, 불일치

-1을 표시 기본 명령 줄 다른

, 다른 모든 것들에서 구성 classid를 나타냅니다 : 어떤 자신의 반환 값이 (man tc-bpf에서) 다음과 같은 의미를 가지고 있다는 것을 의미 한편, tc action add 부착

조치 일치 비선형위한 기능을 제공하는 디폴트 CLASSID을 무시할 것이다 드롭 또는 거울이나 O를 수행 패킷을 가진 방문자는 실제로 필터링하지 않습니다.

eBPF는 tc의 전통적인 동작 및 필터보다 융통성이 있기 때문에 실제로 한 번에 두 가지 작업을 모두 수행 할 수 있습니다. 즉, 패킷을 필터링 (즉,이 패킷 식별)하고 이에 대한 작업을 수행 할 수 있습니다. 이 유연성을 반영하기 위해 direct-action 또는 da 플래그가 추가되었습니다 (커널 4.4 이상인 경우 iproute2 패키지와 일치 함). 그것은 커널에게 분류자인에 대해 액션 (TC_ACT_SHOT, TC_ACT_OK 등)의 반환 값을 사용하도록 커널에 지시합니다. 그리고 이것은 커널이 패킷을 버리기를 원한다는 것을 이해하는 방식으로 TC_ACT_SHOT을 반환하기 위해 여기에 필요합니다.

정확하게 기억한다면, 액션 필터를 삭제하는 대신이 플래그를 사용하는 이유는 액션을 첨부하기 위해 어쨌든 필터가 필요하다는 것입니다. (확인). 따라서 direct-action 플래그를 사용하면 하나의 필터와 하나의 작업을 모두 첨부 할 필요가 없으며 필터는 두 가지 작업을 모두 수행 할 수 있습니다. 이것은 tc로 eBPF 프로그래밍을하기 위해 선호되는 방법이다.