Eu tenho um caso complicado:
+---+ +----+
|D1 +->eth0---------<-eth0-+D2 |
| | | |
| +->eth1---------<-eth1-+ |
+---+ +----+
Em D2 eth0
e eth1
possuem endereços IP da mesma sub-rede: eth0
10.1.1.1/24
, eth1
10.1.1.2/24
. As interfaces em D1 não possuem endereços atribuídos e funcionam como um switch.
Agora, quero que D2 possa enviar o tráfego para 10.1.1.2
via eth0
, então o caminho do pacote deve ser: D2(eth0)--D1(eth0)--D1(eth1)--D2(eth1).
No momento em que faço ping 10.1.1.2
do D2 ele envia pacotes localmente, ou seja, D1 não recebe nenhum. O que devo mudar em D2 para alcançar o comportamento desejado?
Obrigado.
Responder1
O que você deseja não é possível com o Linux. Pelo menos não dentro da camada de roteamento. Se um endereço de destino pertencer a uma interface local, então o pacote sempre passa pela interface de loopback de onde não pode (por RfC) ser roteado para o exterior.
Achei que seria possível usar iptables
e DNAT
alterar o destino para um endereço não utilizado na sub-rede e usar ip neigh
para definir o endereço MAC estaticamente para o da outra NIC, mas nem mesmo a DNAT
regra é correspondida para pacotes para endereços locais.
Pode ser possível com uma máquina virtual ou com namespaces de rede para que o kernel não veja 10.1.1.1
o eth0
. Mas você precisaria de proxy ARP e DNAT para mover os pacotes recebidos da interface física para a interface virtual.
Se vale a pena esse esforço?
Responder2
Namespaces de rede podem ser uma opção. Eles são essencialmente instâncias independentes da pilha de rede, portanto deveriam, pelo menos em teoria, ser capazes de separar duas interfaces.
Da última vez, tentei brincar com eles, mas não consegui fazer nada funcionar corretamente.