Como posso usar o Linux como um gateway?

16

NOTA: Se os dispositivos clientes ( computer Bneste exemplo) quiserem obter Internet através do computador gateway, talvez ainda precisem configurar a resolução do servidor de nomes. Isso não é explicado aqui (um gateway não serve necessariamente à Internet).

Estou tentando entender os fundamentos do roteamento de redes.
Então, estou experimentando minha LAN (não preciso de internet no momento, apenas comunicações de LAN).

Eu sei que a configuração da rede é uma coisa bastante complexa, mas estou apenas tentando fazer com que um computador (digamos A) atue como um gateway para outro (digamos B) (ambos executando o Ubuntu Linux).
Eu só preciso que B seja capaz de acessar o roteador, que é acessível apenas para A.

Este é o caso:

Router for computer A  -->  192.168.0.1
Computer A - eth0      -->  192.168.0.2
Computer A - eth1      -->  192.168.1.1

Computer B - eth0      -->  192.168.1.2

O computador A se conecta bem ao roteador .
Os computadores A e B se conectam bem (ping, SSH ... etc) entre eles .
O computador B não consegue acessar o roteador do computador A.

Eu estava pensando que apenas adicionar B no computador A como gateway padrão e ativar o encaminhamento de IP em A tornaria B capaz de acessar o roteador para A:

luis@ComputerB:~$ sudo route add default gw 192.168.1.1
luis@ComputerB:~$ sudo routel

target            gateway      source        proto    scope  dev   tbl
127.0.0.0         broadcast    127.0.0.1     kernel   link   lo    local
127.0.0.0 8       local        127.0.0.1     kernel   host   lo    local
127.0.0.1         local        127.0.0.1     kernel   host   lo    local
127.255.255.255   broadcast    127.0.0.1     kernel   link   lo    local
192.168.1.0       broadcast    192.168.1.2   kernel   link   eth0  local
192.168.1.2       local        192.168.1.2   kernel   host   eth0  local
192.168.1.255     broadcast    192.168.1.2   kernel   link   eth0  local
default           192.168.1.1                                eth0
169.254.0.0 16                                        link   eth0
192.168.1.0 24                 192.168.1.2   kernel   link   eth0

E no Computador A (o gateway intermediário):

root@ComputerA:~$ echo 1 > /proc/sys/net/ipv4/ip_forward

O computador B ainda pode executar ping no computador A, mas o roteador para A não responde:

luis@ComputerB:~$ ping 192.168.0.1
PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
^C

(Sem resposta de ping)

Esse é o procedimento correto para fazer um computador executando Linux funcionar como um gateway para outro computador de uma maneira simples?

Sopalajo de Arrierez
fonte

Respostas:

21

Você está quase lá, só precisa garantir que o tráfego volte para B. No momento, você encaminhou o tráfego de B para o mundo exterior, mas A não sabe como recuperar o tráfego para B. Você precisa de A para manter algum estado sobre as conexões passando por isso. Para fazer isso, você desejará habilitar o NAT . Você já tem o primeiro passo, que é o encaminhamento. Então você precisa adicionar algumas regras de firewall usando iptables:

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Isto diz: na tabela de conversão de endereços de rede, depois de descobrirmos o roteamento de um pacote na saída eth0 (a externa), substitua as informações do endereço de retorno pelas nossas para que os pacotes de retorno cheguem até nós. Além disso, lembre-se de que fizemos isso (como uma tabela de pesquisa que lembra essa conexão).

iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT

Permita que pacotes que desejam vir de eth1 (a interface interna) saiam eth0 (a interface externa).

iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT

Use a tabela de consulta que tínhamos antes para ver se o pacote que chega na interface externa realmente pertence a uma conexão que já foi iniciada a partir do interno.

user1794469
fonte
Uma explicação concisa, de fato. Todos os blocos de código devem ser executados no Computador A?
Sopalajo de Arrierez 9/08/2015
@SopalajodeArrierez Sim, todos eles são executados no computador "gateway". O sistema B não precisa saber nada sobre o roteamento, a não ser se deseja alcançar qualquer outra máquina, envia os pacotes para B (é o GW padrão).
user1794469
Testado trabalhando no Ubuntu v14 na área de trabalho e Ubuntu v12 no Utilite Pro (um dispositivo incorporado da CompuLabs). Muito obrigado por expandir o que cada linha faz exatamente. Eu pesquisei e encontrei muitas explicações muito longas que não estavam funcionando. Espero que este tópico de perguntas e respostas possa ser útil para outras pessoas no futuro.
Sopalajo de Arrierez 9/08/2015
@ user1794469 é o mesmo quando a interface do gateway é virtual, ou seja, uma interface de toque? você pode dar uma olhada aqui ?
Ram #
1

Para que o roteamento funcione corretamente entre dois computadores Linux que atuam como gateways, há várias coisas que precisam estar em vigor:

  • Ambos os gateways precisam ter um link físico entre si (ou virtual, se você estiver vinculando máquinas virtuais).
  • As rotas devem ser adicionadas às duas interfaces no roteador.

    route add -net 192.168.0.0/24 gw 192.168.0.1
    route add -net 192.168.1.0/24 gw 192.168.1.1
    
  • Um gateway local deve ser especificado para a rede remota nos dois gateways. Isso permite que os computadores na rede local saibam para onde enviar pacotes para a rede remota. O gateway deve ser o endereço IP do computador que enviará pacotes para a rede remota.

  • Os computadores que desejam enviar tráfego entre as redes também devem estar cientes de qual gateway local está manipulando o tráfego de e para a rede remota. Isso geralmente é feito via DHCP (Dynamic Host Control Protocol); no entanto, se você pretende usar um gateway separado para a Internet, precisará especificar os computadores que precisam acessar a Internet e a outra rede (por exemplo, o gateway da Internet via DHCP e o gateway da outra rede através de uma rota).
  • O encaminhamento de IP deve estar ativo para os dois gateways.
  • O mascaramento de IP deve estar ativado para permitir que o NAT funcione entre os gateways.

    modprobe iptable_nat
    echo 1 > /proc/sys/net/ipv4/ip_forward
    iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
    iptables -A FORWARD -i eth1 -j ACCEPT
    

    Pode ser necessário especificar uma origem e um destino, pois você está usando a mesma interface para mascarar:

    iptables -t nat -A POSTROUTING -i eth0 -s 192.168.0.0/24 ! -d 192.168.1.0/24 -j MASQUERADE
    

    e o outro gateway:

    iptables -t nat -A POSTROUTING -i eth1 -s 192.168.1.0/24 ! -d 192.168.0.0/24 -j MASQUERADE   
    

    Para cada gateway, o tráfego de rede local deve ser aceito na interface apropriada como esta:

    iptables -A FORWARD -i eth0 -s 192.168.0.0/24 -j ACCEPT
    

    ou

    iptables -A FORWARD -i eth1 -s 192.168.1.0/24 -j ACCEPT
    

Existem inúmeros links e perguntas semelhantes que podem ser referenciadas para solucionar os problemas que você está tendo.

O que parece estar errado nesse caso específico é que a configuração de rota e gateway não está concluída nos computadores e a Conversão de Endereço de Rede (NAT) não foi ativada usando iptables, permitindo que os gateways transportem a solicitação de um computador na outra sub-rede em nome deles.

Isso também é crítico ao configurar uma conexão à Internet, pois você é responsável por uma extremidade da conexão (por exemplo, usando um computador Linux como gateway para uma conexão PPPoE).

John Pettit
fonte