ouça uma conversa usando o encaminhamento de porta

3

Eu consegui fazer chamadas usando o cliente SIP Pjsua de um computador Linux para outro. Caso você não tenha ouvido falar desse agente, explicar sua funcionalidade é muito fácil. Ele usa o IP e o número da porta de cada linux para criar um ID único e, em seguida, é possível chamar esse ID específico.

Agora, não estudei completamente o encaminhamento de portas, mas suponho que ele faça o encaminhamento dos dados que entram, para outra "porta" ou "IP e porta".

Então, pensei: se meu aplicativo de chamada estiver usando portas e IPs para enviar e receber voz, eu devo poder encaminhar essas portas específicas para uma segunda ou terceira porta (ou IP e porta) e ouvir a conversa em um terceiro computador.

Então, aqui está o que eu fiz.

Supondo que a máquina Linux A tenha as seguintes informações de identificação:

IP:192.168.1.11'  'UDP port# : 1111

A segunda máquina Linux B possui a seguinte identificação:

IP:192.168.1.22'  'UDP port# : 2222

Se eu fizer o seguinte usando iptables , poderei ouvir o lado da conversa que está sendo recebido no Linux B em um terceiro sistema, Linux C .

A terceira máquina, Linux C , tem as seguintes informações de identificação:

IP:192.168.1.33'  'UDP port# : 3333

Para conseguir isso, eu tentei executar este comando no Linux B :

$ iptables -t nat -A PREROUTING -p udp --dport 2222 -j DNAT
--to-destination 192.168.1.33:3333    //forward port 2222 to Linux C on port 3333

E executou este comando no Linux C :

$ aplay | nc -l -u 3333     //listen on the specified UDP port 

No entanto, não ouço nada no Linux C .

Alguém pode me dizer por que isso não está funcionando? Outras estratégias para fazer algo assim também são bem-vindas.

    
por fer y 03.01.2014 / 19:27

1 resposta

2

O encaminhamento de porta NAT redirecionará os pacotes em vez de duplicá-los. No seu exemplo, o tráfego de chamadas não deve chegar à camada de aplicativo em B:2222 , mas ser redirecionado diretamente para C:3333 .

Provavelmente você deseja analisar a TEE target de iptables e fazer a duplicação em um host intermediário ao longo da rota de rede de A.

        C
      /
A - X - B

Em X , duplique os pacotes:

iptables -t mangle -A PREROUTING -d B -p udp --dport 2222 -j TEE --gateway C

Em C , redirecione o tráfego duplicado para o ouvinte local:

iptables -t nat -A PREROUTING -d B -p udp --dport 2222 -j DNAT --to-destination C:3333

A razão para o host intermediário é que normalmente o linux não permite que você mexa com a rota do tráfego destinado a uma interface local. Eu não tentei este TEE setup especificamente, mas normalmente o tráfego para uma interface local irá cortar as regras de roteamento, então nunca vai sair em --gateway C . Eu estou supondo que você iria acertar o mesmo problema com o TEE tentando encaminhar o tráfego para B out, mas ymmv.

O próximo problema pode ser o próprio aplicativo. Tem certeza de que o protocolo suporta simplesmente tocar e reproduzir o fluxo de rede duplicado? Se o fluxo RTP puder ser captado por aplay on C , então parece que você também tem o seu caminho errado. Você deseja que nc canalize para aplay .

nc -l -u 3333 | aplay
    
por 03.01.2014 / 21:36