Conectando duas interfaces enquanto desvia parte do tráfego

Conectando duas interfaces enquanto desvia parte do tráfego

Objetivo

Estou procurando fazer algo assim:

insira a descrição da imagem aqui

Onde o “mini roteador” ajuda a controlar e proteger um sistema legado que não pode ser atualizado por motivos complexos e reside em algum lugar “em estado selvagem”. Esperamos modernizar os sistemas com um sistema barato e de baixa potência (por exemplo, 0,5 V e < 100 mA). Existem vários milhares desses sistemas SCADA espalhados por toda parte. Precisamos fazer um retrofit de chapéu branco, mas em cerca de 15%-30% dos ambientes não conseguimos um endereço IP (sem DHCP) para o "mini roteador" e precisamos compartilhar o IP do computador/sistema SCADA. Achei que poderíamos configurar uma ponte transparente (o br0 abaixo funciona como uma ponte):

root% ip link add name br0 type bridge
root% ip link set dev br0 up
root% ip link set dev eth0 master br0
root% ip link set dev eth1 master br0
root% ip address add 10.253.252.2 dev br0
root% sysctl -w net.ipv4.conf.all.forwarding=1

E então usar ebtables / iptables / iproute2 para rotear o tráfego do Servidor1 destinado ao Computador para que possamos criptografar / descriptografar SSL o tráfego entre eles e/ou "consumir" o tráfego entre o Servidor2 e o Computador, já que se destina a configurar e controlar o "mini roteador ".

Como gostaria que fosse uma ponte totalmente transparente, removi os endereços de eth0 e eth1:

root% ip address flush dev eth0
root% ip address flush dev eth1
root% ip address add 0.0.0.0 dev eth0
root% ip address add 0.0.0.0 dev eth1
root% ip link set dev eth0 up
root% ip link set dev eth1 up
root% ip link set dev eth0 promisc on
root% ip link set dev eth1 promisc on
root% ip link set dev br0 promisc on # Not sure if needed

Infelizmente, não consigo desviar o tráfego de/para o serviço que tratará as mensagens de controle.

NOTA: Na verdade, posso atribuir um endereço não roteável a br0 (por exemplo, 169.254.1.2) e se o Servidor1 estiver no segmento LAN local (por exemplo, no mesmo switch), o método descrito abaixo (Tentativas Versão 1) funciona; entretanto, os pacotes TCP/IP têm um src ou dst de 169.254.1.2, que não são roteáveis ​​e não podem cruzar roteadores ou limites de LAN, mas o Servidor1 e o "mini roteador" não parecem se importar. Conforme acima, não consigo simplesmente obter um DHCP em br0 (que também funciona), porque potencialmente mais de mil "mini roteadores" não conseguirão obter um endereço DHCP.

Pergunta:

Como posso fazer isso? Abaixo estão as coisas que eu tentei.

Tentativas:

Procurei várias soluções com pouca sorte. Por exemplo,"iptables - Destino para rotear pacotes para interface específica?", sugere que marcar pacotes e usar uma tabela de roteamento diferente pode funcionar; no entanto, os exemplos não passam de uma ponte. Passei um bom tempo selecionandoDocumentação do Netfiltere intuitivamente parece que eu deveria ser capaz de colocarFiltro de rede NATentre br0 e eth1, mas, novamente, não vejo como.IPsec LAN para LANou uma solução VPN direta requer conexões persistentes entre pontos finais que não teremos. O computador só precisa telefonar periodicamente para casa ou receber informações push, mas não precisa de uma conexão segura persistente. Como o sistema Computador/SCADA também precisa se comunicar com outros sistemas, o mini roteador não deve interferir em nenhum tráfego existente entre o Computador e a LAN/Roteador.

Tentativas Versão 1

Primeiro eu limpei as regras:

root% ip rule flush
root% ip rule add lookup default priority 32767
root% ip rule add lookup main priority 32766

Fazendo com que os quadros Ethernet entre o Servidor1 e o Computador sejam "DROP" para a camada de rede.

root% ebtables -t broute -A BROUTING -p IPv4 \
      --ip-source 5.6.7.1 --ip-destination 10.0.0.1 \
  -j redirect --redirect-target DROP
root% ebtables -t broute -A BROUTING -p IPv4 \
      --ip-source 10.0.0.1 --ip-destination 5.6.7.1 \
  -j redirect --redirect-target DROP

Redirecionando o tráfego Server1<-->Computador para o endereço br0

root% iptables -t nat -A PREROUTING -p tcp \
      -s 5.6.7.1 -d 10.0.0.1 \
  -j DNAT --to-destination 10.253.252.2
root% iptables -t nat -A POSTROUTING -p tcp \
      -d 10.253.252.2 \
  -j SNAT --to-source 10.0.0.1
root% iptables -t nat -A POSTROUTING -j MASQUERADE

Adicionando uma rota ao Server1 por meio de br0

root% ip route add 5.6.7.2 via 10.253.252.2 dev br0

E cruze os dedos, mas não funciona. Tentei muitas permutações diferentes disso.

Tentativas Versão 2

Mais recentemente, tentei uma versão mais próxima da mencionada acima com -j MARK para roteamento de pacotes sem sucesso:

root% ip rule add fwmark 2 priority 1000 table 3
root% ip route add default via 10.0.0.1 table 3
root% ip route flush cache
root% ip route flush table 3
root% iptables -t mangle -A OUTPUT -p tcp -s 5.6.7.1 -j MARK --set-mark 2
root% iptables -t nat -A POSTROUTING -o br0 -j MASQUERADE
root% ip route add 0.0.0.0/1 via 10.253.252.2 dev br0 table 3

informação relacionada