OpenVPN GUI 프로필 하나만 연결 해제하기, 모든 터널이 아니라
GUI가 관리하는 터널에는 GUI 명령이, 서비스가 관리하는 터널에는 서비스 제어가 필요하다. 스크립트를 쓰기 전에 어떤 프로그램이 프로필을 소유하는지 확인한다.
연결 해제 스크립트는 대개 한 가지 이유로 실패한다. 잘못된 소유자를 향하기 때문이다. 커뮤니티 OpenVPN GUI가 관리하는 터널은 그 GUI의 세션에 속하고, Windows 서비스가 시작한 터널은 그 서비스에 속하며, OpenVPN Connect는 둘 중 어디에도 속하지 않는다. 다음 확인을 순서대로 진행하고 소유자가 불분명하면 멈춘다. 소유자가 모호한 상태에서 kill 명령을 보내는 것이 프로필 하나의 연결 해제를 사이트 전체의 중단으로 바꾸는 경로다.
GUI가 관리하는 연결에서는 유용한 명령이 openvpn.exe에 보내는 신호가 아니라 GUI에 보내는 메시지다.
먼저 소유자를 확인한다
무엇이든 쓰기 전에 어느 프로그램이 실제로 연결 상태를 표시하는지 본다. 알림 영역의 아이콘은 GUI 세션이 소유한다는 뜻이다. 서비스 항목은 서비스가 소유한다는 뜻이다. 자체 프로필 목록을 가진 별도 애플리케이션 창은 둘 다 아니며, 그 버전에 특화된 자체 인터페이스가 적용된다.
계정과 데스크톱 세션도 확인한다. 다른 사용자로 또는 비대화형 세션에서 실행되는 예약 작업이 로그인한 사람이 보는 GUI를 제어한다고 가정해서는 안 된다. 이 불일치는 깔끔하게 종료되면서 아무것도 바꾸지 않는 명령을 만들고, 그것이 로그에서 추적하기 가장 비싼 종류의 실패다.
그다음 소유자 자신의 연결 해제를 보낸다
GUI가 예시의 경로에 설치되어 있고 office라는 프로필이 있다면, 전체 명령은 한 줄이다.
"C:\Program Files\OpenVPN\bin\openvpn-gui.exe" --command disconnect office실제 설치 경로와 GUI가 표시하는 대로의 대소문자를 포함한 정확한 구성 이름으로 바꾼다. 프로젝트의 명령 문서에 지원되는 GUI 제어가 나열되어 있으며, 이 예시는 OpenVPN GUI에만 해당한다 — 이름에 OpenVPN이 들어간 모든 애플리케이션을 위한 명령이 아니다.
서비스가 소유한 터널에서는 올바른 제어가 GUI 바이너리가 아니라 서비스다. 무엇이든 멈추기 전에 설치된 서비스와 그것이 관리하는 프로필을 살핀다. 한 번의 중지가 여러 터널을 동시에 떨어뜨릴 수 있고 프로필별 결과는 돌아오지 않는다.
다른 것이 떨어지지 않는지 확인한다
GUI는 disconnect_all 명령도 문서화하며, 그 범위가 바로 office만 멈춰야 하는 스크립트에 그것이 잘못된 도구인 이유다. 단순함 때문에 쓰고 싶어진다면 그 머신에서 또 무엇이 연결되어 있는지, 사용자가 그것을 어떻게 알아차릴지 자문한다.
taskkill /F /IM openvpn.exe는 두 가지 면에서 더 나쁘다. 실행 파일 이름으로 프로세스를 고르고 강제 종료하므로 프로필 이름도, 소유자의 정상적인 연결 해제 순서도 표현하지 않는다. 이것을 정상적인 종료라고 부르는 것은 두 문제를 하나의 종료 상태 뒤에 감추는 일이다.
어느 경로를 택하든 변경 전에 영향 범위를 확인한다. 연결된 프로필을 나열하고, 남아야 할 것을 적어 두고, 나중에 다시 확인한다.
종료 코드가 아니라 상태를 확인한다
연결 해제를 요청한 뒤에는 명령의 반환 값을 믿는 대신 소유자를 통해 지정된 연결의 상태를 읽는다. 다음 단계가 해체 후 네트워크를 필요로 한다면 프로세스가 돌아왔을 때 정리가 끝났다고 가정하지 말고 명시적 타임아웃으로 그 상태 변화를 기다린다. 해체와 경쟁하는 스크립트는 간헐적으로 실패하고 VPN이 비난을 받는다.
상태가 전혀 바뀌지 않는다면 소유자가 당신이 향한 대상이 아닐 가능성이 크다. 더 강한 명령으로 넘어가기 전에 세션과 계정을 다시 확인한다.
로그에 무엇을 남길지
프로필 이름, 향한 소유자, 실행 컨텍스트, 그리고 결과 상태를 기록한다. 전체 구성이나 자격 증명을 작업 로그에 쏟지 말고, 명령 줄에 비밀이 담긴 파일 경로가 있다면 기록하지 않는다.
프로필과 컨텍스트를 지목하는 오류 메시지면 다음 사람이 문제를 재현하기에 충분하다. 일반적인 종료 코드만 기록하는 로그는 그들을 처음으로 되돌리며, 추측이 다시 시작되는 곳이 바로 거기다.