클라이언트의 기업 네트워크에 연결하기 위해 Cisco AnyConnect Secure Mobility Client를 사용하고 있는데 잘 작동하지만 분할 터널링을 사용할 수 없는 것 같습니다(앱의 통계 탭에 따르면 VPN 자체가 터널 모드(IPv4): 분할 포함이 있습니다. 이는 제가 이해한 바에 따르면 가능하다는 의미입니다. (예, 분할 터널링이 위험할 수 있는 이유를 이해합니다. 하지만 VPN의 잠금이 내 작업을 방해하고 있으며 내 고객의 IT 부서는 계약자에게 예외를 두는 데 관심이 없습니다. 그리고 제가 말했듯이 구성은것 같다허락해 주세요.)
분할 터널링이 작동하도록 하는 방법을 찾으려고 대신 OpenConnect를 설치했는데 연결이 잘 되었습니다. 내 자격 증명을 받아들이고 로그에 회사의 "배너" 메시지가 표시되며 작동합니다. 하지만 VPN을 통해서만 액세스할 수 있는 대상은 작동하지 않습니다.
문제는 경로에 있는 것 같습니다. AnyConnect와 OpenConnect는 모두 특정 네트워크 대상(동일한 대상)에 여러 경로를 추가하지만 게이트웨이 및 인터페이스에 대한 값은 다릅니다. 예를 들어,
AnyConnect
===========================================================================
Interface List
14...00 05 9a 3c 7a 00 ......Cisco AnyConnect Secure Mobility Client Virtual Miniport Adapter for Windows x64
[...]
===========================================================================
IPv4 Route Table
===========================================================================
Active Routes:
Network Destination Netmask Gateway Interface Metric
0.0.0.0 0.0.0.0 192.168.1.1 192.168.1.151 35
[...]
a.b.c.x 255.255.255.255 On-link a.b.c.d 2
a.b.c.y 255.255.255.255 On-link a.b.c.d 2
a.b.c.z 255.255.255.255 On-link a.b.c.d 2
[...]
192.168.1.1 255.255.255.255 On-link 192.168.1.151 36
[...]
224.0.0.0 240.0.0.0 On-link a.b.c.d 10000
[...]
255.255.255.255 255.255.255.255 On-link a.b.c.d 10000
오픈커넥트
Interface List
[...]
63...00 ff 8d 2a 8a 57 ......TAP-Windows Adapter V9
[...]
===========================================================================
IPv4 Route Table
===========================================================================
Active Routes:
Network Destination Netmask Gateway Interface Metric
0.0.0.0 0.0.0.0 192.168.1.1 192.168.1.151 36
[...]
a.b.c.x 255.255.255.255 a.b.c.(d+1) 192.168.1.151 36
a.b.c.y 255.255.255.255 a.b.c.(d+1) 192.168.1.151 36
a.b.c.z 255.255.255.255 a.b.c.(d+1) 192.168.1.151 36
[...]
224.0.0.0 240.0.0.0 On-link a.b.c.d 291
[...]
255.255.255.255 255.255.255.255 On-link a.b.c.d 291
경로 외에도 0.0.0.0
이러한 모든 경로는 VPN에 연결하여 추가됩니다. 의 경우 0.0.0.0
OpenConnect는 경로에 대한 지표를 0.0.0.0
36으로 변경합니다(AnyConnect 테이블에 표시된 값도 완전히 연결이 끊어졌을 때와 동일함). (기록을 위해 AnyConnect는 OpenConnect가 그대로 두는 여러 IPv6 경로도 제거합니다. 이것이 중요하지 않다고 생각합니까?)
추가 사항을 명시적으로 대조하기 위해 AnyConnect는 게이트웨이에 "온링크"를 사용하는 반면 OpenConnect는 AnyConnect가 인터페이스에 사용하는 것과 거의 동일한 IP 주소를 사용합니다. 인터페이스의 경우 OpenConnect는 개인 IP 주소를 사용합니다. AnyConnect의 인터페이스와 OpenConnect의 게이트웨이에 사용되는 IP 주소는 클라이언트가 소유한 범위에 속합니다.
측정항목도 다릅니다. AnyConnect는 내 0.0.0.0
경로보다 우선순위가 높은 2를 사용하고(연결이 끊어졌거나 AnyConnect를 통해 연결된 경우 35로 설정됨), OpenConnect는 36을 사용하고 0.0.0.0
경로도 36을 사용하도록 변경하므로 우선순위는 동일합니다( 내 시스템의 다른 모든 경로는 기록을 위해 36보다 높은 측정항목을 사용합니다.
AnyConnect는 또한 OpenConnect가 인터페이스에 사용하는 경로를 추가합니다 192.168.1.1
. 192.168.1.151
이것이 하나는 있고 다른 하나는 부족한 유일한 경로입니다.
224.0.0.0
둘 다 및 에 대한 경로도 추가 255.255.255.255
하지만 AnyConnect는 메트릭 10000(다른 경로보다 높음)을 사용하고 OpenConnect는 291(다른 추가 경로보다 높지만 연결하기 전에 사용했던 다른 기존 경로보다 낮음)을 사용합니다. 흥미롭게도 OpenConnect는 다른 모든 경로에 대해 서로 다른 값을 사용함에도 불구하고 이러한 두 경로에 대해 AnyConnect와 동일한 게이트웨이 및 인터페이스를 사용합니다.
이것은 Windows 10 Pro x64 시스템에 있습니다. Cisco AnyConnect는 버전 4.5.03040입니다. OpenConnect GUI는 "버전1.5.3(32비트) [...] OpenConnect v7.08을 기반으로 합니다.”
저는 라우팅이나 VPN에 대해 잘 모릅니다. 이 정도의 정보를 얻으려면 많은 검색과 읽기가 필요했습니다. 저는 이 일을 시작하기 전에는 '분할 터널링'이라는 용어도 몰랐습니다. 많은 정보도 오래된 것입니다. Windows 10은 여기와 다른 곳에서 AnyConnect에서 분할 터널링을 권장하는 다른 답변이 많기 때문에 선택을 취소할 수 있는 "원격 네트워크에서 기본 게이트웨이 사용" 옵션을 제공하지 않습니다. 제가 제공할 수 있는 다른 관련 세부정보가 있는지는 모르겠지만, 다른 정보가 필요하다면 기꺼이 드리겠습니다. 분명히 클라이언트의 IP 주소를 마스킹하려고 노력했지만 여기에서는 특정 주소가 크게 중요하지 않다고 생각합니다. (또한 마스킹할 이유가 있는지는 모르겠지만 공유할 정보는 아닙니다. 난 아니다).
답변1
KRyan의 답변을 바탕으로 openconnect 스크립트(openconnect gui 폴더의 vpnc-script.js!)를 다음과 같이 수정했으며 비슷한 상황에서 도움이 되었습니다.
for (var i = 0 ; i < parseInt(env("CISCO_SPLIT_INC")); i++) {
var network = env("CISCO_SPLIT_INC_" + i + "_ADDR");
var netmask = env("CISCO_SPLIT_INC_" + i + "_MASK");
var netmasklen = env("CISCO_SPLIT_INC_" + i + "_MASKLEN");
exec("route add " + network + " mask " + netmask);
}
=>
for (var i = 0 ; i < parseInt(env("CISCO_SPLIT_INC")); i++) {
var network = env("CISCO_SPLIT_INC_" + i + "_ADDR");
var netmask = env("CISCO_SPLIT_INC_" + i + "_MASK");
var netmasklen = env("CISCO_SPLIT_INC_" + i + "_MASKLEN");
exec("route add " + network + " mask " + netmask + " " + internal_gw+" metric 2 if "+env("TUNIDX"));
}
(175행)
내 생각에 버그는 다음과 같습니다.
// Calculate the first usable address in subnet
var internal_gw_array = new Array(
address_array[0] & netmask_array[0],
address_array[1] & netmask_array[1],
address_array[2] & netmask_array[2],
(address_array[3] & netmask_array[3]) + 1
);
var internal_gw = internal_gw_array.join(".");
에 의해 전달된 내부 IP에 대한 넷마스크 255.255.255.255를 사용하면 var netmask_array = env("INTERNAL_IP4_NETMASK").split(".");
이 게이트웨이 트릭(결국 경로가 인터페이스로 이동하며 여기서 게이트웨이 IP는 의미가 없음)이 실패하는 것 같습니다.
답변2
경로가 문제였다는 것이 옳았습니다. 제대로 작동하려면 많은 시행착오가 필요했지만 결국 연결 후 수동으로 경로를 업데이트했습니다.
이상하게도 route CHANGE
작동하지 않았습니다. route ADD
연결한 후에 이러한 경로가 이미 존재했음을 알 수 있지만 을 사용해야 했습니다 . 동일한 대상, 마스크 및 게이트웨이를 사용한 다음 METRIC 2 IF 17
("TAP-Windows 어댑터 V9" 인터페이스는 17을 사용했기 때문에 다시 시작할 때마다 변경될 것이라고 생각합니까? 연결을 끊었다가 다시 연결하면 현재로서는 일관되게 17을 사용하는 것 같습니다. 63을 사용하고 있던 질문에서 볼 수 있습니다). 이 작업을 수행한 후 해당 대상에 대해 두 개의 항목(OpenConnect에서 추가한 항목과 내가 추가한 항목)이 나열되었으며 route PRINT
이를 통해 연결할 수 있었습니다.
하지만 제가 정말 이상하다고 생각하는 점은 새로 추가한 경로의 Metric이 37이라는 것입니다. 명령에 입력한 2가 아니라 route ADD
기존 항목의 36보다 큽니다. 하지만 어쨌든 작동합니다.
운 좋게도 우리 프로젝트는 hosts
파일을 유지 관리하므로(개발자가 작업을 시작할 때 자신의 파일에 복사하고 hosts
빌드 도구가 이를 확인하도록 함) 경로를 조정하기 위한 배치 스크립트를 작성할 수 있었습니다. 이 작업을 수행하려는 다른 사람을 위해 내 배치 스크립트는 다음과 같습니다.
FOR /F "tokens=1" %%i IN (\path\to\our\development\hosts) DO (
route ADD %%i MASK 255.255.255.255 a.b.c.d METRIC 2 IF 17
)
파일 hosts
형식은 시스템 파일의 형식과 동일합니다: a.b.c.d URL
. 이 스크립트는 주석을 지원하지 않으며(단순히 실패할 것이라고 생각하지만 route ADD
) 빈 줄이 문제가 될지 여부는 알 수 없습니다(하지만 다시 말하지만 아마도 failed 일 것입니다 route ADD
).
나는 그것이 일정하지 않을 것이라고 생각하기 때문에 아마도 17에 맞게 조정해야 할 것입니다. 그런 일이 발생하면 그것이 무엇인지 확인하고 대신 변수를 사용하는 방법을 살펴보겠습니다. (그리고 이 답변도 업데이트하겠습니다.)
답변3
작동하는 것을 아직 파악하지 못한 것은 아니지만 경로 메트릭이 사용되는 방식을 오해하는 것 같습니다.그들은 실제로 매우 특정한 상황에서 결정적인 역할을 할 뿐입니다.. 연결된 답변을 인용하면 다음과 같습니다.
창에서 경로 선택에는 다음이 포함됩니다.
- 목적지까지의 가장 구체적인 경로 찾기
- 가장 낮은 메트릭을 사용하여 가장 구체적인 경로를 선택합니다.
그리고 스크립트를 덜 취약하게 만들고 싶다면 다음과 같이 할 수 있습니다.프로그래밍 방식으로 인터페이스 번호 결정.