Servidor VPN en Google Compute Engine con OpenVPN

13

Estoy tratando de usar el servidor Google Compute Engine como servidor VPN para todo mi tráfico (vivo en Rusia, tenemos algunos problemas con la censura aquí).

Hay un mini tutorial sobre VPN en GCE , pero se trata de la red entre 2 servidores dentro de GCE y no con OpenVPN.

Realicé todos los pasos de otro tutorial, sobre cómo configurar VPN con OpenVPN en Debian , puedo conectarme a VPN desde el cliente, pero luego no puedo abrir conexiones (ni siquiera puedo hacer ping a google). En el servidor puedo hacer ping y descargar todo como de costumbre.

Tengo VPN en Linode con la misma configuración y funciona bien. Entonces, el problema está en las reglas de enrutamiento de red GCE o firewall.

He probado muchas variantes pero nada funciona. Por favor, mira la configuración y dime qué debo cambiar.

// líneas de configuración eliminadas, porque el problema está resuelto //

ONZ_
fuente
¿Hay alguna manera de habilitar el reenvío de IP? echo 1> / proc / sys / net / ipv4 / ip_forward
Alec Istomin
@AlecIstomin, sí, está hecho. Tengo VPN en Linode con la misma configuración y funciona bien. Entonces, el problema está en las reglas de enrutamiento de red GCE o firewall.
OZ_
¿Quizás pedir ayuda a GCE? Este parece ser el tipo de cosas que podrían responder rápidamente.
Bill Weiss
El precio de @BillWeiss para sus planes de soporte comienza desde $ 150 / mes, pero si este problema no se resuelve en una semana, creo que los pagaré. También intentaré encontrar a alguien en oDesk para solucionarlo y luego escribiré un tutorial en mi blog.
OZ_
odesk.com/jobs/~01c4b1438a64f31fdd - no duden en presentar una solicitud, si pueden ayudar, muchachos.
OZ_

Respuestas:

7

En primer lugar, gracias a @Shivox por su respuesta .

Y aquí está el procedimiento rápido:

  • Te recomiendo que crear red adicional (ver pestaña "Redes" ") preferencias de red, añadir reglas permitidas para: TCP: 22 (si no existe), tcp: 9700, tcp:. 17619 . 17619 aquí es variable - cambiarlo por cualquier puerto que le gusta (el rango es 9075-65534). Solo necesita 3 reglas y 2 rutas predeterminadas, nada más.
  • Vaya a "Crear instancia de Compute Engine", haga clic en "Mostrar opciones avanzadas", permita el reenvío de puertos, seleccione la ubicación del servidor.
  • Ahora (cuando haya seleccionado la ubicación), agregue IP estática al servidor.
  • Seleccione la imagen Ubuntu 14.04 (exactamente esta versión).
  • Crear instancia
  • Conéctese a través de SSH (la forma más fácil: use la herramienta en el navegador desde el panel GCE)
  • sudo su
  • apt-key update && apt-get update && apt-get -y upgrade && apt-get -y install python-software-properties && apt-get -y install software-properties-common && add-apt-repository -y ppa:pritunl && apt-get update && apt-get -y install pritunl
  • En navegador abierto https://instance_ip:9700
  • En cuestión sobre DB, haga clic en "Guardar"
  • En la ventana de inicio de sesión, use pritunlcomo nombre de usuario y contraseña
  • Ahora cambie el nombre de usuario y la contraseña del usuario administrador
  • Agregar organización, luego 2 usuarios (para escritorio y dispositivos móviles)
  • Haga clic en "Agregar servidor" en la pestaña "Servidores"
  • Use el número de puerto del primer paso ( 17619 como ejemplo) y el protocolo tcp.
  • Adjuntar organización al servidor
  • Iniciar servidor
  • En la pestaña "Usuarios" descargue las claves para ambos usuarios (archivos tar con archivos ovpn dentro).

Yo uso Viscosity para OS X y OpenVPN connect para iOS como clientes. En Viscosidad, active la opción "Enviar todo el tráfico a través de la conexión VPN" en la pestaña "Redes".

ONZ_
fuente
Solo para tener en cuenta: Google Cloud Platform ofrece una prueba gratuita con $ 300 por 60 días.
OZ_
1
Las instrucciones para instalar Pritunl en Ubuntu 14.04 cambiaron: github.com/pritunl/pritunl#ubuntu-trusty
motobói
6

Puede resolver el problema de no poder navegar por la web a través de la VPN a pesar de poder hacer ping, traceroute ... de una de las dos formas siguientes:

Primero, puede usar el protocolo TCP en lugar de UDP, cambiando 'proto udp' a 'proto tcp' en los archivos conf de cliente y servidor.

En segundo lugar, puede usar el dispositivo tap en lugar de tun, cambiando 'dev tun' a 'dev tap' en los archivos conf de cliente y servidor.

Sin embargo, no estoy seguro de cuál es el problema, parece que es un problema del final de Google.

Shivox
fuente
1
¡Eres mi héroe! ¡Muchas gracias! Cambiar a TCP hizo el truco. Expandiré el "cómo" completo en una respuesta separada. Esa sensación cuando el sueño de mucho tiempo se hace realidad ... ¡Gracias!
OZ_
4

Recuerde que Google VPC está descartando paquetes que tienen source_ipuna IP diferente de una VM con IP externa.

Este documento https://cloud.google.com/compute/docs/vpc/advanced-vpc dice:

La red VPC reescribe el encabezado IP para declarar la dirección IP externa de la instancia como fuente. Si la instancia no tiene una dirección IP externa, la llamada no está permitida y la red VPC descarta el paquete sin informar al remitente.

Entonces, si su openVPN solo está reenviando paquetes desde la otra red, entonces los paquetes al público interno se descartarán, ya source_ipque no coincide con ninguna IP interna de la VM existente. Por esta razón, necesita NAT los paquetes que salen de su red local, por ejemplo, en su nodo VPN.

Chain POSTROUTING (policy ACCEPT)
target      prot opt source              destination         
MASQUERADE  all  --  192.168.0.0/16      !192.168.0.0/16

"Pritunl" mencionado en la respuesta OZ_ funciona porque configura el NAT automáticamente.

Piotr Tabor
fuente
3

Esto no es realmente una respuesta, pero el sitio no me permitió agregarlo como un comentario a su pregunta.

Sin embargo, tengo casi la misma configuración que detalló anteriormente (no configuré el dnsmaq en el servidor resistente)

Desafortunadamente, la VPN no funciona como se esperaba. Puedo resolver una dirección, hacer ping a algunos hosts de Internet e incluso hacer un seguimiento completo mientras estoy conectado a la VPN. Sin embargo, cuando abro el navegador y navego a un sitio, la conexión es realmente lenta. No sé qué puede estar afectando la conexión, pero es realmente un problema extraño.

Quizás alguien de Google pueda ayudarnos a saber qué está pasando.

PD 1. Como otras personas han sugerido antes, ¿puede verificar si el reenvío de IP está habilitado? Para mí, la única forma de garantizar que el valor de net.ipv4.ip_forward se haya restaurado correctamente después de un reinicio fue después de usar una regla personalizada en /etc/sysctl.d

Por ejemplo, puede agregar la regla con el siguiente comando:

$ sudo echo "net.ipv4.ip_forward = 1" > /etc/sysctl.d/90-useroverrides.conf

PD 2. Si el reenvío funciona para usted, ¿puede probar una ruta de seguimiento a un host externo mientras está conectado a la VPN? El resultado que obtuve cuando hago esto es un poco extraño (¿Por qué hay varios saltos en la misma IP ????):

$ sudo traceroute www.yahoo.com -T -p 80 -N 1 -z 0.5 -q 1
traceroute to www.yahoo.com (98.139.183.24), 30 hops max, 60 byte packets
 1  209.85.241.26 (209.85.241.26)  0.764 ms
 2  209.85.241.34 (209.85.241.34)  0.668 ms
 3  209.85.241.26 (209.85.241.26)  0.966 ms
 4  209.85.241.36 (209.85.241.36)  0.702 ms
 5  209.85.241.28 (209.85.241.28)  0.865 ms
 6  209.85.241.36 (209.85.241.36)  0.642 ms
 7  209.85.241.26 (209.85.241.26)  0.921 ms
 8  209.85.241.28 (209.85.241.28)  18.837 ms
 9  72.14.238.107 (72.14.238.107)  13.378 ms
10  72.14.237.131 (72.14.237.131)  38.275 ms
11  209.85.254.131 (209.85.254.131)  13.349 ms
12  *
13  ae-8.pat1.bfz.yahoo.com (216.115.101.231)  44.903 ms
14  ae-4.msr1.bf1.yahoo.com (216.115.100.25)  45.323 ms
15  xe-10-3-1.clr1-a-gdc.bf1.yahoo.com (98.139.232.101)  47.382 ms
16  et18-25.fab6-1-sat.bf1.yahoo.com (98.139.128.103)  45.793 ms
17  po-13.bas1-7-prd.bf1.yahoo.com (98.139.129.209)  41.143 ms
18  ir2.fp.vip.bf1.yahoo.com (98.139.183.24)  42.451 ms

PD 3. Lo único que parece funcionar correctamente es que la VPN está utilizando la IP externa de mi host para acceder a Internet

$ sudo curl --interface tun0 checkip.dyndns.org
<html><head><title>Current IP Check</title></head><body>Current IP Address: 107.178.XXX.XXX</body></html>
Mario
fuente
@OZ_ Me alegra saber que ahora puede hacer ping y traceroute mientras está conectado a la VPN. Ahora, ¿puedes publicar el resultado de uno de tus traceroute? Tengo curiosidad por las primeras líneas de la salida porque parece que el paquete se enruta en un bucle durante al menos los primeros 8 saltos (aunque no soy un experto en redes)
Mario
lo siento, aquí está: gist.github.com/jamm/028ae858a03e40495740 . Y sí, se ve extraño. Quizás necesitamos alguna ruta específica.
OZ_
1

Editar /etc/sysctl.confdescomentando#net.ipv4.ip_forward=1

Eso debería permitir que OpenVPN dirija su tráfico.

Justin Miller
fuente
Un buen tutorial sobre cómo
MFT
fue mencionado en el primer comentario serverfault.com/questions/590530/…
OZ_
1

Necesita el reenvío de IP habilitado para su instancia de VM en Google Cloud, de lo contrario, los paquetes no llegarán a su VM. Tenga en cuenta que esto es independiente de lo net.ipv4.ip_forward = 1que puede configurar en su VM.

El reenvío de IP solo se puede configurar una vez antes de crear una VM, y no se puede modificar después. Para habilitarlo para una nueva VM, haga clic en Management, security, disks, networking, sole tenancy: ingrese la descripción de la imagen aquí

Luego, en la Networkingpestaña, haga clic en Network Interfacey configure Reenvío de IP en ON:

ingrese la descripción de la imagen aquí

Pavel P
fuente
0

Debe agregar una regla que permita el tráfico para OpenVPN:

iptables -A INPUT -p udp --dport 1194 -j ACCEPT
Paul Rudnitskiy
fuente
existir como regla n. ° 4
OZ_
0

Sobre la red.

1) Habilite todo el tráfico de la subred OpenVPN (por ejemplo, 10.8.0.0/24) en la consola

2) Te sugiero que agregues Masquerade a tu red

firewall-cmd --zone=trusted --add-masquerade --permanent
firewall-cmd --reload-all

3) No olvide habilitar el enrutamiento de paquetes en el núcleo

a) una vez

 echo 1 > /proc/sys/net/ipv4/ip_forward

b) para siempre en /etc/sysctl.conf:

 net.ipv4.ip_forward = 1
Mikolas Pansky
fuente