Problema de roteamento interno UDP ao usar várias NICs

0

Eu tenho um servidor que tem duas portas ethernet, cada uma rodando em um NIC separado (eth0 e eth1). Eu gostaria de conectar a eth0 a uma máquina separada que transmite vídeo sobre UDP (e nenhum outro tráfego) enquanto a outra interface (eth1) está conectada ao gateway / roteador da rede.

Eu não me importo se a porta de tráfego do udp não se conecta à rede mais ampla.

Obrigado!

EDIT: Desde que esta questão foi colocada em espera, gostaria de esclarecer ainda mais o meu sistema de acordo com os comentários abaixo. Meu sistema consiste em uma máquina rodando linux, com duas placas de rede ethernet. Estou recebendo um fluxo UDP em uma dessas portas, de uma conexão LAN-LAN direta para uma câmera de segurança, e apesar de ter sido capaz de ler os pacotes vindos da câmera usando tcpdump , ainda estou vendo qualquer coisa vindo através do via gstreamer que eu planejo usar para exibir o vídeo.

As duas portas têm um endereço IP estático, configurado da seguinte forma:

eth0      Link encap:Ethernet  HWaddr 5C:F8:21:34:80:F6
      inet addr:192.168.1.233  Bcast:192.168.1.255  Mask:255.255.255.0
      inet6 addr: fe80::5ef8:21ff:fe34:80f6%132688/64 Scope:Link
      UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
      RX packets:1237 errors:0 dropped:0 overruns:0 frame:0
      TX packets:90 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:1000
      RX bytes:113089 (110.4 KiB)  TX bytes:14016 (13.6 KiB)
      Interrupt:99

eth1      Link encap:Ethernet  HWaddr 5C:F8:21:34:80:F7
      inet addr:192.168.1.234 Bcast:192.168.1.255 Mask:255.255.255.0
      UP BROADCAST MULTICAST  MTU:1500  Metric:1
      RX packets:0 errors:0 dropped:0 overruns:0 frame:0
      TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:1000
      RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

lo        Link encap:Local Loopback
      inet addr:127.0.0.1  Mask:255.0.0.0
      inet6 addr: ::1%132688/128 Scope:Host
      UP LOOPBACK RUNNING  MTU:65536  Metric:1
      RX packets:330 errors:0 dropped:0 overruns:0 frame:0
      TX packets:330 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:1
      RX bytes:277171 (270.6 KiB)  TX bytes:277171 (270.6 KiB)

E a tabela de roteamento interna:

Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
0.0.0.0         192.168.1.1     0.0.0.0         UG        0 0          0 eth1
192.168.1.0     0.0.0.0         255.255.255.0   U         0 0          0 eth1
192.168.1.1     0.0.0.0         255.255.255.255 UH        0 0          0 eth1

A câmera está no endereço 192.168.1.239 e transmite para o meu servidor diretamente pelo UDP. (o MAC de destino é codificado nos pacotes) Ele está transmitindo um fluxo MJPEG, e quando eu pego os pacotes salvos por tcpdump eu posso reconstruí-lo no MJPEG.

no entanto, quando eu uso gstreamer usando o seguinte comando:

gst-launch-1.0 udpsrc multicast-iface=eth0, port=1234 ! filesink location=foo

foo não salva nenhum dado. Eu usei essa máquina para salvar fluxos do udp usando gstreamer no passado, mas não quando as duas portas estavam em uso. Ou seja, o vídeo vinha de outra máquina, através do roteador, para esse servidor em questão.

Então, por que esses pacotes, que o servidor claramente vê e entende (não está soltando pelo menos), não chegam ao meu programa gstreamer?

    
por T. Wallis 01.03.2017 / 16:46

1 resposta

0

Normalmente você atribui sua conexão cruzada à sua própria sub-rede / 30, a partir de outro bit de espaço RFC1918 (privado). Então você faria algo assim:

  • 192.168.1.234/24 é sua LAN na eth1
  • 192.168.255.1/30 é esta máquina, na eth0 (a conexão cruzada)
  • 192.168.255.2/30 é a fonte de vídeo, no final da conexão cruzada

Se você, então, 192.168.255.1 e 192.168.255.2 como os endereços IP para sua conexão UDP, ele fluirá sobre eth0.

É possível fazer isso usando a mesma sub-rede que a LAN (usando rotas / 32, roteamento de política ou truques de ponte), mas todos eles são mais complicados e mais propensos a ter problemas com programas aleatórios confusos.

(Explicação rápida da notação / x: É uma maneira curta de especificar a máscara de rede, contando o número de 1s [binário!] da esquerda / bit mais significativo. Então / 30 significa uma máscara de rede de 255.255.255.252.)

    
por 02.03.2017 / 16:48