“IP-Passthrough” configuração OpenVPN

1

Eu quero criar uma configuração de VPN que permita que um cliente de um servidor OpenVPN use o IP público do servidor, como se fosse seu próprio IP, conectado ao IP.

Aqui está o layout da rede agora:

                                     +---------------------------------------------------+
                                     |  Server machine (Linux)                           |
                                     |                                                   |
                                     |                                                   |
                                     |                                                   |
                    Data center----->O<--eth0-----------+                                |
                                     |  |79.102.91.184  |                                |
                                     |  |67.248.62.166  |                                |
                                     |  |94.187.137.76  |                                |
                                     |  |189.180.86.216 |                                |
                                     |  |219.167.189.118|                                |
                                     |  +---------------+                                |
                                     |                                                   |
                                     +---------------------------------------------------+

          +------------------------------------------+       +---------------------------+
          |  Router with NAT                         |       |  Client machine (Linux)   |
          |                  NAT                     |       |                           |
          |               +--------+                 |       |                           |
DSL to    |               |        |                 |  LAN  |                           |
Internet->O<---eth0-------+-+    +-+---------eth1-+->O<----->O<---eth0----------------+  |
          |  |24.174.216.166|    |192.168.2.1/24  |  |       |  |192.168.2.10/24      |  |
          |  |              |    |                |  |       |  |Router 192.168.2.1   |  |
          |  |              |    |                |  |       |  |                     |  |
          |  +--------------+    +----------------+  |       |  +---------------------+  |
          |                                          |       |                           |
          +------------------------------------------+       +---------------------------+

Eu quero configurar um servidor OpenVPN na máquina do servidor. Então, um cliente deve ser capaz de se conectar a essa VPN através da Internet, por exemplo, conectando-se a 79.102.91.184 (primeiro IP do servidor).

Na máquina cliente, um adaptador de tap ou tun deve ser criado, que tenha um dos outros IPs publicamente roteáveis do servidor atribuído e roteado corretamente. Por exemplo, o cliente agora pode se comunicar com a Internet usando o IP 67.248.62.166 (e o servidor não pode mais ser alcançado sob esse IP).

Como posso configurar o OpenVPN de forma a tornar possível esse tipo de cenário de roteamento?

    
por RAnders00 14.05.2017 / 11:56

2 respostas

3

O comportamento exato que você gostaria de alcançar parece impossível. Com uma VPN no modo TUN nel , você sempre obterá um IP de VPN interno e ficará atrás de um NAT em relação à Internet. Embora todo o tráfego pareça originar-se do endereço IP do outro lado, ele ainda é compartilhado entre outros usuários da VPN e não expõe o computador cliente diretamente à Internet com esse IP.

OpenVPN bridging (modo TAP ) se comporta mais perto do estado desejado. Você deve aprender a diferença entre ponte e roteamento , mas basicamente simula o link layer dispositivo , dando-lhe um endereço IP do outro lado. Você também deve aprender sobre OpenVPN Ethernet Bridging , pois é inútil copiar o manual inteiro aqui, mas aqui está uma citação relevante (configuração após a instalação do brigde-utils & edição / execução do script bridge-start ) para discussão adicional:

Comment out the lines which says dev tun and begins with server and replace it instead with:

dev tap0 
server-bridge 192.168.8.4 255.255.255.0 192.168.8.128 192.168.8.254

Now set up the Linux firewall to permit packets to flow freely over the newly created tap0 and br0 interfaces:

iptables -A INPUT -i tap0 -j ACCEPT 
iptables -A INPUT -i br0 -j ACCEPT
iptables -A FORWARD -i br0 -j ACCEPT

Embora não seja comum e possa não ser uma boa ideia, deve ser possível interligar uma interface de rede pública da mesma forma que a sub-rede privada 192.168.8.0/24 foi colmatada no exemplo, fornecendo aos clientes endereços IP entre 192.168.8.128 e 192.168.8.254 .

No entanto, ainda teria pré-requisitos que não são atendidos no momento. Você precisaria ter uma sub-rede de endereço IP público para ser conectada (ou seja, usada para seu pool de endereços de cliente VPN ) em vez desses endereços IP independentes daqui e dali.

    
por 22.05.2017 / 11:17
2

Embora isso possa não responder à sua pergunta, acho que é o mais próximo que você pode chegar. Ele funciona como esperado, mas por um lado: o cliente não terá o endereço IP "externo", pois ele precisa residir no servidor.

Observe também que não é assim que as VPNs devem funcionar.

Enfim, aqui está o que você precisa fazer. Estou assumindo aqui que o seu servidor VPN tem vários endereços IP, um dos quais é reservado para a própria VPN. O restante deve ser mapeado para clientes, portanto, um cliente conectado será visto como esse endereço IP externo.

  1. Garanta que todos os clientes tenham um endereço atribuído estaticamente.
  2. O tráfego SNAT desse endereço IP parece ter se originado da interface "externa".
  3. Tráfego DNAT apontando para a interface externa para o túnel da VPN

Garanta que todos os clientes tenham um endereço estático

Para isso, adicione as seguintes linhas ao seu arquivo de configuração openvpn do lado do servidor:

client-config-dir clientConfig
ccd-exclusive

Crie o diretório clientConfig para o diretório /etc/openvpn/ . Isso manterá os arquivos de configuração por cliente. A opção ccd-exclusive fará com que os clientes falhem se eles não tiverem uma configuração de cliente correspondente no diretório especificado por client-config-dir . Como sua configuração depende de um mapeamento exato de endereços IP externos e VPN, cada cliente deve ter sua própria configuração.

iNo diretório config do cliente, crie um arquivo denominado como o nome comum do cliente, ou seja, o campo CN do certificado ou o nome de usuário, dependendo do método de autenticação usado. O arquivo deve conter um simples push de endereço IP, assim:

ifconfig-push 192.168.0.5 192.168.0.6

Observe que todo cliente deve ter sua própria rede / 30 da qual os dois endereços IP atribuídos e as redes não devem se sobrepor.

Adicione a diretiva redirect-gateway ao arquivo de configuração do lado do cliente para substituir o gateway padrão, desta forma:

redirect-gateway def1

Depois disso, o cliente deve ter o mesmo endereço IP, não importa quando se conectar, e terá seu gateway padrão reescrito após a conexão.

Configurando o SNAT

Para cada cliente, uma regra SNAT deve ser configurada assim:

iptables -t nat -I POSTROUTING -o <device> \
    -s <client_ip> -j SNAT --to <out_ip>

onde:

  • <device> é o dispositivo de saída (no seu caso, eth0 )
  • <client_ip> é o IP que você configurou para o cliente na etapa anterior (no exemplo acima 192.168.0.5 )
  • <out_ip> é o endereço IP que é visto pelos servidores aos quais os clientes se conectam (por exemplo, 67.248.62.166 é um desses IPs no seu exemplo)

Além disso, certifique-se de definir o encaminhamento de IP como verdadeiro ( echo 1 >/proc/sys/net/ipv4/ip_forward ).

Configurando o DNAT

Para cada cliente, você deve emitir um comando como este:

iptables -t nat -A PREROUTING \
    -i <device> -d <out_ip> -j DNAT --to <client_ip>

Os parâmetros <device> , <out_ip> e <client_ip> são iguais aos anteriores.

Os comandos iptables descritos acima podem ser emitidos se a conexão não estiver ativa (na verdade, o servidor openvpn não precisa ser executado).

O que é deixado de fora

Desta forma, a ligação funciona em ambos os sentidos: a partir da Internet, o endereço IP externo está acessível e todos os tráfegos (TCP e UDP) serão encaminhados cegamente para o cliente. Se o cliente iniciar uma conexão, ela será vista como originada do endereço IP especificado do servidor VPN.

Isso é quase o que você queria.

Uma coisa não vai funcionar: o cliente não será capaz de pegar a interface externa. Na verdade, o cliente nem sequer está ciente do endereço IP externo. Ou seja, você não poderá ligar (por exemplo) 189.180.86.216 . Você poderá, no entanto, usar 0.0.0.0 e, dessa forma, o cliente estará acessível por meio do endereço IP "externo".

Observe também que você precisa atribuir um endereço IP para o servidor VPN. Esse endereço não pode ser usado para encaminhar todo tráfego para qualquer um dos clientes, por razões óbvias.

    
por 22.05.2017 / 16:15