VPN이 올라온 뒤 실행되어야 하는 스크립트에는 연결을 소유한 구성 요소의 이벤트가 필요합니다. 오래된 네트워크 훅 디렉터리에 넣은 파일은 NetworkManager, pppd 또는 독립 OpenVPN 프로세스가 만들 수 있는 모든 VPN에 대한 콜백이 아닙니다. 그 소유자들은 각각 다른 환경으로 다른 이벤트를 보고하므로 훅을 고르기 전에 소유자를 식별해야 합니다. 그렇지 않으면 스크립트는 올바르며 그저 절대 실행되지 않습니다.

NetworkManager가 관리하는 VPN에는 디스패처가 올바른 장소이고 vpn-up이 올바른 동작입니다.

인터페이스 이벤트가 아니라 vpn-up을 사용하십시오

디스패처는 up과 vpn-up을 구분합니다. 전자는 활성화된 인터페이스를 보고하고, 후자는 활성화된 VPN 연결을 보고합니다. Wi-Fi가 올라온다는 것은 기반 링크가 존재한다는 뜻일 뿐이며, 터널은 아직 협상 중일 수 있고 인증에 이르지 못할 수도 있습니다.

스크립트는 인터페이스와 동작을 받고, 연결 세부 정보는 환경을 통해 전달되며 프로필 UUID와 VPN의 IP 인터페이스도 포함됩니다. 장치 이름에서 신원을 추론하지 말고 그 변수를 읽으십시오.

일치 범위를 하나의 연결로 제한하십시오

연결 UUID 또는 디스패처가 제공하는 다른 식별자로 일치시키고, tun 접두사나 ppp0으로 일치시키지 마십시오. 인터페이스 이름은 안정적이지 않고, 동시에 둘 이상의 터널이 존재할 수 있으며, 두 프로필이 같은 표시 이름을 가질 수 있습니다. tun 접두사로 일치시키면 스크립트가 결국 아무도 건드릴 생각이 없던 연결에서 실행됩니다. 재연결이 장치를 다시 만들 때 한 프로필에 대해 두 번 실행될 수도 있습니다.

작업을 멱등하게 만드십시오. 호출할 때마다 경로를 추가하는 콜백은 결국 테이블을 중복으로 채우고, 라우팅을 깨뜨리는 것은 두 번째 사본입니다.

활성화가 증명하지 않는 것을 아십시오

vpn-pre-up은 NetworkManager가 VPN이 완전히 활성화되었다고 보고하기 전에 실행되며, 관리자는 그 스크립트들을 기다립니다. 작업이 정말 그곳에 속할 때만 차단 단계를 사용하십시오, 느린 검사가 다른 모든 구성 요소가 관찰하려 기다리는 활성화를 지연시키기 때문입니다.

경로가 있다고 해서 애플리케이션이 수신 중이거나 사설 이름이 해석되거나 사용자 세션이 존재한다는 것이 증명되지 않습니다. 그것들을 제한된 시간 제한으로 따로 확인하고, 전체 체인을 다시 시도하는 대신 어느 계층이 실패했는지 보고하십시오.

스크립트가 실행되는 맥락을 존중하십시오

디스패처 스크립트는 root로, 어떤 사용자 세션 밖에서 실행됩니다. 로그인한 사용자의 환경이나 그래픽 세션, 잠금 해제된 키링이 사용 가능하다고 가정하지 마십시오. 데스크톱 맥락이 없다고 해서 모든 자격 증명을 모든 프로세스가 읽을 수 있게 만드는 것으로 응답해서는 안 됩니다. 사용자 세션 작업은 콜백이 사용자를 가장하지 않고 신호할 수 있는 사용자 서비스나 세션 도우미에 두십시오.

스크립트의 소유권과 권한도 중요합니다. root로 실행되고 어떤 사용자든 교체할 수 있는 파일은 권한 상승 경로이며, VPN 로직이 올바른지와 무관한 발견 사항입니다.

절대 발생하지 않는 연결 해제에 대비하십시오

NetworkManager는 예기치 않은 종료나 연결 손실 같은 강제 연결 해제에는 vpn-pre-down이 발생하지 않는다고 문서화합니다. 따라서 정상적인 pre-down만을 전제로 한 정리는 구조적으로 불완전합니다. 스크립트가 바꾸는 공유 상태에는 충돌 후 복원할 수 있는 다른 소유자가 필요하며, 그 복구 경로는 가정이 아니라 시험해야 합니다.

정상 연결, 재연결, 의도적 연결 해제, 케이블 뽑기로 훅을 시험하십시오. 비밀을 기록하지 않고 발생한 UUID, 동작, 인터페이스를 기록하십시오. 그 기록만이 의도한 연결에서 훅이 실행되었다는 신뢰할 수 있는 증거이며, 다음 변경을 안전하게 만드는 것도 그것입니다.

관련 글