Configurar un bridge en servidor OpenVPN

Hace poco con un compañero de trabajo, hicimos una configuración VPN sencilla levantando una interfaz bridge en donde teníamos un esquema de red parecido al siguiente:

Usando Debian como sistema operativo para el servidor de VPN, se instalaron las siguientes aplicaciones:

aptitude install openvpn bridge-utils

De la aplicación de OpenVPN que se instala desde los repositorios de Debian, se proveen algunos archivos de configuración y ejemplos que fácilmente se pueden conseguir y usar desde:

ls -l /usr/share/doc/openvpn/examples/

Usamos el archivo de configuración para el servidor server.conf y se copió de la siguiente manera:

zcat /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz > /etc/openvpn/server.conf

Luego se editó, en donde escogimos como DNS principal el de Google, secundario el del router de la red LAN, igualmente se dejó un rango de direcciones IP fuera del rango dinámico que tiene configurado el router, finalmente quedó con los siguientes parámetros:

port 1194
proto tcp
dev tap0

ca ca.crt
cert server.crt
key server.key
dh dh1024.pem

server-bridge 192.168.0.20 255.255.255.0 192.168.0.21 192.168.0.30
push "route 192.168.0.0 255.255.255.0 192.168.0.1"
push "route-gateway 192.168.0.1"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 192.168.0.1"

keepalive 10 120
comp-lzo
user nobody
group nogroup
persist-key
persist-tun
status /var/log/openvpn-status.log
log /var/log/openvpn.log
verb 3

Entre los ejemplos, están dos script para manipulación del bridge:

  • bridge-start; para levantar la interfaz br#
  • bridge-stop; para bajar la interfaz br#

Estos archivos los copiamos en la ruta absoluta de script para las interfaces de red:

cd /usr/share/doc/openvpn/examples/sample-scripts/
cp bridge-start /etc/network/if-up.d/.
cp bridge-stop /etc/network/if-down.d/.

Se le dan permisos de ejecución a ambos archivos:

chmod 755 /etc/network/if-up.d/bridge-start
chmod 755 /etc/network/if-down.d/bridge-stop

El archivo bridge-start se modificó y quedó una configuración similar a la siguiente:

#!/bin/bash

#################################
# Set up Ethernet bridge on Linux
# Requires: bridge-utils
#################################

# Define Bridge Interface
br="br0"

# Define list of TAP interfaces to be bridged,
# for example tap="tap0 tap1 tap2".
tap="tap0"

# Define physical ethernet interface to be bridged
# with TAP interface(s) above.
eth="eth0"
eth_ip="192.168.0.20"
eth_netmask="255.255.255.0"
eth_broadcast="192.168.0.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 -net 0.0.0.0 gw 192.168.0.1 netmask 0.0.0.0

Igualmente se puede usar el firewall.sh que viene de ejemplo desde:

cd /usr/share/doc/openvpn/examples/sample-config-files/
cp firewall.sh /etc/network/if-up.d/openvpn-fw
chmod 755 /etc/network/if-up.d/openvpn-fw

En el archivo /etc/network/if-up.d/openvpn-fw se cambian las variables que se requieren de acuerdo a los parámetros y necesidades en la red. El archivo quedó parecido al siguiente:

#!/bin/bash

# Red priviada de LAN
PRIVADA="192.168.0.0/24"
# Direccion IP local
LOOP="127.0.0.1"

# Crea un firewall restrictivo
iptables -P OUTPUT DROP
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -F
# Configuracion de politicas
iptables -P OUTPUT ACCEPT
iptables -P INPUT DROP
iptables -P FORWARD DROP

# consulta de IP local en servidor y servicios locales
iptables -A INPUT -i eth0 -s $LOOP -j DROP
iptables -A FORWARD -i eth0 -s $LOOP -j DROP
iptables -A INPUT -i eth0 -d $LOOP -j DROP
iptables -A FORWARD -i eth0 -d $LOOP -j DROP

# Chequear que la IP de entrada de Internet sean reales
iptables -A FORWARD -i eth0 -s 192.168.0.0/16 -j DROP
iptables -A FORWARD -i eth0 -s 172.16.0.0/12 -j DROP
iptables -A FORWARD -i eth0 -s 10.0.0.0/8 -j DROP
iptables -A INPUT -i eth0 -s 192.168.0.0/16 -j DROP
iptables -A INPUT -i eth0 -s 172.16.0.0/12 -j DROP
iptables -A INPUT -i eth0 -s 10.0.0.0/8 -j DROP

# Prohibir salidas de consultas NetBios de red privada a Internet
iptables -A FORWARD -p tcp --sport 137:139 -o eth0 -j DROP
iptables -A FORWARD -p udp --sport 137:139 -o eth0 -j DROP
iptables -A OUTPUT -p tcp --sport 137:139 -o eth0 -j DROP
iptables -A OUTPUT -p udp --sport 137:139 -o eth0 -j DROP

# Chequea paquetes hacia Internet 
iptables -A FORWARD ! -s $PRIVADA -i eth0 -j DROP

# Allow local loopback
iptables -A INPUT -s $LOOP -j ACCEPT
iptables -A INPUT -d $LOOP -j ACCEPT

# Permitir respuestas de ping
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

# Permitir conexiones HTTP y SSH
iptables -A INPUT -p tcp --dport http -j ACCEPT
iptables -A INPUT -p tcp --dport ssh -j ACCEPT

# Permitir consulta externa mediante puerto 1194 de OpenVPN
iptables -A INPUT -p udp --dport 1194 -j ACCEPT

# Permitir transferencia de paquetes a traves de interfaz Tun o Tap
iptables -A INPUT -i tun+ -j ACCEPT
iptables -A FORWARD -i tun+ -j ACCEPT
iptables -A INPUT -i tap+ -j ACCEPT
iptables -A FORWARD -i tap+ -j ACCEPT

# Este no es necesario porque no hay otra interfaz de red para forward
iptables -A INPUT -i br0 -j ACCEPT
iptables -A FORWARD -i br0 -j ACCEPT

# Mantener la conexion establecida a traves del tunel de conexion
iptables -A OUTPUT -m state --state NEW -o br0 -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state --state NEW -o br0 -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

# Masquerade local subnet
iptables -t nat -A POSTROUTING -s $PRIVADA -o br0 -j MASQUERADE

Igualmente se descomentó el bit o la variable net.ipv4.ip_forward y se le dio valor 1 en el archivo /etc/sysctl.conf, y se cargó:

sysctl -p

Finalmente se reinician los servicios de red y OpenVPN. Se deben considerar las rutas de la red que toma el servidor VPN por defecto, es por eso que se le añadió la última línea al archivo bridge-start en los parámetros de configuración por defecto.

Advertisements
This entry was posted in VPN. Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s