ipfw
, 및 의 조합을 사용하여 FreeBSD에서 작동하는 원시 BPF 바이트코드 패킷 필터를 얻으 려고 합니다 .ng_ipfw
ng_bpf
ng_tag
그러나 내가 찾은 문서나 프리젠테이션에는 완전한 작업 예제가 포함되어 있지 않았습니다. 매뉴얼 페이지에는 일치하지 않는 패킷을 전달하기 위한 코드 ng_tag
만 표시되고 전체 네트워크 그래프에 대한 올바른 후크를 생성하는 방법은 표시되지 않습니다.bpf_prog
ng_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_ipfw
ret 8192
code=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__