Rota todo o tráfego de uma máquina através de outro dentro de uma sub-rede?

1

Eu tenho dois computadores, ambos executando o Ubuntu 12.04 64 bit. Eu preciso rotear o tráfego de um computador através do outro.

computer A: 192.168.1.3 (eth0)

computer B: 192.168.1.7 (eth0), 192.168.1.5 (eth1), 192.168.1.6 (eth2)

Eu preciso dessas três interfaces no computador B para executar meus experimentos finais ...

O computador BTW B está sendo executado em uma máquina virtual em um host separado.

Eu mudo o padrão gw do computador A assim:

sudo sudo ip route del
sudo ip route add default via 192.168.1.6

aqui está a saída de route -n no computador A:

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.1.6     0.0.0.0         UG    0      0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 eth0
192.168.1.0     0.0.0.0         255.255.255.0   U     1      0        0 eth0

Também executo este script no computador B:

#!/bin/bash

IF="eth2"
ADDR="192.168.1.3"

sudo bash -c 'echo 1 > /proc/sys/net/ipv4/ip_forward'
sudo bash -c 'echo 1 > /proc/sys/net/ipv4/ip_dynaddr'

sudo iptables -P FORWARD DROP
sudo iptables -F FORWARD
sudo iptables -t nat -F
sudo iptables -A FORWARD -i $IF -o $IF --source $ADDR -j ACCEPT
sudo iptables -A FORWARD -i $IF -o $IF --destination $ADDR -m state --state ESTABLISHED,RELATED -j ACCEPT
sudo iptables -t nat -A POSTROUTING -s $ADDR -j MASQUERADE

Após essas instruções, o computador A não tem acesso à internet !!

Você tem alguma ideia sobre o problema e a solução?

Editar 1

a topologia padrão da sub-rede é assim:

                                             |--------------|  
                                             |    Comp C    |
    |----------| eth0   |----------|      en0| |----------| |
    |  CompA   |--------|   switch |---------| |   VM  B  | |
    |----------|        |-----|----|         | |----------| |
                              |              |--------------| 
                              |
                         ( Internet )
                          (        )

atualizar

computador A:

$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.2.2     0.0.0.0         UG    0      0        0 eth0.100
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 eth0
192.168.1.0     0.0.0.0         255.255.255.0   U     1      0        0 eth0
192.168.2.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0.100

máquina virtual B:

eth0 está conectado via nat.

$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.16.233.2    0.0.0.0         UG    0      0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 eth0
172.16.233.0    0.0.0.0         255.255.255.0   U     1      0        0 eth0
192.168.1.0     0.0.0.0         255.255.255.0   U     1      0        0 eth1
192.168.2.0     0.0.0.0         255.255.255.0   U     1      0        0 eth2
    
por N. S. 23.04.2017 / 09:58

2 respostas

1

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:

  1. sudo iptables -A FORWARD -i $IF -o $IF --source $ADDR -j ACCEPT - esta regra diz que você permite rotear de eth2 para eth2 quando o pacote vem de 192.168.1.3 (sem as informações sobre a máscara de rede). Esta regra é completamente insignificante.

  2. sudo iptables -A FORWARD -i $IF -o $IF --destination $ADDR -m state --state ESTABLISHED,RELATED -j ACCEPT - quase o mesmo que acima.

  3. Você está definindo a regra padrão para a cadeia iptables -F INPUT ACCEPT e, em seguida, remove iptables -F INPUT .

Então, o que eu recomendo:

  1. 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).

  2. 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
  1. 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.

  1. 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 comando sudo 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.

  2. 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).

  3. 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.

  4. 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
  1. 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.

  1. O computador A possui a interface eth0 com o endereço 192.168.2.1/24.

  2. 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.

  3. Interface ethX tem endereço 192.168.2.2/24. A interface ethY tem endereço 192.168.1.3/24.

  4. 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).

    
por Krzysztof Sawicki 23.04.2017 / 11:02
0

O problema é resolvido quando a máquina B é colocada em uma única máquina real em vez de uma máquina virtual. Depois disso, eth0.1 com o endereço IP 192.168.2.2 é criado na máquina A e eth0.1 com o endereço IP 192.168.2.1 é criado na máquina B.

Defina o gateway padrão na máquina A:

sudo route del default gw 192.168.1.1
sudo route add default gw 192.168.2.1

e execute esta instrução na máquina B:

sudo bash -c 'echo 1 > /proc/sys/net/ipv4/ip_forward'
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

agora o tráfego da máquina A é roteado corretamente da máquina B. Muito obrigado por seus guias @Krzysztof Sawicki:)

    
por N. S. 22.05.2017 / 18:16