OpenVPN 클라이언트 하나 내보내기: kill, deny, 인증서 폐기 중 무엇인가
OpenVPN의 세 동작 모두 클라이언트를 제거하지만 끝내는 대상이 다릅니다. 살아 있는 세션, 한 번의 로그인 시도, 다시 연결할 권리입니다. 식별자로 고르십시오.
메모에 common name과 주소가 있고, 모두 클라이언트를 제거하는 것처럼 보이는 명령 세 개가 있습니다. 원하는 일을 하는 것은 하나뿐이며, 선택은 지금 실행 중인 세션을 끝내야 하는지, 다음 로그인을 거부해야 하는지, 연결 권리 자체를 빼앗아야 하는지에 달려 있습니다. OpenVPN 풀이 나중에 같은 터널 주소를 다른 세션에 넘기므로, 무엇이든 건드리기 전에 실제로 가진 식별자를 읽으십시오.
실제로 가진 식별자는 무엇인가
버전 3 상태 파일이 일반적인 출발점입니다. CLIENT_LIST 섹션에는 common name, 실제 주소, 바이트 카운터, 연결 시간이 들어 있고, ROUTING TABLE 섹션은 가상 주소를 common name에 매핑하며 마지막 참조 시각을 함께 가집니다. common name이 안정적인 식별자입니다. 가상 주소는 할당일 뿐이고, NAT 뒤의 실제 주소는 서버에서 아무것도 바뀌지 않은 채 세션 사이에 달라질 수 있습니다.
관리 인터페이스는 status 명령으로 비슷한 화면을 제공하고 세션마다 클라이언트 ID를 추가합니다. client-kill이 기대하는 것은 바로 그 ID이며 터널 주소가 아닙니다. 연결 시점에 어떤 common name이 어떤 주소를 받았는지 알아야 한다면 client-connect 스크립트의 환경에 둘 다와 신뢰할 수 있는 외부 주소가 있지만, 그 스크립트는 OpenVPN 사용자로 실행되며 쓸 수 있는 로그 경로가 필요합니다.
| What you hold | Where it came from | What it can act on |
|---|---|---|
| Common name | CLIENT_LIST, or the auth hook | kill, and credential revocation |
| Client ID | status on the management socket | client-kill, that one session |
| Tunnel address | ROUTING TABLE, client-connect environment | Nothing durable, the address is recycled |
지금 죽이기, 로그인에서 거부하기, 영구히 폐기하기
관리 인터페이스의 두 제거 명령은 모두 세션 동작입니다. kill은 common name 또는 실제 주소와 포트를 받고, client-kill은 클라이언트 ID를 받아 그 인스턴스를 즉시 끝냅니다. 어느 쪽도 차단이 아니며, 유효한 인증서와 비밀번호를 가진 내보내진 클라이언트는 몇 초 만에 다시 연결하므로 테스트 피어를 재활용할 때는 괜찮고 노트북이 도난당했을 때는 쓸모가 없습니다.
client-deny은 다른 종류의 결정입니다. 보통 인증 훅이나 client-connect 훅에서 발행되어 이유와 함께 세션을 거부하므로, 연결을 끊는 정책보다 로그인을 거부하는 정책에 맞습니다. 문서는 또한 TLS 재협상 중 발행된 거부가 재협상된 키를 무효화하지만 기존 세션은 전환 창이 닫힐 때까지 계속될 수 있다고 경고합니다. 클라이언트가 지금 사라져야 한다는 것이 요구 사항이라면 문서화된 답은 client-kill입니다.
영구 제거는 이 모든 것 아래에 있습니다. 인증서를 폐기하고 crl-verify이 서버가 실제로 다시 읽는 목록을 가리키는지 확인하고, ccd 디렉터리의 클라이언트별 구성 파일을 비활성화하거나, 인증 훅이 조회하는 백엔드에서 계정을 비활성화하십시오. 폐기도 즉시가 아니며, 기본 reneg-sec 설정에서는 이미 성립된 세션이 재협상할 때까지 계속될 수 있으므로 세션 동작과 자격 증명 동작은 대안이 아니라 보완입니다.
관리 소켓은 비어 있는가?
관리 인터페이스는 한 번에 한 클라이언트만 서비스합니다. GUI나 모니터링 데몬이 이미 연결을 잡고 있으면 스크립트가 옆에 붙을 수 없고, 클라이언트에 따라 깔끔하게 실패하는 대신 기존 연결을 밀어낼 수 있습니다. 그 비밀번호는 해당 소켓 위를 평문으로 지나가므로 로컬 주소나 unix 소켓에 두어야 하며 공용 인터페이스에는 절대 두면 안 됩니다.
소켓을 잡을 수 없을 때도 선택지는 있고, 모두 더 느립니다. GUI를 통제한다면 먼저 그 세션을 놓아 주거나, 자격 증명 계층 경로를 받아들이고 다음 재협상을 기다리십시오. 클라이언트 하나를 떼어내려고 서비스를 다시 시작하면 다른 모든 세션도 끝나고 이 세션의 상태 파일 증거도 사라지므로, 그렇게 해서는 안 됩니다.
운영 서버에서 내가 실행하는 순서
접속하고, 현재 상태를 읽고, 방금 읽은 ID에 대해 조치하고, 다시 읽으십시오. 문서에서 복사한 값은 잘못된 상대를 죽이는 가장 흔한 방법입니다.
status # note the client ID and common name
client-kill 3 # end that session now
kill Test-Client # alternative: by common name
status # confirm the session is gone위의 이름과 번호는 자리 표시자이고 ID는 다른 클라이언트가 연결을 끊은 뒤 재사용됩니다. 무언가를 완료로 적기 전에 그 행이 없음을 확인하고, 연결된 클라이언트 수가 여러 개가 아니라 하나 움직였는지 확인하십시오.
다시 나타나지 않는지 확인하기
common name, 터널 주소, 외부 주소, 제거한 분을 기록하십시오. 같은 common name이 일 분 뒤 다시 나타난다면 세션 동작은 효과가 있었고 자격 증명 계층은 없었던 것이며, 이는 명령이 전혀 효력을 내지 못한 경우와 완전히 다른 수리입니다.
그다음 클라이언트 쪽에서 시험하십시오. 폐기된 인증서는 다음 핸드셰이크에서 실패해야 하며, 그런데도 연결된다면 CRL이 전혀 읽히지 않는 것이고 그것이 보고할 가치가 있는 발견입니다. 무엇을 끝내야 하는지로 동작을 고르고, 두 번째 status으로 확인하고, 답이 세션보다 오래 유지되어야 할 때 자격 증명 계층을 고치십시오.