Unicast para multicast via iptables

1

Observação: Embora haja uma resposta aceita agora, é apenas uma parte; verifique a regra final do iptables abaixo.

Estou recebendo um fluxo RTP unicast em uma interface e desejo enviá-lo via multicast em uma segunda interface. O sistema em questão é um processador embarcado rodando Linux, mas eu estou achando igualmente difícil configurar no meu host Ubuntu 10.10. A resposta simples e óbvia, baseada no link e em outras fontes, parece ser:

iptables -t nat -A PREROUTING -i [unicast-interface] -p udp --dport [unicast-incoming-port] -j DNAT --to-destination [multicast-addr]:[multicast-port]

Um pouco de pesquisa adicional resultou nesse pareamento:

iptables -t nat -A PREROUTING -i [unicast-interface] -p udp --dport [unicast-incoming-port] -j DNAT --to-destination [multicast-addr]:[multicast-port]
iptables -A FORWARD -i [unicast-interface] -o [multicast-interface] -p udp --dport [unicast-incoming-port] -j ACCEPT

Embora as regras apareçam quando listadas, e o tcpdump mostra os pacotes unicast chegando, o Wireshark em uma máquina separada não mostrou pacotes saindo.

Eu olhei para Como traduzir unicast para broadcast via DNAT com iptables? , mas isso parece preocupado com as especificidades do caso de transmissão.

Nota: não existem outras regras do iptables que foram definidas. Eu verifiquei duas vezes usando iptables -L (e -t nat -L) e iptables --flush.

(Eu sei que existem outras opções, como socat - mas antes de mudar para elas eu gostaria de ter certeza de que não estou perdendo alguma coisa.)

Editar: tenho o ip_forward ativado.

~ # sysctl -a 2>&1 |grep ip_forward
net.ipv4.ip_forward = 1

Editar: Parece que estou aumentando as contagens de pacotes na minha tabela NAT ( iptables -t nat -L -v -n ), mas não na tabela principal / de filtros ( iptables -L -v -n )

Editar: Tendo pego em tentar coisas, eu não tive sucesso. Eu vi algumas pessoas obterem um processo semelhante para trabalhar com a Cisco, como neste site: link

Parece que isso funcionou em um ponto no tempo , mas não consegui trabalho desde, seja no host embutido original ou em uma estação de trabalho Linux.

Editar: Acontece que esse problema surgiu novamente.

Solução final que funcionou integralmente:

Obtenha smcroute (daemon de rota multicast estático em execução). Se você estiver em um sistema embarcado, talvez seja necessário usar smcroute -d

smcroute -a [unicast-interface] [source-ip] [multicast-addr] [multicast-interface]
iptables -t nat -A PREROUTING -p UDP -d [unicast-interface-ip] -j NETMAP --to [multicast-addr]

Por exemplo:

smcroute -a eth0 192.168.0.101 239.1.1.1 eth0
iptables -t nat -A PREROUTING -p UDP -d 192.168.0.1 -j NETMAP --to 239.1.1.1

Note que você pode precisar refinar a regra iptables para garantir que você não detecte pacotes que não pretende - este é apenas um exemplo simplificado.

    
por Arthur Shipkowski 08.04.2011 / 17:19

4 respostas

4

Você tem o ip forward ativado no kernel?

# sysctl -a 2>&1 | grep ip_forward
net.ipv4.ip_forward=1

Você precisa passar tráfego de uma interface para outra (também as regras da tabela FORWARD).

Editar:

Há outras configurações de sysctl, que eu suspeito que estejam relacionadas:

net.ipv4.conf.all.mc_forwarding

e por interface e para o ipv6.

Esse "mc" realmente soa para multicast, mas eu não tenho documentos do kernel disponíveis para ter 100% de certeza.

Tente definir como 1, se não funcionar sempre, você poderá retornar ao padrão 0.

Editar:

de rede / ip-sysctl.txt:

conf/all/mc_forwarding must also be set to TRUE to enable multicast routing

    
por 08.04.2011 / 18:21
1

Você precisa manipular a tabela de roteamento para que, após NAT-ing o pacote, ele seja enviado para fora da interface correta.

ip route add to $MULTICAST_ADDR dev $MULTICAST_IFACE

Isso pode causar problemas se você enviar multicasts através da interface de entrada, então devemos marcar os pacotes

iptables -t mangle <rules to match the packets you want to multicast> -j MARK --mark <your favorite number>
ip rule add order 10 fwmark <that favorite number> lookup table <another favorite number>
ip route add to <multicast> dev <iface> table <2nd fav number>

Finalmente, você deve perceber que o conntrack não será capaz de corresponder aos pacotes de retorno; você tem que fazer o seu próprio conntrack:

iptables -t nat -A POSTROUTING -d <multicast> -o <iface> -j SNAT <router's IP>:<a port>
iptables -t nat -A PREROUTING -i <router's IP> -p udp --dport <a port> -j DNAT <orig sender>:<orig port>

Lá, a maneira geral de fazer o que você quer. Espero que minha explicação (limitada) possa iniciar você no caminho certo.

    
por 09.04.2011 / 07:01
1

Parece que você terá que usar um daemon especial - veja em igmpproxy ou mrouted - já que o iptables irá simplesmente traduzir e encaminhar o pacote de entrada para uma combinação de endereços / portas em um dado endereço. intervalo.

    
por 09.04.2011 / 07:55
0

Este módulo do kernel cria um novo gancho netfilter na cadeia de pré-criação para roubar os pacotes unicast e envia-os como pacotes multicast baseados na regra definida por "utomu"

exemplo: A interface de sessão de unicast de entrada é "eth0" e a interface de sessão de multicast de saída é "eth1". Em seguida, defina

echo "eth0" > / proc / sys / net / utom / in_ifname

echo "eth1" > / proc / sys / net / utom / out_ifname

Suponha que o ip de origem unicast seja "192.168.56.5" e queira convertê-lo para multicast "225.1.2.3", então defina a regra como

utomu -m 225.1.2.3 -a 192.168.56.5 -s 1194 -d 1194

Isso também alterará a porta de origem e a porta de destino.

Fonte @ link

    
por 31.03.2013 / 20:53