Você tem três interfaces no computador B, que têm endereços da mesma sub-rede (192.168.1.0/24, estou certo?).
Veja algumas das regras do iptables:
-
sudo iptables -A FORWARD -i $IF -o $IF --source $ADDR -j ACCEPT
- esta regra diz que você permite rotear deeth2
paraeth2
quando o pacote vem de192.168.1.3
(sem as informações sobre a máscara de rede). Esta regra é completamente insignificante. -
sudo iptables -A FORWARD -i $IF -o $IF --destination $ADDR -m state --state ESTABLISHED,RELATED -j ACCEPT
- quase o mesmo que acima. -
Você está definindo a regra padrão para a cadeia
iptables -F INPUT ACCEPT
e, em seguida, removeiptables -F INPUT
.
Então, o que eu recomendo:
-
No computador B, as três interfaces devem ter endereços de redes diferentes. Se você precisar deles na mesma rede, é melhor conectá-los (criar uma "multi-interface" que agrega três todos eles com um endereço IP).
-
Leia mais sobre o iptables e tente entendê-lo. É bem simples. Por exemplo, quando você tem rede 192.168.1.0/24 que conecta os computadores A e B, a maneira mais fácil é fazer NAT assim (computador B):
iptables -t nat -A POSTROUTING -d 0/0 -s 192.168.1.0/24 -j MASQUERADE iptables -A FORWARD -s 192.168.1.0/24 -d 0/0 -j ACCEPT iptables -A FORWARD -s 0/0 -d 192.168.1.0/24 -j ACCEPT
- Ou a maneira mais fácil - conectar todas as interfaces no computador B. Então você não precisa usar o NAT.
Atualização após pergunta estendida
A arquitetura de rede que você tem não é realmente feita para funcionar como você deseja. O computador A deve estar conectado ao computador C através de uma rede separada da rede que conecta o computador C ao gateway (internet). Mas você tem duas soluções.
"A maneira elegante"
É necessário que o switch seja transparente para quadros ethernet com tags vlan (porque, suponho, você não tem um switch gerenciado com a possibilidade de marcar portas). Se o seu switch suporta 802.1q, deve funcionar assim.
-
Você precisa criar interfaces vlan nos computadores A e C. Por exemplo,
sudo vconfig add eth0 100
. Este comando irá criar a interface marcada eth0.100. No computador C, execute um comandosudo vconfig add en1 100
. Você terá interface en1.100. Nas configurações da máquina virtual, você precisa conectar a interface virtual ethX com en1.100. Não atribua nenhum endereço IP a en1.100 (computador C) - não é necessário. -
Defina endereços da mesma rede em eth0.100 (computador A) e ethX (máquina virtual B). Vamos dizer que será 192.168.2.1/24 (computador A) e 192.168.2.2/24 (máquina virtual B).
-
A máquina virtual B deve ter mais uma interface que será conectada a en1 no computador C (a interface não marcada). Digamos que tenha o endereço 192.168.1.3/24.
-
Agora você precisa configurar o NAT na máquina virtual C:
iptables -t nat -A POSTROUTING -d 0/0 -s 192.168.2.0/24 -j MASQUERADE iptables -A FORWARD -s 192.168.2.0/24 -d 0/0 -j ACCEPT iptables -A FORWARD -s 0/0 -d 192.168.2.0/24 -j ACCEPT
- Adicione o gateway padrão no computador A:
route add default gw 192.168.2.2
Deve funcionar.
O caminho sujo Você pode tentar o caminho sujo. Não requer vlans mas faz uma pequena bagunça na terceira camada.
-
O computador A possui a interface eth0 com o endereço 192.168.2.1/24.
-
A máquina virtual B possui duas interfaces, ethX e ethY. Ambos ligados a en1 (no computador C) nas configurações da máquina virtual.
-
Interface ethX tem endereço 192.168.2.2/24. A interface ethY tem endereço 192.168.1.3/24.
-
Aplique os mesmos comandos que estão nos pontos 4 e 5 de maneira elegante.
Também deve funcionar.
O problema da sua solução é que você estava tentando rotear o tráfego da mesma rede para a mesma rede. Você só pode rotear o tráfego entre duas redes IP lógicas (não do mesmo intervalo de endereçamento). Se você precisar de roteamento, precisará ter duas redes diferentes - neste caso, 192.168.1.0/24 (a rede existente) e 192.168.2.0/24 (a rede que conecta o computador A e a máquina virtual B).