OpenConnect를 사용하여 회사의 Cisco VPN (AnyConnect)에 연결하려고합니다.
연결이 제대로 작동하는 것 같습니다. 이해하지 못하는 것은 라우팅을 설정하는 방법입니다. 커맨드 라인 에서이 작업을 수행하고 있습니다.
기본 VPN 스크립트를 사용하여 다음과 같이 연결합니다.
openconnect -u MyUserName --script path_to_vpnc_script myvpngateway.example.com
암호를 입력했는데 제대로 연결되었지만 기본 경로가 변경되어 VPN 링크를 통해 모든 트래픽이 강제 전송되는 반면, 회사 트래픽은 VPN 링크로 다운되기를 원합니다.
vpnc-script에 넣어야 할 변수가 있습니까? 이것이 어떻게 수행되는지는 명확하지 않습니다.
답변
이 답변은 다음과 같습니다.
다음 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
답변
다음은 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
답변
분할 터널링을 달성하는 가장 좋은 방법은 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