configuração do netgraph para ipfw e ng_bpf no FreeBSD

1

Estou tentando obter um filtro de pacote de código de bytes BPF bruto funcionando no FreeBSD usando uma combinação de ipfw com ng_ipfw , ng_bpf e ng_tag .

No entanto, nenhuma das documentações ou apresentações que posso encontrar inclui exemplos completos de trabalho. A página ng_tag man mostra apenas o código bpf_prog para passar um pacote não correspondido de volta para ng_bpf , mas não como gerar os ganchos corretos para todo o netgraph.

#!/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

Este é o meu melhor palpite, mas tudo o que acontece é que qualquer pacote que corresponda à regra ipfw e que derruba o material em netgraph será descartado.

A intenção era fazer com que os pacotes de entrada que correspondam ao programa BPF fossem marcados com o cookie MTAG_IPFW e a tag desejada, e que os pacotes que não correspondam somente sejam marcados com o primeiro, e os pacotes que estão sendo retornados do módulo ng_tag são encaminhados de volta para o módulo ng_ipfw através do único programa de instrução ret 8192 ( code=6, k=8192 ).

Alguém pode identificar o que está errado ou me indicar um exemplo on-line completo de como marcar corretamente um pacote dessa maneira?

    
por Alnitak 09.01.2016 / 02:11

1 resposta

0

Depois de encontrar um exemplo sem marcação (em russo!), consegui corrigir eu mesmo, usando uma versão simplificada dos comandos ngctl em minha pergunta que apenas retorna pacotes não correspondentes diretamente de volta para 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__
    
por 11.01.2016 / 12:08