FreeBSD에서 ipfw 및 ng_bpf에 대한 작업 네트워크 다이어그램 구성

FreeBSD에서 ipfw 및 ng_bpf에 대한 작업 네트워크 다이어그램 구성

ipfw, 및 의 조합을 사용하여 FreeBSD에서 작동하는 원시 BPF 바이트코드 패킷 필터를 얻으 려고 합니다 .ng_ipfwng_bpfng_tag

그러나 내가 찾은 문서나 프리젠테이션에는 완전한 작업 예제가 포함되어 있지 않았습니다. 매뉴얼 페이지에는 일치하지 않는 패킷을 전달하기 위한 코드 ng_tag만 표시되고 전체 네트워크 그래프에 대한 올바른 후크를 생성하는 방법은 표시되지 않습니다.bpf_progng_bpf

#!/bin/sh
cookie=41
tag=412
mtag_ipfw=1148380143        # IPFW-tagged cookie from <netinet/ip_var.h>

prog=$(./bpfgen | ./bytecode_to_ngbpf)  # generate BPF code here

ngctl shutdown ipfw:$cookie

ngctl -f- <<-__END__
  mkpeer ipfw: bpf $cookie filter
  name ipfw:$cookie CLASSIFIER
  msg CLASSIFIER: setprogram { thisHook="filter" ifMatch="match" ifNotMatch="notmatch" $prog }
  mkpeer CLASSIFIER: tag match tag_bad
  name CLASSIFIER:match TAGGER
  connect CLASSIFIER: TAGGER: notmatch tag_good
  msg CLASSIFIER: setprogram { thisHook="match" ifMatch="ipfw" bpf_prog_len=1 bpf_prog=[ { code=6 k=8192 } ] }
  msg CLASSIFIER: setprogram { thisHook="notmatch" ifMatch="ipfw" bpf_prog_len=1 bpf_prog=[ { code=6 k=8192 } ] }
  msg TAGGER: sethookin { thisHook="tag_bad" ifNotMatch="tag_bad" }
  msg TAGGER: sethookout { thisHook="tag_bad" tag_cookie=$mtag_ipfw tag_id=$tag }
  msg TAGGER: sethookin { thisHook="tag_good" ifNotMatch="tag_good" }
  msg TAGGER: sethookout { thisHook="tag_good" tag_cookie=$mtag_ipfw }
__END__

ipfw add 2000 netgraph $cookie udp from any to any
ipfw add 2010 allow log udp from any to any tagged $tag

sysctl net.inet.ip.fw.one_pass=0

이것이 최선의 추측이지만, 일어나는 모든 일은 ipfw콘텐츠를 넣는 규칙과 일치하는 모든 패킷이 netgraph삭제된다는 것입니다.

이것의도아이디어는 MTAG_IPFW쿠키 및 필수 태그로 표시된 BPF 프로그램과 일치하는 인바운드 패킷, 전자로만 표시된 일치하지 않는 패킷, 모듈에서 반환된 패킷이 단일 지시 프로그램 ( ) 을 통해 모듈 ng_tag로 다시 업스트림으로 전달되도록 하는 것입니다 .ng_ipfwret 8192code=6, k=8192

누구든지 문제가 무엇인지 알아낼 수 있습니까? 아니면 이러한 방식으로 패킷을 올바르게 표시하는 방법에 대한 완전한 온라인 예를 알려줄 수 있습니까?

답변1

하나를 찾은 후표시되지 않은 예ngctl(러시아어!) 그 이후로 나는 내 질문에 있는 명령의 단순화된 버전을 사용하여 문제를 직접 해결했습니다. 이 명령은 일치하지 않는 패킷을 다음으로 직접 반환합니다 ipfw.

ngctl -f- <<-__END__
  mkpeer ipfw: bpf $cookie filter
  name ipfw:$cookie CLASSIFIER
  mkpeer CLASSIFIER: tag matched tag_bad
  name CLASSIFIER:matched TAGGER
  msg CLASSIFIER: setprogram { thisHook="filter" ifNotMatch="filter" ifMatch="matched" $prog }
  msg TAGGER: sethookin { thisHook="tag_bad" ifNotMatch="tag_bad" }
  msg TAGGER: sethookout { thisHook="tag_bad" tag_cookie=$mtag_ipfw tag_id=$tag }
  msg CLASSIFIER: setprogram { thisHook="matched" ifMatch="filter" ifNotMatch="filter" bpf_prog_len=1 bpf_prog=[ { code=6 k=65535 } ] }
__END__

관련 정보