systemd ExecCondition으로 집 VPN 건너뛰기
의도적인 건너뛰기와 고장 난 준비 명령은 서로 다른 결과입니다. 헬퍼의 종료 코드를 정의한 다음 네트워크 간 이동을 테스트하십시오.
노트북이 이미 그 네트워크에 있다면 집 네트워크 VPN은 할 일이 없습니다. 유혹적인 지름길은 영이 아닌 코드로 종료하는 준비 명령인데, 그러면 유닛이 실패하고 모든 대시보드가 고장 난 것처럼 보입니다. systemd에는 바로 이런 종류의 결정을 위한 지시문이 있으며, 의도적인 건너뛰기와 실제 결함을 구분합니다. 올바르게 하는 일은 대부분 각 종료 코드가 무엇을 뜻하는지 적어 두는 것입니다.
실패하는 사전 조건이 잘못된 형태인 이유
ExecStartPre는 영이 아닌 종료를 시작 실패로 취급하며, 이는 서비스를 준비하는 명령에 맞는 동작입니다. 이를 조건으로 사용하면 정책 결정이 고장 난 의존성과 구별되지 않습니다. ExecCondition은 유닛이 실패로 표시되지 않고 시작을 거부할 수 있도록 존재합니다.
그 구분은 새벽 세 시에 중요합니다. 설계대로 동작하던 빨간 유닛을 아무도 분석하고 싶지 않기 때문입니다. 실패한 유닛은 의도된 실패들 사이에서 실제 고장까지 숨깁니다.
먼저 종료 코드 계약을 작성하십시오
스크립트보다 계약을 먼저 작성하십시오. 종료가 영이면 계속, 일이면 남은 시작 명령을 건너뛰기, 255면 조건 자체가 실행될 수 없었음을 뜻합니다. 둘과 254 사이의 코드도 보통 건너뛰기를 뜻하며, 헬퍼가 임의의 오류 코드를 반환할 때 잊기 쉽습니다. 아래 drop-in은 헬퍼를 실제 유닛 이름에 연결합니다.
[Service]
ExecCondition=/usr/local/libexec/should-start-home-vpn기본 의미를 가정하기 전에 적용 중인 유닛에서 상속된 SuccessExitStatus 또는 stop-post 설정을 확인하십시오. 그런 다음 세 가지 결과를 각각 의도적으로 테스트하십시오.
네트워크 단서는 위치의 증거가 아닙니다
접근 가능한 라우터 주소나 알려진 MAC은 올바른 네트워크를 암시할 수 있지만 둘 다 그것을 증명하지는 못합니다. 다른 네트워크가 같은 주소를 재사용할 수 있고, ARP 데이터가 오래되었을 수 있으며, 식별자는 위조될 수 있습니다. 탐지를 정책과 일관된 최적화로 취급하고 인증 결과로 보지 마십시오.
불확실성이 무엇을 뜻하는지 미리 결정하십시오. 확신이 없을 때 VPN을 시작하는 것은 단순히 연결에 실패할 클라이언트에게는 안전합니다. 확신이 없을 때 건너뛰는 것은 안전하지 않습니다. 탐지에 시간 제한을 두고, 목록의 첫 번째를 가정하지 말고 실제 활성 인터페이스를 읽으십시오. 응답이 없는 탐지는 ‘아니요’라고 답하는 탐지보다 나쁩니다. 유닛이 그 탐지를 기다리기 때문입니다.
그 가정들을 유닛 파일 옆에 기록하여 다음 사람이 헬퍼의 전제를 알 수 있게 하십시오. 스크립트 맨 위의 주석이 그것을 남기는 가장 저렴한 장소입니다.
네트워크 간 이동을 처리하십시오
조건은 서비스가 시작될 때 실행되며 나중에 다시 평가되지 않습니다. 건너뛴 유닛은 노트북이 카페로 이동한 뒤에도 건너뛴 상태로 남고, 실행 중인 터널은 노트북이 집으로 돌아온 뒤에도 올라와 있습니다. 네트워크 변경 수명 주기를 별도 메커니즘으로 시작과 중지 결정에 연결하십시오.
systemctl cat home-vpn.service네 가지 사례를 테스트하십시오. 집에서 시작, 밖에서 시작, 실행할 수 없는 탐지, 유닛이 활성인 상태에서 네트워크 간 이동입니다. 건너뛰기 이유를 저널에 남겨 의도적인 결정이 인증 실패처럼 보이지 않게 하십시오. 서비스 참조에는 종료 의미와 최소 버전이 문서화되어 있습니다.