você está aqui: Home  → Arquivo de Mensagens

OpenVPN com os clientes na mesma rede

Colaboração: Tiago Cruz

Data de Publicação: 07 de Agosto de 2009

Um tempo atrás escrevi um artigo sobre VPNs que abordava as vantagens e desvantagens do PPTP, e também um passo-a-passo para subir um OpenVPN autenticando com certificados e etc.

O artigo ainda está disponível na Web, e chama-se Implementando soluções de VPN. O que eu não sabia era que, embora o artigo seja meio antigo (Março de 2006) ele ainda continua funcional! Eu fui seguindo-o passo-a-passo, copiando e colando os comandos e em 15 minutos eu estava conectado à uma VPN usando roteamento com o device tun !

O modo de como esta VPN funciona é bem bacana, pois separa a sua rede servidora (ex: 192.168.0.x) da rede do cliente conectado via OpenVPN, criando uma rede como inválida qualquer como 10.8.0.x. O acesso de uma rede para a outra é feita via roteamento, descantando toda aquela nhaca de broadcast, netbios e etc.

Porém, desta vez a necessidade era diferente. Eu precisava realmente estar dentro da rede servidora, pois de dentro da rede era possível o acesso à uma outra rede, no caso uma LP com o México. A lambança era mais ou menos assim:

  Rede_Mexico = 10.95.0.0/16
  Rede_Servidor = 10.10.10.0/24
  Rede_VPN = 10.8.0.0/24

Utilizando o device tun a rede VPN até chegava na rede do Servidor, porém, não chegava até a rede do México. Não duvido que seja possível de ser feito usando alguns roteamentos malucos, porém consegui resolver o problema apelando para bridges no Linux, usando o device tap .

O Carlos Morimoto havia postado um artigo chamado Criando bridges no OpenVPN, o qual me foi muito útil, pois assim o OpenVPN conectava diretamente na rede 10.10.10.0/24 me enviando um IP que eu mesmo posso escolher via DHCP:

  server-bridge 10.10.10.200 255.255.255.0 10.10.10.210 10.10.10.220

No exemplo acima, 10.10.10.200/24 será o IP do servidor, e 10.10.10.210 até 10.10.10.220 será o range oferecido aos clientes remotos que conectarem usando o OpenVPN.

Porém, para que tudo funcione a contento é necessário criar uma Bridge entre as interfaces eth0 e tap0, para que todo mundo se converse e se enxergue:

  # brctl show
  bridge name    bridge id               STP enabled     interfaces
  br0            8000.00188be16805       no              eth0

Neste caso, o IP não ficará nem na eth0 e nem na tap0, mas sim na br0:

  # ifconfig
  br0       Link encap:Ethernet  HWaddr 00:28:0b:ef:58:75
          inet addr:10.10.10.2  Bcast:10.10.10.255  Mask:255.255.255.0
          inet6 addr: fe80::218:8bff:fee1:6805/64 Scope:Link

Bom, chega de teoria. Os links acima possuem todo o background necessário para que você entenda a coisa passo-a-passo. Vamos logo para o que interessa: Os arquivos de configuração:

Arquivo openvpn.conf no servidor:

  # /etc/openvpn/openvpn.conf
  # Objetivo: Clientes remotos conectarem no mesmo range da LAN local sem roteamento
  proto udp
  port 1194
  
  # bridge utiliza a interface "tap" em vez da "tun"
  # (o tap transmite pacotes de broadcast e o tun não)
  dev tap0
  
  # Faixa de IPs para os clientes
  server-bridge 10.10.10.200 255.255.255.0 10.10.10.210 10.10.10.220
  
  # No cliente eh necessário um
  # route add -net 10.95.0.0 netmask 255.255.0.0 gw 10.10.10.1 tap0
  # para acessar a LP no Mexico 10.95.x.x
  push "route 10.95.0.0 255.255.0.0 10.10.10.1"
  
  # Compressão e persistência
  comp-lzo
  keepalive 10 120
  ifconfig-pool-persist /etc/openvpn/ipp.txt
  
  # Certificados
  tls-server
  ca ca.crt
  cert server.crt
  key server.key
  dh dh1024.pem
  
  # Logs e etc
  status      /var/log/openvpn-status.log
  log         /var/log/openvpn.log
  log-append  /var/log/openvpn.log
  verb 3
  
  # Bridges para simular um mesmo switch entre a tap0 e a eth0
  up /etc/openvpn/bridge-start
  down /etc/openvpn/bridge-stop

Arquivo bridge-start:

  #!/bin/bash
  # /etc/openvpn/bridge-start
  
  br="br0"
  tap="tap0"
  eth="eth0"
  eth_ip="10.10.10.2"
  eth_gw="10.10.10.1"
  eth_netmask="255.255.255.0"
  eth_broadcast="10.10.10.255"
  
  for t in $tap; do
  openvpn --mktun --dev $t
  done
  
  brctl addbr $br
  brctl addif $br $eth
  
  for t in $tap; do
  brctl addif $br $t
  done
  
  for t in $tap; do
  ifconfig $t 0.0.0.0 promisc up
  done
  
  ifconfig $eth 0.0.0.0 promisc up
  ifconfig $br $eth_ip netmask $eth_netmask broadcast $eth_broadcast
  #route add default gw $eth_gw dev $br
  route add -net 10.95.0.0 netmask 255.255.0.0 gw 10.10.10.1 br0
  
  iptables -A INPUT -i tap0 -j ACCEPT
  iptables -A INPUT -i br0 -j ACCEPT
  iptables -A FORWARD -i br0 -j ACCEPT

Arquivo bridge-stop:

  #!/bin/bash
  # /etc/openvpn/bridge-stop
  
  br="br0"
  tap="tap0"
  ifconfig $br down
  brctl delbr $br
  
  for t in $tap; do
  openvpn --rmtun --dev $t
  done
  
  route del -net 10.95.0.0 netmask 255.255.0.0 gw 10.10.10.1 br0
  ifdown eth0
  ifup eth0
  route add -net 10.95.0.0 netmask 255.255.0.0 gw 10.10.10.1 eth0

Arquivo no cliente:

  # Cliente pode ser Linux ou Windows
  remote 200.200.200.100
  proto udp
  port 1194
  client
  pull
  dev tap
  comp-lzo
  keepalive 10 120
  tls-client
  ca ca.crt
  cert tiagocruz.crt
  key tiagocruz.key
  ns-cert-type server
  verb 3

O resultado pode ser visto nos screnshoots abaixo:

Como você deve ter percebido, apenas alguns ajustes foram necessários nos scripts que iniciam e derrubam as bridges. A parte mais chata foi automatizar a criação de rotas estáticas nos clientes, para que não fosse necessário usar o route add em toda a conexão. A linha do push resolveu este problema, inclusive apontando a rota para um host que diferente do servidor de VPN, que é o padrão.

Segue uma screnshoot mostrando o antes, o durante e o depois do super device tap :)

Nos testes foram utilizadas as versões OpenVPN 2.1_rc7 x86_64-pc-linux-gnu no servidor rodando Ubuntu 8.04.3 LTS e o cliente OpenVPN 2.1_rc11 i486-pc-linux-gnu em um Ubuntu 9.04.

Também foi possível conectar usando a GUI do OpenVPN para Windows.

Abraços e até o próximo post! 8)

Publicado originalmente em http://everlinux.com/blog/2009/07/18/openvpn-com-os-clientes-na-mesma-rede


Veja a relação completa dos artigos de Tiago Cruz

 

 

Opinião dos Leitores

simao
22 Mai 2015, 12:44
Tenho um problema com a minha rede openvpn. Server Windows 7 - Cliente xp. Rede Server 192.168.0.0/24 Cliente 192.168.1.0/24 . Interface server vpn 10.8.0.1 / interface cliente 10.8.0.6. Instalei tudo configurei. E é o seguinte consigo pingar do cliente o 10.8.0.1 mas não a rede server 192.168.0.1. Adicionei a rota para a rede 192.168.0.0. Qual será o problema? URgente.

Leandro
27 Jan 2012, 10:02
Parabéns pelo post...

estou tentando replicar porém quando "starto" meu openvpn me retorna o seguinte erro:

Fri Jan 27 09:55:51 2012 OpenVPN 2.2.0 i686-linux-gnu [SSL] [LZO2] [EPOLL] [PKC$
Fri Jan 27 09:55:51 2012 NOTE: when bridging your LAN adapter with the TAP adap$
Fri Jan 27 09:55:51 2012 NOTE: your local LAN uses the extremely common subnet $
Fri Jan 27 09:55:51 2012 NOTE: the current --script-security setting may allow $
Fri Jan 27 09:55:51 2012 Diffie-Hellman initialized with 1024 bit key
Fri Jan 27 09:55:51 2012 WARNING: file 'keys/matriz.key' is group or others acc$
Fri Jan 27 09:55:51 2012 TLS-Auth MTU parms [ L:1574 D:138 EF:38 EB:0 ET:0 EL:0$
Fri Jan 27 09:55:51 2012 Socket Buffers: R=[114688->131072] S=[114688->131072]
Fri Jan 27 09:55:51 2012 TUN/TAP device tap0 opened
Fri Jan 27 09:55:51 2012 TUN/TAP TX queue length set to 100
Fri Jan 27 09:55:51 2012 /etc/bridge-start tap0 1500 1574 init
Fri Jan 27 09:55:51 2012 WARNING: Failed running command (--up/--down): could n$
Fri Jan 27 09:55:51 2012 Exiting

quando descomento a chamada de etc/openvpn/start-bridge não aparece o erro, porém preciso do bridge funcionando.

se puder me ajudar fico agradecido

user777
18 Mai 2011, 20:36
cara fiz os procedimentos mas tem algo errado , pode me ajudar
*Nome:
Email:
Me notifique sobre novos comentários nessa página
Oculte meu email
*Texto:
 
  Para publicar seu comentário, digite o código contido na imagem acima
 


Powered by Scriptsmill Comments Script