limite multicast para interfaces de saída desejadas usando iptables (ou outros comandos lartc)

1

Eu tenho o servidor unifi executando todos os meus pontos de acesso em uma rede. O host do controlador fica em algumas redes, mas apenas um deles deve ser usado pelo unifi. Obviamente, o servidor não tem opções para controlar quais interfaces ele usa. E está espalhando multicast nas redes erradas.

Eu tentei apenas bloquear todas as multidões não brancas da lista de permissões, assim:

iptables -A OUTPUT -d 224.0.0.0/4 -j DROP

Isso parece ser algo óbvio para mim, e funciona, exceto que eventualmente o controlador unifi entra em um loop (sem sleep () aparentemente) e continua tentando encher o soquete para interfaces que eu não quero Ele está falando - obrigado strace para esta revelação. Então o servidor estava com 100% da CPU, apenas por causa de uma regra -j DROP no iptables. Puro.

Estou procurando uma maneira de descartar os pacotes sem bloqueá-los (ou seja, o unifi acha que os pacotes saíram) ou redirecioná-los para interfaces aceitáveis. Mesmo que seja mal conseguido, é melhor do que deixá-lo cair nas redes erradas.

E, para esse fim, eu também tentei guiá-los e rotea-los para loopback, mas os pacotes saíram da interface errada, ignorando as rotas. Eu acho que eles abrem soquetes nas interfaces diretamente ou algo assim.

 iptables -t mangle -A PREROUTING -d 224.0.0.0/4 -j MARK --set-mark 666
 ip rule add fwmark 666 table 666
 ip route add 224.0.0.0/4 dev lo table 666

Estou usando a tabela de roteamento e as marcas fw para garantir que eu não direcione nulo a nenhum multicast desejado (na lista de permissões de outro local).

Eu acho que o unifi ignora a tabela de roteamento. O set-mark estava disparando (contagens de pacotes ENORMES), mas os pacotes continuavam a sair das interfaces indesejadas. Regras semelhantes para outros multicasts parecem funcionar bem. É algo que o unifi horrível está fazendo (soquete ip bruto talvez?).

Não é realmente uma questão importante. Eu simplesmente mudei os serviços para um vm diferente que tem apenas uma interface; mas gostaria de saber como poderia fazer isso por motivos acadêmicos. Parece que deve haver uma maneira de limitar os aplicativos às interfaces que você deseja que sejam limitadas.

    
por jettero 22.03.2015 / 19:39

1 resposta

2

Uma maneira de fazer isso seria usar unshare -n para colocar o processo em seu próprio namespace de rede. Isso restringirá efetivamente as interfaces às quais ele pode se ligar, de modo que só enviará as interfaces exportadas pelo namespace.

Isso equivale a colocá-lo em uma VM com apenas uma interface, mas "mais barato", no sentido de que não exige as despesas adicionais da VM.

Você também pode tentar colocar sua regra PREROUTING na cadeia OUTPUT, uma vez que esses pacotes são gerados localmente (suponho) no host. O roteamento é simplesmente ignorado porque o netfilter não analisa os pacotes fornecidos localmente na cadeia PREROUTING.

Além disso, algumas regras do iptables especificando a interface que você permite e multicast serão úteis.

iptables -o ethX -d 224.0.0.0/4 -j DROP

Ajudaria a garantir que os pacotes realmente saiam das redes que você gosta.

    
por 22.03.2015 / 19:51

Tags