나는 PREROUTING 테이블의 MAC 주소 범위를 일치시키기 위해 iptables 규칙을 작업 중입니다. 내 구현에서는 iptables-extensions의 BPF 일치 옵션을 사용합니다. 다음은 aa:bb:cc:dd:ee:ff를 버리고 모든 바이트와 일치하는 MAC 주소와 일치해야 하는 표현식의 예입니다.
((ether[6:4] & 0xffffffff) = (0xaabbccdd & 0xffffffff)) && ((ether[10:2] & 0xffff) = (0xeeff & 0xffff))
출력 결과에 따르면 tcpdump -nn
식이 올바른 것으로 보입니다.
tcpdump -ddd
또는 유틸리티를 통해 전송되면 nfbpf_compile
결과 바이트코드는 iptables 규칙을 생성하는 데 사용됩니다.
iptables -t raw -A PREROUTING -i br0 -m bpf --bytecode "BYTECODE OUTPUT" -j DROP
내 문제는 PREROUTING 테이블에서 이 규칙을 만들 때(수행해야 함) 패킷이 거의 삭제되지 않는다는 것입니다. 대부분의 패킷은 필터를 통과합니다. INPUT 테이블에 규칙이 만들어지면 패킷이 성공적으로 차단된 것으로 나타납니다.
왜 이런 일이 발생합니까?
답변1
적어도 iptables 내에서는 이를 위해 BPF 매칭을 사용할 수 없다는 것이 밝혀졌습니다.
RAW 링크 유형(예: TAP 장치)을 사용하는 경우에만 이더넷 헤더에 대해 BPF 일치를 사용할 수 있습니다. EN10MB만 지원하는 물리적 장치를 사용하는 경우 이더넷 헤더가 포함되지 않습니다.
이 기능을 구현하고 iptables를 사용해야 하는 경우 헤더 정보를 볼 수 있는 TAP(또는 유사한) 가상 인터페이스를 생성해야 합니다.