OpenConnect : 기본 경로 설정


13

OpenConnect를 사용하여 회사의 Cisco VPN (AnyConnect)에 연결하려고합니다.

연결이 제대로 작동하는 것 같습니다. 이해하지 못하는 것은 라우팅을 설정하는 방법입니다. 커맨드 라인 에서이 작업을 수행하고 있습니다.

기본 VPN 스크립트를 사용하여 다음과 같이 연결합니다.

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

암호를 입력했는데 제대로 연결되었지만 기본 경로가 변경되어 VPN 링크를 통해 모든 트래픽이 강제 전송되는 반면, 회사 트래픽은 VPN 링크로 다운되기를 원합니다.

vpnc-script에 넣어야 할 변수가 있습니까? 이것이 어떻게 수행되는지는 명확하지 않습니다.

답변:


16

이 답변은 다음과 같습니다.

다음 bash 래퍼 스크립트를 사용하여 vpnc-script를 호출하십시오. 랩퍼 스크립트에서 VPN 연결에 사용될 경로는 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

그런 다음 다음과 같이 연결하십시오.

openconnect -u myusername --script wrapper-script -b vpngateway.example.com

5
ROUTES 변수에 여러 접두사 / 라우트를 추가하는 방법을 궁금해하는 사람은 각 항목을 단일 공백으로 분리하여 수행 할 수 있습니다. 예를 들어 ROUTES = "162.73.0.0/16 162.74.0.0/16"
엘리엇 B.

6
데비안 8, Ubuntu 16.04 및 17.04의 기본 vpnc-script는에 있으므로이 /usr/share/vpnc-scripts/vpnc-scriptOS에서는 래퍼의 마지막 문자열을 적절하게 변경해야했습니다. 솔루션 주셔서 감사합니다!
Envek

내 작업 VPN은 10.0.xx이므로 ROUTES = 10.0.0.0/16을 설정하고 우분투를 사용하고 있으므로 exec를 / usr / share / vpnc-scripts / vpnc-script로 설정했지만 외부 세계. 어떤 아이디어?
mmaceachran

VPN에서 일부 경로를 제외하여 어떻게 반대를 달성 할 수 있습니까?
HappyFace

2

다음은 IPv4 및 IPv6 네트워크 모두에서 분할 터널링을 수행하는 스크립트입니다 (Aditya K가 제공 한 스크립트를 기반으로 모든 IPv6 트래픽이 VPN으로 라우팅되도록 허용 함). 또한 CISCO_SPLIT_INC _ $ {N} _MASK 변수 설정이 더 이상 필요하지 않은 것으로 나타납니다.

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

1

분할 터널링을 달성하는 가장 좋은 방법은 vpn-slice 를 사용하는 것 입니다. 기본적으로 원하는 경로를 알 수 있으며 서버가 제공하는 구성 대신 라우팅을 수행하는 VPN 스크립트가됩니다.

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

기본적으로 dns 서버를 서버에서 제공하는 서버로 재정의하지는 않지만 모든 도메인을 수동으로 나열해야하며이를 해결하여 호스트 파일에 추가해야합니다.

openconnect --script 'vpn-slice 10.0.0.0/16 host1' -b vpngateway.example.com
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.