Networking

FreeBSD 上 ipfw 和 ng_bpf 的工作網路圖配置

  • January 11, 2016

我正在嘗試使用ipfwwithng_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都會被丟棄。

目的是讓與BPF程序匹配的入站數據包使用MTAG_IPFWcookie 和所需標籤進行標記,不匹配的數據包僅使用前者進行標記,並且從ng_tag模組返回的數據包都被轉發ng_ipfw通過單指令程序ret 8192( code=6, k=8192)返回上游模組。

誰能發現問題所在,或者指出一個完整的線上範例,說明如何以這種方式正確標記數據包?

在找到一個非標記範例(俄語!)之後,我已經設法自己解決了這個問題,使用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__

引用自:https://unix.stackexchange.com/questions/254193