OpenConnect: configuración de rutas predeterminadas

13

Estoy tratando de usar OpenConnect para conectarme a Cisco VPN de mi empresa (AnyConnect)

La conexión parece funcionar bien, lo que no entiendo es cómo configurar el enrutamiento. Estoy haciendo esto desde la línea de comando.

Utilizo el script VPN predeterminado para conectarme así:

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

Escribo mi contraseña y estoy bien conectado, pero mi ruta predeterminada ha cambiado para forzar todo el tráfico por el enlace VPN, mientras que solo quiero que el tráfico de la empresa baje por el enlace VPN.

¿Hay algunas variables que necesito poner en el script vpnc? No está muy claro cómo se hace esto.

Aditya K
fuente

Respuestas:

16

Esta respuesta es la siguiente:

Use el siguiente script de bash wrapper para llamar al script vpnc. En el script de envoltura, las rutas que se utilizarán para la conexión VPN se pueden especificar a través de una variable RUTAS.

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

Luego, conéctese de la siguiente manera:

openconnect -u myusername --script wrapper-script -b vpngateway.example.com
Aditya K
fuente
55
Para cualquiera que se pregunte cómo pueden agregar múltiples prefijos / rutas a la variable RUTAS, puede hacerlo separando cada entrada con un solo espacio. Por ejemplo: RUTAS = "162.73.0.0/16 162.74.0.0/16"
Elliot B.
66
En Debian 8, Ubuntu 16.04 y 17.04 por defecto vpnc-script se encuentra en /usr/share/vpnc-scripts/vpnc-script, por lo que en estos SO tuve que cambiar la última cadena de envoltura de manera adecuada. ¡Gracias por tu solución!
Envek
Mi VPN de trabajo es 10.0.xx, así que configuré RUTAS = 10.0.0.0/16 y estoy usando ubuntu, así que configuré el exec en / usr / share / vpnc-scripts / vpnc-script, pero no puedo acceder a mundo exterior. ¿Algunas ideas?
mmaceachran
¿Cómo puedo lograr lo contrario, es decir, excluir algunas rutas de la VPN?
HappyFace
1

Aquí hay un script que realiza túneles divididos en redes IPv4 e IPv6 (basado en el script que Aditya K proporcionó, que aún permitió que todo el tráfico IPv6 se enrutara a la VPN). Tenga en cuenta también que la configuración de las variables CISCO_SPLIT_INC _ $ {N} _MASK ya no parece ser necesaria):

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

Descubrí que la mejor manera de lograr un túnel dividido es usar vpn-slice . Básicamente, puede saber qué rutas desea y será su script vpn el que realice el enrutamiento, en lugar de la configuración que proporciona el servidor:

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

Aunque, de forma predeterminada, no reemplaza su servidor dns con el proporcionado por el servidor, sino que debe enumerar manualmente todos los dominios y los resolverá y los agregará a su archivo de hosts:

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