원격 게이트웨이가 재부팅되어 일 분 안에 돌아오는데도 로컬 strongSwan 데몬은 계속 실행되고 터널은 내려가 있습니다. ESTABLISHED를 grep해서 데몬을 재시작하는 cron 작업은 결국 이를 덮어버리고, 머신의 무관한 터널까지 모두 끊으면서 실패한 터널은 놓칠 수 있습니다. 복구는 돌아와야 하는 연결에 속하며, reload를 견디는 설정으로 표현됩니다. 이 런북은 그것을 연결 하나에 대해 설정하고 결과를 이름으로 증명합니다.

전역 재시작을 그만두고 그 증거는 남기기

데몬 재시작에는 두 가지 구체적인 결함이 있습니다. 모든 연결의 상태를 파괴하고, 어떤 이벤트가 실제로 실패했는지 아무것도 알려주지 않습니다. grep한 상태 텍스트는 다른 연결에서 온 것일 수 있고, 필요한 child는 아무것도 트리거하지 않아 유휴 상태로 있었습니다.

무엇이든 바꾸기 전에 로드된 연결과 활성 연관을 읽어, peer가 돌아온 뒤 비교할 변경 전 그림을 확보하세요.

swanctl --list-conns
swanctl --list-sas

시작과 재시도는 돌아오는 연결에 두기

swanctl.conf 배포에서 이 설정들은 전역 정책이 아니라 연결과 child 수준에 있습니다. 아래 조각은 제안, 인증, 선택자가 이미 올바르다는 것을 전제로 한 개시자 측 예시입니다.

connections {
    branch {
        keyingtries = 0
        dpd_delay = 30s
        children {
            private-lan {
                start_action = trap|start
                dpd_action = restart
            }
        }
    }
}

start_action은 child가 로드될 때 무슨 일이 일어나는지 결정합니다. start는 즉시 시작하고, trap은 일치하는 트래픽이 나타날 때 시작을 트리거하는 정책을 설치합니다. trap|start를 쓰려면 strongSwan 5.9.6 이상이 필요하므로 줄을 복사하기 전에 버전을 확인하세요. dpd_action=restart는 peer가 죽었다고 선언되면 새 협상을 요청하고, 연결 수준의 keyingtries=0은 성공이나 영구 오류까지 추가 시도를 허용합니다. IKEv2에서는 dpd_timeout이 전혀 효과가 없습니다. peer가 응답하지 않는 시점은 일반 재전송이 결정하기 때문입니다.

그 예시의 지연은 출발점이며 보편적인 기한이 아닙니다. peer의 재부팅에 걸리는 시간과 얼마나 많은 재전송을 견딜지에 따라 선택하세요.

어떤 이벤트에서 복구하는지 알아두기

세 가지 장애는 대시보드에서 똑같이 보이고 서로 다른 설정이 필요합니다. 한 번도 올라오지 않은 초기 연결은 구성 또는 도달성 문제입니다. 응답을 멈춘 peer는 DPD 사례입니다. peer가 명시적으로 닫은 child는 DPD가 결코 관찰하지 않는 자체 close_action을 가진 정책 이벤트입니다. 장애 전후의 로그를 읽으면 세 가지 중 무엇인지 알 수 있고, 그 답이 수정 방법을 바꿉니다.

운영자가 유지보수를 위해 의도적으로 닫는 연결에는 공격적인 재시작을 추가하지 마세요. 추가하면 유지보수 시간 한가운데에서 터널이 다시 나타나고, 온디맨드 설계에는 유지된 trap으로 충분하며 일치하는 트래픽이 타이머 없이 child를 다시 세웁니다.

데몬 상태가 아니라 이름으로 검증하기

peer가 아직 내려가 있는 동안 연결과 그 child를 이름으로 읽고, 돌아온 뒤 다시 읽었을 때 그 두 출력의 차이가 증거입니다.

swanctl --initiate --child private-lan
swanctl --terminate --ike branch

그다음에는 연관이 아니라 서비스를 확인하세요. 새로운 child 보안 연관과 그 뒤 사설 목적지로의 성공적인 요청, 이 두 가지 사실이 중요하며, 건강한 무관한 터널과 함께 데몬이 돌고 있다는 것은 둘 다 증명하지 못합니다.

child가 전혀 시작하지 않으면 테스트 트래픽이 구성된 선택자와 정확히 일치하는지, 프로토콜과 포트까지 확인하세요. 시작했는데 실패하면 무한 루프 뒤에 숨기지 말고 인증 또는 제안 오류를 읽으세요. keyingtries=0은 영구 거부를 기꺼이 영원히 반복합니다.

유지보수 시간에 변경을 로드하고 다시 테스트하기

reload는 데몬 재시작보다 안전하지만 공짜는 아니며, child를 교체하거나 내리면 시작된 연관을 닫거나 그 trap을 떨어뜨릴 수 있습니다.

유지보수 시간에 로드하고 이전 파일을 보관하며, 연결이 기본값이 아니라 의도한 설정으로 나타나는지 확인하세요.

swanctl --load-conns
swanctl --list-conns

이전 파일을 복원해 다시 로드하여 롤백하고, 같은 두 명령을 반복하세요. 데몬 재시작 후에만 돌아오는 터널은 복구된 것이 아니라 초기화된 것입니다.

관련 글