Apenas adicionar regras de firewall não será suficiente para este. Você quer que o sistema roteie o tráfego como se fossem dois sistemas independentes que compartilham o mesmo hardware e processos: é isso que o modelo Strong ES é efetivamente.
Ao apontar para o Strong ES Model no Linux, primeiro você precisará destas configurações de sysctl:
net.ipv4.conf.all.arp_filter=1
net.ipv4.conf.all.arp_ignore=1 # or even 2
net.ipv4.conf.all.arp_announce=2
Essas configurações farão o ARP se comportar apropriadamente com o Modelo Strong ES, ou seja, quando uma solicitação ARP for recebida, somente a interface com o endereço solicitado responderá e somente se o tráfego para o endereço de origem for enviado através dessa interface específica.
Depois, como você tem cinco interfaces que deseja comportar de maneira diferente em termos de roteamento, é necessário configurar cinco tabelas de roteamento personalizadas. Você poderia usar números para identificá-los, mas geralmente é mais claro especificar nomes para eles. Portanto, escolha números para cada um deles entre 1 e 252 e alguns nomes adequados. (Números 0, 253, 254 e 255 são reservados.)
Por exemplo, vamos escolher 100 = rtable0, 101 = rtable1, 102 = rtable2, 103 = rtable3 e 104 = rtable4. Adicione esses números e nomes ao final de /etc/iproute2/rt_tables
file:
# ...default stuff above...
100 rtable0
101 rtable1
102 rtable2
103 rtable3
104 rtable4
Em seguida, preencha cada tabela de roteamento personalizada com um conjunto mínimo de entradas de rota apropriadas para cada interface. (Estou substituindo valores reais por nomes de variáveis de ambiente nomeados descritivamente).
ip route add $ETH0_NET dev eth0 proto static src $ETH0_IP table rtable0
ip route add default via $ETH0_GW dev eth0 proto static src $ETH0_IP table rtable0
ip route add $ETH1_NET dev eth1 proto static src $ETH1_IP table rtable1
ip route add default via $ETH1_GW dev eth1 proto static src $ETH1_IP table rtable1
# ... and so on, for all 5 interfaces
Por fim, adicione regras de roteamento avançadas que verificarão o endereço de origem de cada pacote e escolherão a tabela de roteamento a ser usada de acordo:
ip rule add from $ETH0_IP table rtable0
ip rule add from $ETH1_IP table rtable1
#...
Para tornar toda essa configuração persistente durante as reinicializações, talvez seja necessário escrever scripts de inicialização personalizados (ou possivelmente ifup-pre
ou ifup-post
scripts) para atender às convenções da distribuição do Linux.
Para um seguro extra, você pode adicionar regras iptables por interface para descartar silenciosamente qualquer pacote de entrada que possa ser recebido na interface errada. Se tudo estiver bem, a contagem de pacotes para estes deve permanecer zerada: se eles começarem a aumentar, você pode ter perdido alguma coisa na configuração.
iptables -A INPUT -m addrtype --dst-type UNICAST -i eth0 ! -d $ETH0_IP -j DROP
iptables -A INPUT -m addrtype --dst-type UNICAST -i eth1 ! -d $ETH1_IP -j DROP
# ... and so on for each interface
Nota: uma vez eu implementei uma configuração como essa baseada em uma antiga discussão na internet feita por Rick Jones e outros gurus da rede. Eles disseram, parafraseando, "enquanto tudo isso é claramente necessário para alcançar o comportamento do Strong Host Model no Linux, eu não posso garantir que ele seja suficiente para todos os possíveis casos de uso". Funcionou sem falhas para mim; pode ou não ser o suficiente para você, dependendo de exatamente para o que você vai usá-lo.
Aviso: assegure-se de que você tenha algum tipo de acesso local ou remoto ao console ao configurar essa configuração. É muito provável que essa configuração atrapalhe completamente o acesso à rede enquanto ela está apenas pela metade.
Embora seja possível configurar N interfaces apenas com tabelas de roteamento personalizadas (N-1), minha preferência pessoal é mover toda a configuração de roteamento para tabelas personalizadas ao usar o roteamento avançado. Ter route -n
ou ip route show
praticamente vazio enquanto o sistema está claramente tendo conexões de rede será uma grande pista de que algo muito especial está acontecendo. No entanto, quando eu configurei um sistema como esse, também configurei um aviso permanente em /etc/motd
sobre o roteamento avançado em vigor e os locais dos scripts reais que o configuravam.