GNU/Linux >> Tutoriales Linux >  >> Linux

¿Conectarse a un servidor VPN de terceros pero no usarlo como ruta predeterminada?

Aquí hay una solución completa que usa grupos de control (cgroups), que permite el control de recursos por proceso. Un grupo de control de red permite aislar la ruta VPN, permite fácilmente que cualquier proceso y sus hijos se ejecuten selectivamente dentro de él, permite que los usuarios que no sean root tengan acceso a los procesos en ejecución dentro del cgroup, y el uso de una segunda instancia de dnsmasq puede aislar el DNS consultas también. Esto supone que tiene instalado openvpn, dnsmasq, cgroup y la versión 1.6+ de iptables con soporte para cgroup. Todo esto se hizo en Debian Jessie

El primer paso es crear el cgroup y configurar las iptables en consecuencia. Esto debe hacerse en cada reinicio, por lo que coloco lo siguiente en /etc/rc.local

# enable ip forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward

# create cgroup for 3rd party VPN (can change 'vpn' to your name of choice)
mkdir -p /sys/fs/cgroup/net_cls/vpn

# give it an arbitrary id 
echo 11 > /sys/fs/cgroup/net_cls/vpn/net_cls.classid

# grant a non-root user access (change user:group accordingly)
cgcreate -t user:group -a user:group -g net_cls:vpn

# mangle packets in cgroup with a mark
iptables -t mangle -A OUTPUT -m cgroup --cgroup 11 -j MARK --set-mark 11

# NAT packets in cgroup through VPN tun interface
iptables -t nat -A POSTROUTING -m cgroup --cgroup 11 -o tun0 -j MASQUERADE

# redirect DNS queries to port of second instance, more on this later
iptables -t nat -A OUTPUT -m cgroup --cgroup 11 -p tcp --dport 53 -j REDIRECT --to-ports 5354
iptables -t nat -A OUTPUT -m cgroup --cgroup 11 -p udp --dport 53 -j REDIRECT --to-ports 5354

# create separate routing table
ip rule add fwmark 11 table vpn

# add fallback route that blocks traffic, should the VPN go down
ip route add blackhole default metric 2 table vpn

# disable reverse path filtering for all interfaces
for i in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 0 > $i; done

El siguiente paso es editar el archivo de configuración del cliente de su VPN de terceros, p. /etc/openvpn/client.conf . Deje el resto de su configuración sin cambios.

# redirect-gateway def1  <--- comment or remove the redirect-gateway line if it exists

# disable automatically configuring routes and run our own routeup.sh script instead
route-noexec
route-up /etc/openvpn/routeup.sh

# run our own update-dnsmasq-conf script on interface up/down; comment out existing up/down lines
up /etc/openvpn/update-dnsmasq-conf
down /etc/openvpn/update-dnsmasq-conf

Ahora necesitamos crear el /etc/openvpn/routeup.sh guión

#!/bin/bash
# add default route through vpn gateway to our separate routing table
/sbin/ip route add default via $route_vpn_gateway dev $dev metric 1 table vpn
exit 0

Y ahora necesitamos crear una versión modificada de update-resolv-conf, que generalmente viene instalada en /etc/openvpn, para crear la segunda instancia de dnsmasq. Lo llamo /etc/openvpn/update-dnsmasq-conf

#!/bin/bash

[ "$script_type" ] || exit 0

split_into_parts()
{
    part1="$1"
    part2="$2"
    part3="$3"
}

case "$script_type" in
  up)
    NMSRVRS=""
    for optionvarname in ${!foreign_option_*} ; do
        option="${!optionvarname}"
        split_into_parts $option
        if [ "$part1" = "dhcp-option" ] ; then
            if [ "$part2" = "DNS" ] ; then
                NMSRVRS="${NMSRVRS:+$NMSRVRS }--server $part3"
            fi
        fi
    done
    dnsmasq $NMSRVRS --no-hosts --no-resolv --listen-address=127.0.0.1 \
        --port=5354 --bind-interfaces --no-dhcp-interface=* \
        --pid-file=/var/run/dnsmasq/dnsmasq2.pid
    ;;
  down)
    kill -9 $(cat /var/run/dnsmasq/dnsmasq2.pid)
    ;;
esac

Y eso debería ser todo. Ahora puede iniciar su conexión vpn y ejecutar procesos de forma selectiva a través de esa interfaz (la opción --sticky garantiza que los procesos secundarios se ejecuten en el mismo cgroup).

cgexec -g net_cls:vpn --sticky chromium &

NOTA:Para dnsmasq, asegúrese de que /etc/resolv.conf apunte al host local (servidor de nombres 127.0.0.1). Su instancia principal de dnsmasq procesará consultas en su ruta normal que no sea VPN y usará (/var/run/dnsmasq/resolv.conf), que generalmente consiste en su puerta de enlace predeterminada o algún DNS público (por ejemplo, Google 8.8.8.8). La segunda instancia solo la usa el cgroup aislado


Linux
  1. ¿Qué comando uso para ver cuál es la huella digital de la clave ECDSA de mi servidor?

  2. ¿Cómo puedo usar grep para hacer coincidir pero sin imprimir las coincidencias?

  3. OpenConnect no puede conectarse al servidor VPN:actualiza wait.html para siempre

  4. BCRYPT:¿por qué las distribuciones de Linux no lo usan de forma predeterminada?

  5. ¿Usa el kernel 3.x de Linux el programador de procesos CFS?

Error del servidor FTP de RHEL7:ftp:conectar:​​No hay solución de ruta a host

¿Qué es el comando SSH y cómo usar SSH para conectarse a un servidor remoto?

Cómo usar SSH para conectarse a un servidor remoto

Conectarse a un servidor en la nube

Cómo usar SSH para conectarse a un servidor remoto en Linux o Windows

Tar un directorio, pero no almacene rutas absolutas completas en el archivo