사설 경로를 유지하고 리디렉션을 버리기: OpenVPN 분할 터널
사설 네트워크 전용 터널에는 두 가지 규칙이 필요하다. 사설 접두사는 터널을 지나고, 일반 탐색은 로컬 경로를 유지한다. 기본 경로를 지우는 것은 정책이 아니다.
터널이 올라오고 애플리케이션이 로드된 다음, 노트북의 나머지 모든 것이 이상하게 동작하기 시작한다. 한 줄을 지워 구현한 사설 전용 정책의 흔한 모습이다. 밀어 넣은 기본 경로를 제거하면 트래픽이 어디로 가는지는 실제로 바뀌지만, 그 대신 트래픽이 어디로 가야 하는지는 말하지 않으며 이름 확인은 전혀 건드리지 않는다. 정책은 검증되기 전에 두 개의 긍정적인 절반이 필요하다.
리디렉션 삭제는 변경의 절반일 뿐이다
전체 터널 리디렉션과 사설 전용 정책은 세상에 대해 주장하는 바가 다르다. 리디렉션은 모든 목적지를 주장하고, 사설 정책은 목록을 주장하며 나머지는 그대로 둔다. 목록을 쓰지 않고 주장을 지우면 LAN 밖 어디에도 닿지 않는 클라이언트가 생기는데, 이는 정책의 구멍이라기보다 경로 실패처럼 보인다. 주장을 제거하기 전에 목록을 쓰면 그 두 단계의 순서는 더 이상 중요하지 않다.
두 절반 모두 기본값이 아니라 요구 사항이다. 사설 접두사는 터널로 들어가야 하고, 일반 목적지는 연결 전에 갖던 경로를 유지해야 한다.
조직이 전체 터널을 강제하면 여기에 해당하는 것은 없다. 사설 전용 설계는 분할 라우팅이 승인된 배포에 속한다.
pull-filter는 일치이지 스위치가 아니다
pull-filter 지시문은 이름이 접두사와 일치하는 밀어 넣은 옵션을 제거하며, 그게 전부다. 리디렉션을 무시하면 다른 모든 밀어 넣은 옵션은 제자리에 남고, 보통은 그것이 원하는 바다. 경로, DNS 설정, 경로 게이트웨이 값은 모두 도착하지만, 로컬 프로필에 적힌 지시문은 제거할 수 없다. 필터링은 서버가 밀어 넣는 것에 적용되기 때문이다.
route로 시작하는 모든 옵션을 무시하려는 유혹을 물리쳐야 한다. 그 패턴은 연결에 필요한 사설 경로까지 버리며, 터널이 의존하는 게이트웨이 정보를 잃을 수 있다.
route-nopull은 보이는 것보다 넓은 결정이다. 밀어 넣은 경로와 DHCP 방식 옵션을 한 그룹으로 받아들이지 못하게 한다. 이는 옵션 하나를 걸러내는 것과 다른 정책이다.
경로 목록은 애플리케이션에서 바깥으로 쓴다
사용자가 실제로 여는 것에서 시작하고, 그다음 지원 부품을 더한다. 10.60.20.15의 애플리케이션은 그 서브넷 10.60.0.0/16을 함축하고, 사설 이름은 그것에 응답하는 리졸버를 함축한다. 따라서 애플리케이션 하나를 요청한 사용자에게는 두 개의 목적지와 하나의 DNS 결정이 필요하다. 그 목록 밖은 구조상 범위 밖이며, 이것이 정책을 검토 가능하게 유지한다.
협조하는 서버에서는 그것이 두 개의 밀어 넣은 경로가 되고, 둘 다 리디렉션이 아니다. 기존 서비스가 제공하는 터널 토폴로지와 경로 게이트웨이 값을 유지한다.
일부 사용자만 이 정책이 필요하면 클라이언트별 또는 그룹별로 적용한다. 한 팀의 요구를 고치려고 모두의 라우팅을 바꾸는 것이 분할 터널을 장애로 만드는 길이다.
| Destination | Intended path |
|---|---|
10.60.0.0/16 | Tunnel, for the approved application services |
10.61.0.53/32 | Tunnel, to reach the internal resolver |
corp.example queries | Internal resolver, selected per namespace |
| Everything else | Local path and local resolver |
DNS도 같은 경로를 따르게 한다
리졸버로 가는 경로는 리졸버 정책이 아니다. systemd-resolved 클라이언트에서 의미론적 결과는 사설 이름 공간에 대한 라우팅 도메인이며 내부 리졸버를 가리킨다. 그래서 그 이름들만 그것을 사용한다. Windows 클라이언트에는 대신 자체 이름 공간 정책 메커니즘이 필요하다. 프로필의 DNS 서버 줄은 둘 중 어느 것도 스스로 설치하지 않는다.
프로필이 요청한 것이 아니라 운영 체제가 선택한 것을 확인한다. Linux에서는 resolvectl status가 링크별 도메인과 서버를 보여 주고, Windows에서는 이름 공간 정책 표가 동등한 증거다.
리졸버를 터널을 통해 접근 가능하게 유지해야 한다. 그렇지 않으면 정책이 질의할 수 없는 주소를 가리킨다. 터널이 닿지 않는 리졸버 주소는 동작하는 정책을 시간 초과로 바꾼다.
재연결에서 두 절반을 모두 검증한다
변경 후 클라이언트를 다시 연결하고 사설 주소와 공용 주소로 가는 실효 경로를 살핀다. 그다음 사설 이름과 공용 이름을 확인하고 각각이 의도한 리졸버를 사용했는지 확인한다. 공용 웹사이트가 로드되는 것은 두 번째 절반만 증명하며, 보통 그 절반이 우연히 동작한다.
완성된 정책을 한 문장으로 기록한다. 이 접두사와 이름은 이 연결을 사용하고 나머지는 로컬 경로를 따른다. 그다음 로그인할 때마다 어댑터 설정을 고치는 대신 프로필에 보관한다.