[FUG-BR] PFSENSE e BGP e TABLES e PF

Edson Brandi ebrandi em fugspbr.org
Terça Julho 17 10:09:17 BRT 2012


Bom dia Renato,

Em 17 de julho de 2012 06:56, Renato Frederick
<renato at frederick.eti.br> escreveu:
> No pfsense, o que a interface gráfica chama de "aliases de firewall" são
> tables <table1> ou aliases mesmo $alias1?

São tabelas :)

> Outra coisa, notei que no pfsense, as table do pf criada não são
> "persist". Assim, se o "alias de firewall" está vazio, não é criada a
> table, certo? Qual seria um truque, criar o alias e lá digitar um IP
> qualquer tipo 1.1.1.1, prá ela sempre ser criada(lembrando que esta
> table o bgp que vai popular)
> O que eu notei é que quando a table não tem nenhum IP, o PF não a cria,
> daí o openbgpd não preenche ela(claro, ela não existe) e só volta a
> preencher se eu matar e voltar o bgpd(nem um rbgpctl eload resolve).

Vc já deu uma olhada no /etc/inc/filter.inc ?

Abre ele ai e da uma olhada nas linhas que vem depois da linha 542

####

        $aliases .= "\n# User Aliases \n";
        /* Setup pf groups */
        if(isset($config['aliases']['alias'])) {
                foreach ($config['aliases']['alias'] as $aliased) {
                        $extralias = "";
                        $aliasnesting = array();
                        $aliasaddrnesting = array();
                        $addrlist =
filter_generate_nested_alias($aliased['name'], $aliased['address'],
$aliasnesting, $aliasaddrnesting);
                        switch ($aliased['type']) {
                        case "host":
                        case "network":
                        case "url":
                                $tableaddrs = "{$addrlist}{$extralias}";
                                if(empty($tableaddrs)) {
                                        $aliases .= "table
<{$aliased['name']}> persist\n";
                                        if (empty($aliased['address']))

$after_filter_configure_run[] = "/sbin/pfctl -T flush -t " .
escapeshellarg($aliased['name']);
                                } else
                                        $aliases .= "table
<{$aliased['name']}> { {$addrlist}{$extralias} } \n";

                                $aliases .= "{$aliased['name']} =
\"<{$aliased['name']}>\"\n";
                                break;

####

Ou seja, se você criar um alias pela interface web e não cadastrar
nenhum IP, pfSense vai gerar uma linha no seu /tmp/rules.debug do
tipo:

# User Aliases
table <NOME_DO_ALIAS> persist
MONE_DO_ALIAS = "<NOME_DO_ALIAS>"

Se você criar cadastrar manualmente um endereço ele vai gerar uma
entrada do tipo:

# User Aliases
table <NOME_DO_ALIAS> {   10.10.10.0/24  10.10.20.0/24  10.10.30.0/24 }
NOME_DO_ALIAS = "<NOME_DO_ALIAS>"

Se você quiser que ele faça as tabelas serem persistentes mesmo quando
vc insere manualmente os dados, vc precisa alterar a linha 566 de:

$aliases .= "table <{$aliased['name']}> { {$addrlist}{$extralias} } \n";

para

$aliases .= "table <{$aliased['name']}> { {$addrlist}{$extralias} } persist\n";

> Por fim, a última dúvida: ao aplicar as alterações feitas na regra de
> firewall via web, o que o PF vai fazer com esta table, zerar ela e
> preencher com o que tem nos aliases, sobrescrevendo o que o bgpd populou?

Eu não testei Renato, mas acredito que devido o comportamento default
do pfSense, sempre que vc aplica uma alteração na interface web ele
gera um /tmp/rules.debug e faz o load do mesmo usando o pfctl, o que
acredito que ocorra nesse caso é que ele vai "limpar" os dados
inseridos pelo bgpd , sobrescrevendo com os dados cadastrados na
interface web.

Mas acho que o bgpd não vai repopular essa tabela, se vc não restartar ele...

Talvez uma saida para este caso (para alimentar o alias com dados
gerados por um outro software), seria criar um firewall  alias do tipo
"url". Este tipo de alias permite que vc especifique uma url com um
arquivo (pode estar inclusive compactado) o qual contem a lista de
redes/ips que vc quer que façam parte do alias.

Periodicamente o pfsense busca essa informação e atualiza o as tabelas
do pf (vc pode ajustar essa periodicidade no cron pro exemplo).

Acredito que se você conseguir fazer um shell script para gerar um
dump dos dados do bgpd para um arquivo texto (os mesmos que ele
gravaria no pf), e este mesmo script na sequencia chamar o script do
pfsense que faz a atualização do aliases
(/etc/rc.update_alias_url_data e na sequencia o rc.update_urltables),
vc conseguiria o que quer :)

O que acha?

[ ]´s Brandi


Mais detalhes sobre a lista de discussão freebsd