터널이 연결된 뒤, 액세스 링크의 임대 갱신이 터널을 죽이고, 로그는 경로가 아니라 타임아웃을 탓한다. VPN 설정에서는 아무것도 바뀌지 않았다, 그게 단서다, 바깥의 무언가가 바뀌었다. DHCP 이벤트가 주소나 게이트웨이를 다시 썼고, 터널 엔드포인트를 도달 가능하게 유지하던 호스트 경로가 이제 존재하지 않는 다음 홉을 가리킨다. 이것은 라우팅 문제이기 전에 소유권 문제다.

증상을 하프 디폴트 경로와 대조하라

redirect-gateway def1 를 쓰면 OpenVPN은 기본 경로를 바꾸는 대신 0.0.0.0/1 과 128.0.0.0/1 를 설치한다. 둘을 합치면 전체 주소 공간을 덮고, 프리픽스 길이만으로 0.0.0.0/0 를 이긴다. 따라서 더 구체적인 일치가 없는 모든 목적지는 터널로 들어간다.

엔드포인트에는 예외가 필요하다. OpenVPN은 하프 디폴트가 들어가기 전에 원래 액세스 게이트웨이를 통해 서버 주소로 가는 호스트 경로를 추가해, 캡슐화된 패킷이 나갈 수 있게 한다. 그 예외가 사라지거나 더 이상 존재하지 않는 다음 홉을 유지하면, 터널 자체의 바깥 패킷이 하프 디폴트와 일치해 터널 안으로 되돌아간다. 결과는 다음 keepalive나 핸드셰이크에서 죽는 연결이며, 로그에는 라우팅 오류처럼 보이는 것이 없다.

다른 무엇을 건드리기 전에 테이블의 모양을 확인하라. ip route show 는 두 절반과 서버 주소용 호스트 경로를 나열해야 하며, 호스트 경로가 없으면 나머지 조사에는 분명한 출발점이 있다.

메트릭을 바꾸지 않고 하프 디폴트가 이기는 이유

낮은 메트릭은 더 긴 프리픽스를 이기지 못한다. /1 경로가 이기는 것은 커널이 가장 구체적인 경로를 먼저 대조하기 때문이며, 따라서 기본 경로의 메트릭을 올려도 터널로 가는 트래픽이 어디로 향하는지는 바뀌지 않는다. 메트릭을 쫓는 것이 이 진단에서 가장 흔한 잘못된 길이다.

ip route get 203.0.113.10 로 선택을 확인하되, 실제 서버 주소를 넣어라. 답은 커널이 실제로 사용할 인터페이스와 다음 홉을 알려 주며, 테이블을 읽고 생각하는 것보다 유용하다.

그 명령을 터널이 시작되기 전, 동작 중, 그리고 임대 이벤트 이후에 실행하라. 한 명령에서 세 가지 답이 나오고, 분기점이 보인다.

스냅샷을 하나가 아니라 셋 찍어라

액세스 주소, 액세스 게이트웨이, 엔드포인트 목적지, 선택된 경로, 모든 정책 규칙을 세 시점에 모아라, 즉 액세스 링크 구성 후, VPN 연결 후, 임대 또는 통신사 이벤트 이후다. 각 스냅샷은 한 줌의 명령이며, 함께 있어야만 의미가 있다. 실패 후의 단일 스냅샷은 전이가 아니라 상태를 기록한다. 명령을 작은 스크립트에 적어 모든 스냅샷을 같은 방식으로 찍어라.

스냅샷을 타임스탬프와 함께 한 파일에 보관하라, 나중에 흥미로운 질문은 순서이기 때문이다. DHCP 이벤트는 OpenVPN 이 경로를 갱신하기 전에 왔는가, 후에 왔는가? 답이 누가 고쳐야 하는지를 결정한다. 잘못된 시계의 타임스탬프는 없는 것보다 나쁘므로, 라우팅 테이블을 소유한 호스트에서 찍어라.

엔드포인트가 주소가 아니라 이름으로 설정된 경우, 각 스냅샷에서 이름도 해석하라. 액세스 링크의 DNS 변경은 어떤 경로도 건드리지 않고 엔드포인트를 옮길 수 있다.

어떤 구성 요소가 예외를 갱신하는지 결정하라

dhcpcd 시스템에서는 훅이 훅 디렉터리와 종료 훅에서 실행되며, 관리자 모드는 범위가 인터페이스별 모드와 다르다. 훅이 무엇을 하든 멱등이어야 한다, 갱신은 몰려서 올 수 있기 때문이다.

신뢰할 수 있는 소유자는 이미 양쪽을 아는 통합이다, VPN 연결을 관리하는 네트워크 관리자, 또는 액세스 링크가 올라온 뒤 정렬된 유닛이다. 훅이 추가한 정적 경로는 다음 게이트웨이 변경까지 작동하고, 그다음에는 정확히 같은 방식으로 실패한다. 훅을 쓴다면 오늘 본 게이트웨이를 하드코딩하지 말고 실행 시점에 현재 게이트웨이를 읽게 하라.

소유자를 설정 안에 기록하라. 다음에 재연결을 디버그할 사람은 예외 경로의 책임이 VPN이 아니라 훅에 있다는 것을 알아야 한다.

재연결만이 아니라 수명 주기를 시험하라

dhcpcd -n eth0 로 또는 임대를 해제하고 다시 받아 갱신을 강제한 뒤, 엔드포인트에 대해 ip route get 를 다시 확인하라. 두 번 하라, 두 번째 실행은 중복 경로를 추가하는 훅을 잡는다. 그다음 재부팅하라, 지속성은 정확성과 다른 속성이다.

갱신과 재부팅을 견디는 터널에는 소유자와 작동하는 예외가 있다. 수동 재시작만 견디는 터널에는 둘 다 없으며, 당신이 예약할 수 없는 다음 이벤트에서 실패할 것이다.

관련 글