클라이언트가 시작을 거부하며 로컬 주소를 바인드할 수 없다고 호소하고, 뻔한 해결책은 받을 것으로 기대하는 터널 주소를 가리키는 것처럼 보입니다. 그것은 동작할 수 없고, 이유를 이해할 가치가 있습니다. 터널이 존재하기 전에는 안쪽 주소가 없으며, 서버에 접속하는 소켓이 먼저 있어야 하고, 관련된 주소는 둘이지만 로컬에서 고를 수 있는 것은 하나뿐입니다.

바인드 오류가 가리키는 것은 로컬 주소

OpenVPN이 로컬 주소를 바인드할 수 없다고 보고할 때 말하는 것은 전송 소켓, 즉 피어로 암호화된 연결을 나르는 UDP 또는 TCP 종단점입니다.

명시적인 local 지시자는 그 소켓을 특정 로컬 주소에 바인드하도록 데몬에 요청합니다. 주소는 프로세스가 실행되는 네트워크 네임스페이스에 존재해야 하고, 클라이언트가 시작하는 시점에 할당 가능해야 합니다.

라우터나 클라우드 경계에서 변환되는 공인 주소는 서버가 보는 주소가 그것이더라도 데몬이 바인드할 수 있는 로컬 주소가 아닙니다. 이 구분이 한 프로필이 집에서는 동작하고 클라우드 인스턴스에서는 실패하는 이유를 설명합니다. 공인 주소를 loopback 인터페이스에 추가해도 도움이 되지 않는 이유도 같은데, 그 경우 전송이 네트워크가 응답을 돌려줄 수 없는 주소에서 나가기 때문입니다. 프로필을 편집하기 전에 인터페이스 목록을 읽으십시오.

local과 remote가 실제로 고르는 것

remote은 접속할 피어를 지정합니다. local는 같은 소켓의 가까운 쪽을 바인드합니다. nobind는 로컬 주소와 포트를 모두 운영체제가 고르게 하며, 그래서 가정용 라우터 뒤의 클라이언트는 보통 두 지시자 없이도 동작합니다.

두 지시자 모두 터널 안쪽 주소와는 아무 관계가 없습니다.

컨테이너나 네트워크 네임스페이스에서는 같은 규칙이 더 좁은 경계로 적용되는데, 호스트의 주소가 안에 없으므로 호스트 구성에서 복사한 local 줄은 잘못된 주소와는 전혀 다른 이유로 실패합니다.

ip -brief address show
ip route get 203.0.113.10

안쪽 주소는 서버에서 온다

터널 안쪽 주소는 제어 채널이 수립된 뒤에 협상되거나 할당됩니다. 동적 풀에서는 서버가 연결 시점에 결정하고, 클라이언트별 구성에서는 신원마다 고정될 수 있습니다.

안쪽 주소로 local를 쓰는 것은 서버에 그 주소를 할당해 달라고 요청하는 것이 아닙니다. 최선의 경우 바인드가 실패하고, 최악의 경우 클라이언트가 같은 값을 가진 무관한 호스트 주소를 찾아 전송에 사용하기 시작합니다.

읽어야 할 인터페이스도 다릅니다. ifconfig 매개변수와 풀 구성은 안쪽을 설명하고, remote, local, proto, nobind은 바깥쪽을 설명합니다. 두 목록을 분리해 두면 포럼에서 보게 되는 혼란스러운 예시가 거의 모두 설명됩니다. OpenVPN 2.6 설명서가 이들을 별도 절에 기록한 것도 같은 이유입니다.

함정: 자기 전송을 붙잡는 전체 터널

터널이 올라가 기본 경로를 나르게 되면, 터널을 유지하는 패킷은 그 안으로 라우팅되어서는 안 됩니다. 이것은 주소 문제가 아니라 라우팅 문제이며, 데몬은 원래 게이트웨이를 통해 서버 자신의 주소로 더 구체적인 경로를 설치해 처리합니다.

전송을 특정 로컬 주소에 고정한 뒤 그 주소가 쓰는 경로를 바꾸면, 안쪽은 구성된 채로 남아 있는데 바깥 연결이 길을 잃을 수 있습니다. 안쪽이 정상이므로 터널은 계속 연결되었다고 보고합니다. 깨진 것은 전송뿐이며, 그래서 로그가 모순처럼 읽힙니다.

그때 증상은 연결된 뒤 멈추는 터널, 또는 쓸모 있는 오류 없이 루프에서 다시 연결되는 터널처럼 보입니다. 터널 안쪽을 확인하기 전에 피어 주소로 가는 경로를 확인하고, 바인드한 로컬 주소가 여전히 예상한 인터페이스에 속하는지 확인하십시오.

혼란을 막는 습관

프로필의 모든 주소를 읽고 편집하기 전에 어느 계층에 속하는지 결정하십시오.

전송의 먼 쪽을 지정하거나 가까운 쪽을 바인드한다면 그것은 바깥 주소이며 시작 전에 존재해야 합니다. 터널 안에서 일어나는 일을 설명한다면 그것은 서버나 토폴로지에서 오는 것이며, 어떤 로컬 지시자도 그것을 대체할 수 없습니다.

두 목록을 프로필 옆의 배포 메모에 적어 두십시오. 그러면 다음 문제 해결 세션은 추측이 아니라 계층에서 시작됩니다.

관련 글