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.