Túnel um IP estático que é atribuído a um VPS ao roteador doméstico

1

Atualmente, tenho um VPS com um único IP estático. O seguinte cenário seria possível se eu comprasse um segundo IP estático?

Suponha que o IP A em eth0: 0 seja 1.2.3.4 e o IP estático B em eth0: 1 seja 5.6.7.8 . Eu quero rotear todo o tráfego indo para o IP A para o meu roteador doméstico, sem usar o NAT do lado do servidor. Penso em estabelecer um túnel GRE (protegido com IPsec) entre meu roteador doméstico e o IP B. Os pacotes IP recebidos no IP A precisariam então ser passados dentro do túnel. Eu acho que um diagrama deve deixar isso mais claro: Normalmente,issoseriaumcasoclarodeusarumaVPNSite-to-SiteeusarNATnoVPS,maseunaverdadenãoquerousaroNATdoladodoservidor.Emvezdisso,queroquemeuroteadordomésticoexecutesrcnatnotráfegodeentradaesaídadetráfegodeentradaespecífico.OVPSdeveapenas"passar" pelos pacotes IP de entrada e de saída.

Eu imagino o fluxo de pacotes da seguinte forma:

  1. O host dentro da LAN 192.168.100.0/24 deseja enviar um pacote para, digamos, 8.8.8.8

  2. O roteador residencial examina isso para o IP estático A (1.2.3.4)

  3. o pacote passa pelo gre1 e entra no VPS

  4. O VPS encaminha o pacote por meio de eth0: 0, deixando o campo de IP de origem inalterado

  5. resposta do 8.8.8.8 chega ao VPS com IP de destino 1.2.3.4

  6. O VPS pega o pacote e o coloca em gre1, sem fazer qualquer NAT

  7. O roteador
  8. home processa o pacote e verifica se é uma conexão estabelecida ou relacionada e encaminha para o cliente de rede local correspondente.

Eu acho que poderia simplesmente adicionar outro IP na interface gre1 no meu roteador, ou seja, 1.2.3.4, para que ele 1) aceitasse pacotes IP com esse valor de destino e 2) enviasse pacotes de saída com esse IP em vez do IP do encapsulamento (10.0.0.2)?

Coloque em breve, eu simplesmente quero que todos os pacotes que chegam na eth0: 0 cheguem sem modificações em gre1 no meu roteador doméstico. Isso seria possível da maneira descrita?

BTW, estou usando um roteador Mikrotik em casa, se for de alguma informação adicional.

Obrigado pela sua ajuda!

    
por Alex 09.03.2016 / 22:58

1 resposta

0

Primeiro, pare de pensar em eth0 e eth0: 1 como interfaces separadas. Pare desenhar eles como interfaces separadas. Eles não são. Você tem uma interface eth0 com dois endereços IP - o resto é uma ilusão que o Linux usa ferramentas antigas como ifconfig .

Com isso fora do caminho, isso é bem simples no lado do servidor.

  1. Para configurar isso no seu servidor, inicie removendo o endereço 5.6.7.8 da eth0. Você não quer que o servidor pense que esses pacotes pertencem a ele e os consome; você quer que ele atue como um roteador puro, e ter um endereço roteado atribuído a uma interface local é exatamente o que um roteador não precisa.

    ip addr del 5.6.7.8/x dev eth0
    
  2. Agora adicione uma rota estática para o endereço no seu túnel:

    ip route add 5.6.7.8/32 dev gre1
    
  3. É isso (quase). A única complicação restante é que o servidor ainda precisa responder às consultas ARP para esse endereço proveniente do gateway local da sua empresa de hospedagem. Para isso você precisa do recurso proxy-ARP :

    ip neigh add proxy 5.6.7.8 dev eth0
    

    Isso habilita o proxy-ARP para um endereço. Não use sysctl net.ipv4.conf.all.proxy_arp=1 para ativá-lo globalmente; isso causaria respostas proxy-ARP para tudo para o qual seu servidor possui uma rota, o que pode ser conveniente em alguns casos, mas desnecessário neste caso.

    (Como uma observação, o espaço do usuário parpd ou ndppd pode ser mais fácil de entender do que o proxy ARP / NDP baseado em kernel.

A configuração mais complexa pode ser necessária no roteador cliente , já que ele deve escolher entre dois gateways padrão (rota direta versus GRE) dependendo do endereço IP de origem.

Felizmente, o Mikrotik RouterOS tem o recurso de roteamento de política do Linux para pelo menos IPv4 (mas ainda não para o IPv6), então você pode seguir as generalizadas instruções ip rule do Linux e mapeá-las 1: 1 para comandos RouterOS. Resumindo:

  1. Adicione uma rota padrão sobre o túnel GRE a uma marca table de roteamento diferente (o RouterOS chama de 'marca de roteamento'):

    /ip route add dst-address=0.0.0.0/0 gateway=gre0 routing-mark="tunnelled"
    
  2. Adicione uma regra de política para escolher esta tabela mark de roteamento (RouterOS ...) para os pacotes deste endereço de origem:

    /ip rule add src-address=5.6.7.8/32 table="tunnelled"
    

Um comentário menciona a ponte. Isso não funciona por dois motivos.

GRE é um túnel Layer3 que não transporta cabeçalhos semelhantes a Ethernet e, portanto, não é transponível. Existem variantes do Layer2, como o Linux gretap e Mikrotik eoip - infelizmente, elas são mutuamente incompatíveis, apesar de serem baseadas em GRE.

O comentário realmente menciona tun , talvez sob a suposição de que o túnel é OpenVPN (GRE não é OpenVPN), mas tun também é uma interface Layer3. Agora existe uma versão Layer2 - tap interface - e Linux OpenVPN pode de fato ser configurado para usá-lo e ser uma VPN Layer2 ... mas a implementação RouterOS OpenVPN não suporta esse modo de qualquer maneira. / p>

Além disso, como eth0: 1 não é uma interface separada, ela não pode ser interligada sem também vincular a própria eth0. Uma interface virtual macvlan poderia ser criada a partir da eth0 e, em seguida, interligada com um túnel? Não tenho certeza. Provavelmente seria mais problema do que vale a pena.

    
por 02.10.2018 / 08:12