두 업링크, 하나의 터널, 그리고 트래픽은 선택하지 않은 쪽으로 나가고 있습니다. 사설 서브넷에 도달할 수 있고, 로그는 연결 성공을 알리며, 종량제 링크가 그것을 운반하고 있습니다. OpenVPN 출력에는 게이트웨이 언급이 없는 것은 클라이언트가 한 번도 고른 적이 없기 때문입니다. 원격 주소로 소켓을 열고 그 주소에 도달하는 방법은 커널에 맡겼습니다.

터널 주소는 엔드포인트가 아니다

모든 세션에는 두 개의 다른 경로가 있습니다. 바깥 경로는 암호화된 전송을 서버의 공인 주소까지 운반합니다. 안쪽 경로는 서버가 터널로 밀어 넣는 모든 것을 운반하며, 한쪽의 라우팅 규칙은 다른 쪽에 영향을 주지 않습니다.

프로필의 remote 항목은 바깥 목적지를 지정하므로 고정해야 할 주소가 바로 그것입니다. 호스트 이름이 다르게 확인되거나 프로필에 여러 remote가 나열될 때 바뀌는 값이기도 합니다.

클라이언트가 실제로 연결한 주소를 찾아라

설정 파일이 아니라 살아 있는 소켓을 읽으십시오. 소켓 표는 프로세스가 실제로 연결한 피어를 보여 주며, 예외는 그 값과 일치해야 합니다. 세션이 시작된 뒤에도 프로필을 편집할 수 있고, 무엇에 연결했는지 보여 주는 유일한 증거는 소켓입니다:

ss -tunp | grep -i openvpn
journalctl -u openvpn-client@work --no-pager | grep -i "Peer Connection Initiated"

로그 줄은 연결 시점의 피어 주소와 포트를 알려 줍니다. 프로필과 다르다면 클라이언트 앞의 무언가가 연결이 시작되기 전에 목적지를 다시 쓰고 있는 것입니다.

주소 체계도 확인하십시오. 이중 스택 프로필은 IPv6로 연결될 수 있지만 예외가 IPv4만 포괄한다면 트래픽은 작성한 규칙과 다른 규칙을 따릅니다. 엔드포인트 대신 응답하는 프록시도 마찬가지입니다. 두 경우 모두 경로가 아무 일도 하지 않는 동안 터널은 동작합니다.

엔드포인트를 고정하고 정책 순서를 읽어라

호스트 경로는 어떤 기본 경로보다 구체적입니다. 따라서 피어 주소에 대한 /32는 그것을 포함하는 표 안에서 이깁니다. 일반적인 형식은 게이트웨이와 장치를 명시합니다:

ip route add 203.0.113.40/32 via 192.168.10.1 dev eth0

그 경로는 조회가 그 표에 도달할 때만 도움이 됩니다. 정책 규칙은 순서대로 평가되고 첫 일치가 결정하므로, 모든 것을 두 번째 표로 보내는 규칙은 main의 호스트 경로를 우회합니다. 경로가 권위 있다고 가정하기 전에 규칙을 읽으십시오:

ip rule show
ip route get 203.0.113.40

정책이 그들에 의존할 때 클라이언트가 쓰는 것과 같은 원본 주소나 표시로 두 번째 명령을 질의하십시오. 커널이 선택할 경로를 보고하는데, 이는 조회에 대한 증거이지 살아 있는 소켓이 그 경로를 쓴다는 증거는 아닙니다.

엔드포인트가 움직일 때

여러 주소로 확인되는 호스트 이름은 응답이 바뀌는 순간 영구 /32를 무효화합니다. 여러 remote 줄이 있는 프로필도 클라이언트가 그중 어디에나 착지할 수 있기 때문에 같은 문제를 겪습니다. 수동으로 추가하는 대신 클라이언트 자체의 수명 주기 훅에서 경로를 새로 고치십시오. up 스크립트는 협상된 피어를 읽고 호스트 경로를 설치하여 예외를 현실과 일치시켜 유지하고, 대응하는 down 스크립트가 그것을 제거합니다.

새로 고침은 호스트의 나머지 라우팅 설정과 같은 곳에 기록하십시오. 다음 재부팅까지만 존재하는 경로는 테스트이지 수정이 아닙니다.

안쪽 정책은 따로 두라

바깥 경로를 옮겨도 새 사설 서브넷에 접근할 수 없고 서버가 터널로 밀어 넣는 목적지도 바뀌지 않습니다. 하위 계층 경로는 회선을 고르고, 밀어 넣은 경로는 터널에 무엇이 들어가는지 고릅니다. 이 두 결정을 분리해 두는 것이 분할을 예측 가능하게 만듭니다.

목적이 암호화된 전송을 종량제 링크에서 떼어 두는 것뿐이라면 기본 경로는 그대로 두고 단일 호스트 예외를 추가하십시오. VPN 연결 하나를 옮기려고 시스템 전체의 기본 경로를 바꾸면 호스트의 다른 모든 응용 프로그램이 깨집니다.

결과는 소켓의 로컬 주소와 장치, 그리고 사설 목적지가 확인되는 경로라는 두 가지 독립적인 관찰로 확인하십시오. 둘 다 의도와 일치하면 분할은 실제입니다. OpenVPN 2.6 설명서는 클라이언트가 어느 주소로 연결하는지 결정하는 remote 및 로컬 바인딩 옵션을 다룹니다.

관련 글