OpenConnect: définition des itinéraires par défaut

13

J'essaie d'utiliser OpenConnect pour me connecter au VPN Cisco de mon entreprise (AnyConnect)

La connexion semble très bien fonctionner, ce que je ne comprends pas, c'est comment configurer le routage. Je fais cela depuis la ligne de commande.

J'utilise le script VPN par défaut pour me connecter comme ceci:

openconnect -u MyUserName --script path_to_vpnc_script myvpngateway.example.com

Je tape mon mot de passe et je suis bien connecté, mais mon itinéraire par défaut a changé pour forcer tout le trafic sur le lien VPN, alors que je veux juste le trafic de l'entreprise sur le lien VPN.

Y a-t-il des variables que je dois insérer dans le script vpnc? On ne sait pas très bien comment cela se fait.

Aditya K
la source

Réponses:

16

Cette réponse est la suivante:

Utilisez le script wrapper bash suivant pour appeler le script vpnc. Dans le script d'encapsuleur, les routes à utiliser pour la connexion VPN peuvent être spécifiées via une variable ROUTES.

#!/bin/bash
#

# Routes that we want to be used by the VPN link
ROUTES="162.73.0.0/16"

# Helpers to create dotted-quad netmask strings.
MASKS[1]="128.0.0.0"
MASKS[2]="192.0.0.0"
MASKS[3]="224.0.0.0"
MASKS[4]="240.0.0.0"
MASKS[5]="248.0.0.0"
MASKS[6]="252.0.0.0"
MASKS[7]="254.0.0.0"
MASKS[8]="255.0.0.0"
MASKS[9]="255.128.0.0"
MASKS[10]="255.192.0.0"
MASKS[11]="255.224.0.0"
MASKS[12]="255.240.0.0"
MASKS[13]="255.248.0.0"
MASKS[14]="255.252.0.0"
MASKS[15]="255.254.0.0"
MASKS[16]="255.255.0.0"
MASKS[17]="255.255.128.0"
MASKS[18]="255.255.192.0"
MASKS[19]="255.255.224.0"
MASKS[20]="255.255.240.0"
MASKS[21]="255.255.248.0"
MASKS[22]="255.255.252.0"
MASKS[23]="255.255.254.0"
MASKS[24]="255.255.255.0"
MASKS[25]="255.255.255.128"
MASKS[26]="255.255.255.192"
MASKS[27]="255.255.255.224"
MASKS[28]="255.255.255.240"
MASKS[29]="255.255.255.248"
MASKS[30]="255.255.255.252"
MASKS[31]="255.255.255.254"

export CISCO_SPLIT_INC=0

# Create environment variables that vpnc-script uses to configure network
function addroute()
{
    local ROUTE="$1"
    export CISCO_SPLIT_INC_${CISCO_SPLIT_INC}_ADDR=${ROUTE%%/*}
    export CISCO_SPLIT_INC_${CISCO_SPLIT_INC}_MASKLEN=${ROUTE##*/}
    export CISCO_SPLIT_INC_${CISCO_SPLIT_INC}_MASK=${MASKS[${ROUTE##*/}]}
    export CISCO_SPLIT_INC=$((${CISCO_SPLIT_INC}+1))
}

# Old function for generating NetworkManager 0.8 GConf keys 
function translateroute ()
{
    local IPADDR="${1%%/*}"
    local MASKLEN="${1##*/}"
    local OCTET1="$(echo $IPADDR | cut -f1 -d.)"
    local OCTET2="$(echo $IPADDR | cut -f2 -d.)"
    local OCTET3="$(echo $IPADDR | cut -f3 -d.)"
    local OCTET4="$(echo $IPADDR | cut -f4 -d.)"

    local NUMADDR=$(($OCTET1*16581375 + $OCTET2*65536 + $OCTET3*256 + $OCTET4))
    local NUMADDR=$(($OCTET4*16581375 + $OCTET3*65536 + $OCTET2*256 + $OCTET1))
    if [ "$ROUTESKEY" = "" ]; then
        ROUTESKEY="$NUMADDR,$MASKLEN,0,0"
    else
        ROUTESKEY="$ROUTESKEY,$NUMADDR,$MASKLEN,0,0"
    fi
}

if [ "$reason" = "make-nm-config" ]; then
    echo "Put the following into the [ipv4] section in your NetworkManager config:"
    echo "method=auto"
    COUNT=1
    for r in $ROUTES; do
        echo "routes${COUNT}=${r%%/*};${r##*/};0.0.0.0;0;"
        COUNT=$(($COUNT+1))
    done
    exit 0
fi

for r in $ROUTES; do
    addroute $r
done

exec /etc/openconnect/vpnc-script

Connectez-vous ensuite comme suit:

openconnect -u myusername --script wrapper-script -b vpngateway.example.com
Aditya K
la source
5
Pour tous ceux qui se demandent comment ils peuvent ajouter plusieurs préfixes / routes à la variable ROUTES, vous pouvez le faire en séparant chaque entrée avec un seul espace. Par exemple: ROUTES = "162.73.0.0/16 162.74.0.0/16"
Elliot B.
6
Sur Debian 8, Ubuntu 16.04 et 17.04 par défaut vpnc-script se trouve à /usr/share/vpnc-scripts/vpnc-script, donc sur ces OS, je devais changer la dernière chaîne de wrapper de manière appropriée. Merci pour votre solution!
Envek
Mon VPN de travail est 10.0.xx, donc j'ai configuré ROUTES = 10.0.0.0/16 et j'utilise ubuntu, donc j'ai défini l'exécutable sur / usr / share / vpnc-scripts / vpnc-script - mais je ne peux pas accéder à la monde extérieur. Des idées?
mmaceachran
Comment puis-je obtenir le contraire, c'est-à-dire exclure certaines routes du VPN?
HappyFace
1

Voici un script qui effectue le tunneling fractionné sur les réseaux IPv4 et IPv6 (basé sur le script fourni par Aditya K, qui permettait toujours que tout le trafic IPv6 soit routé vers le VPN). Notez également que le réglage des variables CISCO_SPLIT_INC _ $ {N} _MASK ne semble plus être nécessaire):

#!/bin/bash
#

# Routes that we want to be used by the VPN link
ROUTES="162.73.0.0/16"
ROUTES6="1ef2:23e:5a4::0/48"

export CISCO_SPLIT_INC=0

# Create environment variables that vpnc-script uses to configure network
function addroute()
{
    local ROUTE="$1"
    export CISCO_SPLIT_INC_${CISCO_SPLIT_INC}_ADDR=${ROUTE%%/*}
    export CISCO_SPLIT_INC_${CISCO_SPLIT_INC}_MASKLEN=${ROUTE##*/}
    export CISCO_SPLIT_INC=$((${CISCO_SPLIT_INC}+1))
}

export CISCO_IPV6_SPLIT_INC=0
# Do the same for IPv6
function addroute6()
{
    local ROUTE="$1"
    local NET="${ROUTE%%/*}"
    local MASKLEN="${ROUTE##*/}"
    export CISCO_IPV6_SPLIT_INC_${CISCO_IPV6_SPLIT_INC}_ADDR=$NET
    export CISCO_IPV6_SPLIT_INC_${CISCO_IPV6_SPLIT_INC}_MASKLEN=$MASKLEN
    export CISCO_IPV6_SPLIT_INC=$((${CISCO_IPV6_SPLIT_INC}+1))
}

# Old function for generating NetworkManager 0.8 GConf keys 
function translateroute ()
{
    local IPADDR="${1%%/*}"
    local MASKLEN="${1##*/}"
    local OCTET1="$(echo $IPADDR | cut -f1 -d.)"
    local OCTET2="$(echo $IPADDR | cut -f2 -d.)"
    local OCTET3="$(echo $IPADDR | cut -f3 -d.)"
    local OCTET4="$(echo $IPADDR | cut -f4 -d.)"

    local NUMADDR=$(($OCTET1*16581375 + $OCTET2*65536 + $OCTET3*256 + $OCTET4))
    local NUMADDR=$(($OCTET4*16581375 + $OCTET3*65536 + $OCTET2*256 + $OCTET1))
    if [ "$ROUTESKEY" = "" ]; then
        ROUTESKEY="$NUMADDR,$MASKLEN,0,0"
    else
        ROUTESKEY="$ROUTESKEY,$NUMADDR,$MASKLEN,0,0"
    fi
}

if [ "$reason" = "make-nm-config" ]; then
    echo "Put the following into the [ipv4] section in your NetworkManager config:"
    echo "method=auto"
    COUNT=1
    for r in $ROUTES; do
        echo "routes${COUNT}=${r%%/*};${r##*/};0.0.0.0;0;"
        COUNT=$(($COUNT+1))
    done
    exit 0
fi

for r in $ROUTES; do
    addroute $r
done

for r in $ROUTES6; do
    addroute6 $r
done

exec /etc/openconnect/vpnc-script
atrus
la source
1

J'ai trouvé que la meilleure façon de réaliser un tunneling divisé est d'utiliser vpn-slice . Vous pouvez essentiellement dire quelles routes vous voulez et ce sera votre script vpn qui fera le routage, au lieu de ce que la configuration du serveur fournit:

openconnect --script 'vpn-slice 10.0.0.0/16' -b vpngateway.example.com

Bien que par défaut, il ne remplace pas votre serveur DNS par celui fourni par le serveur, vous devez plutôt répertorier manuellement tous les domaines et il les résoudrait et les ajouterait à votre fichier d'hôtes:

openconnect --script 'vpn-slice 10.0.0.0/16 host1' -b vpngateway.example.com
Farid Nouri Neshat
la source