Encaminhar todo o tráfego quando conectado a um hub

1

Eu tenho um Ubuntu com dois NICs. O eth0 está conectado a um hub e o eth1 está conectado à Internet. O eth1 é usado para fazer uma VPN ponto a ponto usando o openVPN. Então eu tenho uma interface tun0. os pontos de extremidade do túnel da VPN são 10.9.0.1 (bind1 na eth1) e 10.9.0.2 (peer remoto). Quero encaminhar / espelhar todo o tráfego recebido na eth0 (lado do hub) para o ponto de acesso da VPN 10.9.0.2. Para fazer isso, criei as seguintes regras do iptables.

sudo iptables -t mangle -A PREROUTING -i eth0 -j TEE --gateway 10.9.0.2

E, claro, eu defino eth0 no modo promíscuo.

sudo ifconfig eth0 promisc

E eu até ativei o encaminhamento de ip

sudo sh -c 'echo 1 > /proc/sys/net/ipv4/ip_forward'

Quando eu farejo o eth0 (lado do hub), vejo todo o tráfego, mas quando eu detecto o 10.9.0.2 (ponto de acesso VPN remoto), vejo apenas o tráfego multicast recebido no eth0. Minha pergunta é: Por que o tráfego unicast não-multicast ou dedicado não é espelhado / encaminhado?

Nota: Se eu farejar o tun0 no meu servidor Ubuntu, vejo apenas o tráfego multicast e o tráfego unicast dedicado. Então eu concluo que o problema não está localizado nas regras do iptables, mas antes ...

Obrigado e cumprimentos.

    
por Cyrill Gremaud 10.02.2016 / 15:41

3 respostas

1

Eu finalmente encontrei a solução. A ideia dada por @MrMajestyk me ajudou. Aqui está a minha solução.

Primeiro, é necessário usar ebtables para modificar o endereço MAC de destino do pacote recebido para que o código da pilha IP receba o pacote. Se eu não fizer isso na camada Ethernet, a camada de rede nunca receberá os quadros, exceto o multicast, broadcast e unicast dedicado. E se a camada de rede nunca receber todos os pacotes, não será possível manipulá-los com iptables . Mas para essa regra de ebtables funcionar, é necessário criar uma interface de ponte com a interface de entrada (lado do hub) nela.

sudo ifconfig eth0 10.9.0.5
sudo brctl addbr br0 
sudo brctl addif br0 eth0 
sudo ifconfig br0 up

Em seguida, podemos criar as regras ebtables .

sudo ebtables -t broute -A BROUTING -i eth0 -j redirect --redirect-target DROP

Depois, posso usar o iptables para espelhar meu tráfego recebido em direção ao meu ponto remoto da VPN (10.9.0.2).

sudo iptables -t raw -A PREROUTING -i eth0 -j TEE --gateway 10.9.0.2

Por favor, note que eu uso a interface de túnel (tun) em vez da ponte ethernet (tap). Depois disso, sou capaz de farejar o ponto remoto 10.9.0.2 e posso ver todo o tráfego (exceto ARP, por exemplo).

Eu posso até filtrar meu tráfego, mas é necessário fazê-lo dentro da tabela bruta, antes de seguir antes as regras -j TEE --gateway. Procure por exemplo minhas entradas brutas e pré-formatadas do iptables.

-A PREROUTING -p vrrp -j DROP
-A PREROUTING -p ospf -j DROP
-A PREROUTING -d 255.255.255.255/32 -j DROP
-A PREROUTING -p udp --sport 53 -j DROP
-A PREROUTING -p tcp --sport 53 -j DROP
-A PREROUTING -i eth0 -j TEE --gateway 10.9.0.2

Obrigado pela sua ajuda

    
por 17.02.2016 / 07:45
0

Acho que seu problema é que o encaminhamento do tipo que você está fazendo não funciona se o MAC de destino não estiver na máquina que você está usando como roteador. As transmissões funcionam por design. O que você está procurando provavelmente é mais ao longo das linhas de espelhamento de uma porta de switch. Existe uma discussão sobre como fazer isso aqui . Para o bem da posteridade, vou repassar a essência aqui:

                           SWITCH
                     +---------------+
                     |               |
SOURCE <------------>|<-----+------->|<------------> RCV
                     |      |        |
                     +---------------+
                            | Mirrored port ("tap")
                            | (output only)
                            |
                            |      +------------+
                            +<---->|   ROUTER   |<-------------> MONITOR
                             eth0  +------------+

Here's how to rewrite the incoming MAC addresses to match eth0. eth0 has to be bound to a bridge device even if the bridge has no other devices. This allows ebtables to hook into it.

ifconfig eth0 X.X.X.X
brctl addbr br0
brctl addif br0 eth0
ip link set br0 up (or ifconfig br0 up)
ebtables -t broute -A BROUTING -i eth0 -j redirect --redirect-target DROP
ip route add y.y.y.y dev eth0 (have to do for all expected incoming addresses/subnets)

Mais uma vez, o texto acima está apenas citando a postagem original para garantir que ela também possa ser removida posteriormente.

    
por 15.02.2016 / 08:58
-1

Eu não acho que você precisa definir iptables, basta definir o endereço IP da eth1 como o gateway para eth0 e definir o DNS no arquivo 'base', isso funcionaria.

    
por 16.02.2016 / 19:38