lunes, 30 de julio de 2012

OpenVPN en un VPS Proxmox

Post rápido para hoy. Me tocó montar una VPN a un cliente, el problema es que su servidor era una máquina virtual con openVZ sobre Proxmox . Dejo aquí un manual de los pasos que seguí para montarlo, espero que a alguien le sea de utilidad como a mi!

Saludos!!
---------------------------------
1. Preparar host:
Entramos en el proxmox por ssh:
Desde la consola del servidor Proxmox (como root) activamos el soporte TUN/TAP en el kernel

modprobe tun 

comprobamos que esté activado

lsmod | grep tun 

teniendo que ver una salida como esta:

tun                    18815  1 vhost_net 

Para que esto sea permanente, debemos poner que el módulo “tun” sea cargado en el inicio del servidor. Para ello usamos la siguiente orden:

echo tun >> /etc/modules 

Podemos reiniciar Proxmox y ejecutar la orden anterior para verificar que se ha cargado el módulo al inicio.

Desde la consola del servidor Proxmox editamos el fichero

nano -w /etc/vz/vz.conf 

y en la línea donde pone (sobre la linea 46)

## IPv4 iptables kernel modules to be enabled in CTs by default 
IPTABLES="ipt_REJECT ipt_tos ipt_limit ipt_multiport iptable_filter iptable_mangle ipt_TCPMSS ipt_tcpmss ipt_ttl ipt_length" 

añadimos al final

ipt_state iptable_nat 

dejamos esa línea como sigue:

IPTABLES="ipt_REJECT ipt_tos ipt_TOS ipt_LOG ip_conntrack ipt_limit ipt_multiport iptable_filter iptable_mangle ipt_TCPMSS ipt_tcpmss ipt_ttl ipt_length ipt_state iptable_nat ip_nat_ftp"
#IPTABLES="ipt_REJECT ipt_tos ipt_limit ipt_multiport iptable_filter iptable_mangle ipt_TCPMSS ipt_tcpmss ipt_ttl ipt_length ipt_state iptable_nat" 

Con este paso hacemos accesible los módulos de “nat” y “state” de iptables a los VPS
Instalamos algunos módulos más en nuestro servidor Proxmox

modprobe ipt_mark 
modprobe ipt_MARK 
modprobe tun 

Haciéndolos permanentes del mismo modo que hicimos en el paso 4.

echo ipt_mark >> /etc/modules 
echo ipt_MARK >> /etc/modules 

Damos permisos para que nuestra máquina virtual pueda hacer uso del dispositivo tun/tap

vzctl set 101 --devnodes net/tun:rw --save 

En nuestro caso, como solo tenemos una máquina virtual, esta tiene el ID 101.

La salida del comando anterior deberá ser:

Setting devices
Saved parameters for CT 101

Permitimos a nuestro VPS abrir el interface TUN/TAP, asegurándonos primero que el VPS esté apagado.

vzctl set 101 --devices c:10:200:rw --save 
vzctl stop 101 
vzctl set 101 --capability net_admin:on --save 
vzctl start 101

Creamos el dispositivo “tun net” en nuestra máquina virtual

vzctl exec 101 mkdir -p /dev/net 
vzctl exec 101 mknod /dev/net/tun c 10 200 
vzctl exec 101 chmod 600 /dev/net/tun

2. Cambiar tipo de red a veth desde el panel de proxmox:
- Eliminar la ip y guardar
- seleccionar veth y guardar
- seleccionar interfaz

3. Si no carga la red:
Editar  /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0
IPADDR=212.34.xx.xx
NETMASK=255.255.255.0
GATEWAY=212.34.xx.xx
ONBOOT=yes
HWADDR=xx:xx:xx:xx:xx:xx
BOOTPROTO=none
TYPE=Ethernet

Y editar /etc/sysconfig/network y cambiar GATEWAY por la correspondiente. Reiniciar demonio de red. Cambiar venet0:0 a eth0 en /usr/local/directadmin/conf/directadmin.conf si no peta DA
4. Instalar openvpn

4.1 Instalamos desde repositorio EPEL el openvpn.
[root@dlp ~]#
wget http://ftp.riken.jp/Linux/fedora/epel/RPM-GPG-KEY-EPEL-6
[root@dlp ~]#
rpm --import RPM-GPG-KEY-EPEL-6

[root@dlp ~]#
rm -f RPM-GPG-KEY-EPEL-6

[root@dlp ~]#
vi /etc/yum.repos.d/epel.repo
# create new

[epel]
name=EPEL RPM Repository for Red Hat Enterprise Linux
baseurl=http://ftp.riken.jp/Linux/fedora/epel/6/$basearch/
gpgcheck=1
enabled=0
# when you use the repository, input yum command like follows

[root@dlp ~]#
yum --enablerepo=epel install [package]

4.2 Generamos certificados para la conexión:
cp -R /usr/share/openvpn/easy-rsa/ /etc/openvpn

nano /etc/openvpn/easy-rsa/2.0/vars (Editamos lineas finales)

export KEY_COUNTRY="ES"
export KEY_PROVINCE="MA"
export KEY_CITY="Madrid"
export KEY_ORG="server.dominio.es"
export KEY_EMAIL="[email protected]"

Preparamos el terreno:
cd /etc/openvpn/easy-rsa/2.0/
source ./vars
./vars
./clean-all
./build-ca

./build-key-server server                # certificado para el servidor
./build-key client1                          # certidicado para el cliente, supuestamente uno por cada cliente
./build-dh                                      # generar parametros Diffie Hellman (various stuff)

4.3 nos llevamos los certificados client y ca al equipo cliente para luego.
Además movemos estos certifiados a /etv/openvpn

    ca.crt
    ca.key
    dh1024.pem
    server.crt
    server.key

4.4 Configuramos VPN

cp /usr/share/doc/openvpn-2.1.4/sample-config-files/server.conf /etc/openvpn/
cp /usr/share/doc/openvpn-2.1.4/sample-config-files/client.conf ~/
cd ~/

nano ~/client.conf

client
dev tun
proto udp
remote 212.34.xx.xx 1194
ca ca.crt
cert client.crt
key client.key
ns-cert-type server
comp-lzo
verb 3

Editamos /etc/openvpn/server.conf y descomentamos:
push "redirect-gateway def1 bypass-dhcp"

Editamos /etc/sysctl.conf y cambiamos:
net.ipv4.ip_forward = 0 a net.ipv4.ip_forward = 1

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

Añadimos reglas a iptables:

iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -s 10.8.0.0/24 -j ACCEPT
iptables -A FORWARD -j REJECT
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j SNAT --to 212.34.xx.xx # IP del equipo

Y además al rc.local para que carguen de inicio

4.5 instalamos dnsmasq

yum install dnsmasq
/etc/init.d/dnsmasq start
chkconfig dnsmasq on

Reinciamos para que coja el dnsmasq

Editar /etc/openvpn/server.conf

Y añadir

push "dhcp-option DNS 10.8.0.1"

Y listo: /etc/init.d/openvpn restart


5. Configurar openVPN Cliente:

Bajar:

client1.conf
certificados ca.crt client1.crt client1.key

Editar archivo client1.conf. cambiar la ruta de loscertificados a la real (para poner un \ hay que poner \\) y renombar el archivo a client1.ovpn.

Poner los archivos en "c:\\Program Files (x86)\\openVPN\\config"

Conectar y listo

----------------------------------------------------
Server.conf:

port 1194
proto udp
dev tun
#---- Seccion de llaves -----
ca keys/ca.crt
cert keys/server.crt
key keys/server.key
dh keys/dh1024.pem
#----------------------------
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
keepalive 10 120
comp-lzo
persist-key
persist-tun
status openvpn-status-servidorvpn-udp-1194.log
verb 8
push "dhcp-option DNS 10.8.0.1"
push "redirect-gateway def1 bypass-dhcp"
----------------------------------------------------


http://tipupdate.com/how-to-install-openvpn-on-centos-vps/

5 comentarios:

  1. Hola. Te consulto, el modulo tun lo cargas a nivel de Host ProxMox o nivel de cada contenedor? Muchas Gracias, Saludos.

    ResponderEliminar
  2. Buenas! Hay que cargarlo a nivel del host, para que el container lo coja, una vez cargado el módulo lo tendrás disponible para todos (lo mismo que para configurar el iptables).

    ResponderEliminar
  3. Una consulta, OpenVPN se instala sobre el Host Contenedor (osea sobre el server ProxMox) o sobre los CTs? (osea sobre cada máquina virtual)?

    Muchas Gracias.

    ResponderEliminar
  4. Buenas! El OpenVPN en sí, se instala y configura sobre el container (CT) (podrias instalarlo en el propio host proxmox, pero imagino que no es lo que quieres, que a fin de cuentas es una debian)

    ResponderEliminar
  5. Buen post. Actualmente estaba buscando información sobre proxmox y el acceso al servidor de manera externa sin comprometer su seguridad. Voy a intentar dejar solo el acceso a la vpn para ver si puedo acceder a el.
    Un saludo y muchas gracias.

    ResponderEliminar