GNU/Linux >> Tutoriels Linux >  >> Linux

vous connecter à un serveur VPN tiers mais ne l'utilisez pas comme route par défaut ?

Voici une solution complète utilisant des groupes de contrôle (cgroups), qui permet le contrôle des ressources par processus. Un groupe de contrôle réseau permet d'isoler la route VPN, permet facilement à n'importe quel processus et à ses enfants d'être exécutés de manière sélective à l'intérieur de celui-ci, permet aux utilisateurs non root d'avoir accès aux processus en cours d'exécution au sein du groupe de contrôle et l'utilisation d'une deuxième instance de dnsmasq peut isoler DNS des requêtes également. Cela suppose que vous avez openvpn, dnsmasq, cgroup et la version 1.6+ d'iptables avec le support de cgroup installé. Tout a été fait sur Debian Jessie

La première étape consiste à créer le groupe de contrôle et à configurer les iptables en conséquence. Cela devrait être fait à chaque redémarrage, donc je place ce qui suit dans /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

L'étape suivante consiste à modifier le fichier de configuration client de votre VPN tiers, par ex. /etc/openvpn/client.conf . Laissez le reste de votre configuration inchangé.

# 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

Nous devons maintenant créer le fichier /etc/openvpn/routeup.sh script

#!/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

Et nous devons maintenant créer une version modifiée de update-resolv-conf, qui est généralement installée dans /etc/openvpn, pour créer la deuxième instance de dnsmasq. Je l'appelle /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

Et ça devrait être ça. Vous pouvez maintenant démarrer votre connexion VPN et exécuter des processus de manière sélective via cette interface (l'option --sticky garantit que les processus enfants sont exécutés dans le même groupe de contrôle).

cgexec -g net_cls:vpn --sticky chromium &

REMARQUE :Pour dnsmasq, assurez-vous que /etc/resolv.conf pointe vers l'hôte local (serveur de noms 127.0.0.1). Votre instance principale de dnsmasq traitera les requêtes sur votre route non VPN normale et utilisera (/var/run/dnsmasq/resolv.conf) qui se compose généralement de votre passerelle par défaut ou de certains DNS publics (par exemple Google 8.8.8.8). La seconde instance n'est utilisée que par le cgroup isolé


Linux
  1. Debian – Se connecter à Internet sur un serveur connecté Vpn sans Internet ?

  2. Quelle commande dois-je utiliser pour voir quelle est l'empreinte digitale de la clé ECDSA de mon serveur ?

  3. OpenConnect ne peut pas se connecter au serveur VPN :rafraîchit définitivement wait.html

  4. Le noyau Linux 3.x utilise-t-il le planificateur de processus CFS ?

  5. Comment définir la passerelle par défaut

Erreur de serveur FTP RHEL7 :ftp :connexion :aucune route vers la solution hôte

Qu'est-ce que la commande SSH et comment utiliser SSH pour se connecter à un serveur distant

Comment utiliser SSH pour se connecter à un serveur distant

Connectez-vous à un serveur cloud

Comment définir la passerelle par défaut sur Ubuntu

Comment utiliser SSH pour se connecter à un serveur distant sous Linux ou Windows