터널은 올라오고 IKE는 정상으로 보이는데 그 안으로 아무것도 지나가지 않는다. 이것이 ASA에서 Azure로 가는 선택기 문제의 흔한 모습이며, 두 콘솔 중 어느 것도 만지기 전에 내가 계약을 쓰는 이유다. 계약은 네 가지다. 각 피어를 식별하는 객체, 연결 모델, 정확한 접두사 쌍, 그리고 각 쌍을 증명하는 검증이다. 여기서 틀리면 이후의 모든 명령은 마땅히 만들지 말았어야 할 구성을 디버깅하게 된다. 이 런북은 내가 쓰는 순서이며, 어떤 객체가 실제로 잘못됐는지 보여 주는 명령을 함께 둔다.

구성하기 전에 네 객체를 적어 둔다

ASA 릴리스와 플랫폼, 공용 엔드포인트, Azure VPN 게이트웨이 유형과 SKU, 그리고 우리 쪽을 나타내는 로컬 네트워크 게이트웨이에서 시작한다. 이 네 이름은 뒤따르는 모든 것의 어휘이며, 무언가 깨질 때 각기 다른 담당자가 있다.

그중 둘이 아직 추측이라면 멈춘다. 로컬 네트워크 게이트웨이의 잘못된 접두사 목록은 튜닝 문제가 아니다.

연결 모델을 하나 고르고 템플릿 섞기를 멈춘다

crypto map 설계와 tunnel interface 설계는 서로 다른 구성이며, 한쪽 템플릿은 피어 주소를 편집한다고 다른 쪽에 유효해지지 않는다. 무엇이든 붙여 넣기 전에 어느 쪽을 만드는지 기록한다. 불일치는 나중에 구성 오류가 아니라 선택기 문제로 드러나기 때문이다. Microsoft의 ASA 상호 운용성 가이드는 두 패턴을 모두 다루고 각각이 어떤 Azure 게이트웨이 모델을 전제하는지 밝힌다. 메모에 모델 이름이 없다면 아직 설계가 없다.

정책 기반 트래픽 선택기를 갖춘 경로 기반 Azure 게이트웨이는 특정하게 문서화된 옵션이지 기본값이 아니다. 설계가 그것에 의존한다면 설계가 그렇게 말해야 한다. 기본 경로 기반 선택기 모델은 Azure 쪽에서 다르게 동작하기 때문이다.

버전 제한도 계약에 들어간다. 암호화 도메인의 상한에 관한 오래된 현장 보고서는 특정 릴리스에 대한 데이터일 뿐, 모든 ASA의 영구 속성이 아니다.

집계가 아니라 접두사 쌍을 나열한다

행렬을 쓴다. 온프레미스 A와 B에서 Azure X와 Y로 가는 것은 네 쌍이며, 각각은 커버리지나 명시적 제외가 필요하다. A와 B를 하나의 집계로 합치면 그 사이에 있는 것까지 포함되며, 그렇게 설계는 조용히 구멍을 키운다.

저장한 것이 아니라 피어가 협상한 것을 확인한다. ASA의 로컬 및 원격 네트워크 목록은 의도이고, CHILD SA는 결과다.

쌍이 빠졌을 때 수정은 보통 access-list 한 줄이나 선택기 항목이지 새 터널이 아니다.

객체를 지목하는 명령으로 검증한다

ASA에서 IKE 세션을 확인하고, 다음으로 IPsec SA, 다음으로 선택기 쌍을 확인한다. 각 명령은 다른 질문에 답하며, 첫 번째만 실행하는 것이 «터널이 올라와 있다»를 거짓 결론으로 만든다. 목록에서 먼저 나오는 SA가 아니라 실제로 구성한 피어의 출력을 읽는다. Azure 쪽도 같은 세 질문에 자기 관점에서 답한다.

show crypto ikev2 sa detailed
show crypto ipsec sa peer 203.0.113.10
show run access-list AZURE-SELECTORS
packet-tracer input inside icmp 10.1.10.10 8 0 10.2.20.20 detailed

그다음 az network vpn-connection show --name <connection> --query connectionStatus로 Azure에 연결 상태를 묻는다. 데이터 경로에 바이트가 전혀 없는 «연결됨»은 라우팅이 아니라 선택기 문제다.

쌍마다 허용되는 흐름 하나를 시험하고, 반대편에서 보이는 출발지 주소를 확인하고, 거부되어야 할 자원 하나를 시험한다. 그 마지막 시험만이 경계가 여전히 존재함을 증명한다.

암호화 범위와 접근 권한을 분리한다

넓은 선택기는 권한이 아니다. 지원되는 배치가 애플리케이션 정책보다 넓다면 좁은 서비스는 방화벽 규칙에 남기고 암호화 범위는 있어야 할 곳에 둔다.

Azure 워크로드 경로와 온프레미스 반환 경로는 별도로 검토한다. BGP 광고, 정적 네트워크 범위, 사용자 정의 경로는 모두 같은 경로를 설명해야 하며, 어느 것도 피어 전송을 재귀적으로 포착해서는 안 된다.

롤백과 그것이 통했다는 증거

선택기를 바꾸기 전에 이전 실행 구성을 보관하고 그것을 되돌리는 명령 하나를 알아 둔다. ASA에서는 저장된 사본과 그에 맞는 복원 절차이지, 무엇을 편집했는지에 대한 기억이 아니다. 변경이 아직 가정인 동안 변경 티켓에 복원 명령을 적는다. 그런 다음 같은 세 가지 확인을 다시 실행한다. IKE 상태, IPsec SA 쌍, 쌍마다 허용되는 흐름 하나.

복원 후에도 쌍이 실패한다면 변경이 원인이 아니었던 것이며, 두 번째 장애를 막은 셈이다.

관련 글