Objetivo
Estou procurando fazer algo assim:
Ondeo"mini-roteador" está ajudando 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 reajustar os sistemas com energia barata e de baixa potência (por exemplo, 0,5V e < 100 mA). Existem vários milhares desses sistemas SCADA espalhados por toda parte. Precisamos fazer um retrofit de chapéu branco, mas cerca de 15% -30% dos ambientes não podemos obter um endereço IP (sem DHCP) para o "mini roteador" e precisamos compartilhar o IP do sistema Computer / SCADA. Eu pensei 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, em seguida, use ebtables / iptables / iproute2 para rotear o tráfego do Server1 destinado a Computer para que possamos SSL criptografar / descriptografar o tráfego entre eles e / ou "consumir" o tráfego entre Server2 e Computer, pois ele é destinado a configurar e controlar o tráfego "mini roteador".
Como gostaria que fosse uma ponte completamente 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 lida com mensagens de controle.
NOTA: Eu posso de fato atribuir um endereço não roteável a br0 (por exemplo, 169.254.1.2) e se o Servidor1 estiver no segmento de LAN local (por exemplo, no mesmo comutador) o método descrito abaixo ( Tentativas Versão 1 ) funciona; no entanto, 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 Server1 e o "mini-roteador" não parecem se importar. De acordo com o acima, eu não posso simplesmente obter um DHCP em br0 (que também funciona), porque potencialmente um milhar de mais dos "mini-roteadores" não será capaz de 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 - Target para rotear pacotes para uma interface específica?" , sugere que marcar pacotes e usar uma tabela de roteamento diferente pode funcionar; no entanto, os exemplos não são sobre uma ponte. Eu gastei um pouco de tempo vasculhando a documentação do Netfilter e intuitivamente Parece que eu deveria ser capaz de colocar Netfilter NAT entre br0 e eth1, mas novamente, Não vejo como. O IPsec de LAN para LAN ou uma solução de VPN direta requer conexões persistentes entre os pontos finais que não teremos. O computador precisa periodicamente telefonar para casa ou receber informações de envio, mas não precisa de uma conexão segura persistente. Como o sistema Computer / 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 rede local / roteador.
Tentativas da versão 1
Primeiro limpei a lista de regras:
root% ip rule flush
root% ip rule add lookup default priority 32767
root% ip rule add lookup main priority 32766
Obtendo quadros Ethernet entre Server1 e Computador para "DROP" na 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 servidor1 < - > Tráfego de computadores 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 servidor1 por meio de br0
root% ip route add 5.6.7.2 via 10.253.252.2 dev br0
E mantenha os dedos cruzados, mas não funciona. Tentei muitas permutações diferentes disso.
Tentativas da 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