첫 시작이 /dev/net/tun 또는 열 수 없는 TUN/TAP 장치에 대한 메시지와 함께 실패합니다. 인증서는 아직 읽히지 않았으므로 프로필 쪽에는 문제가 없습니다. 데몬이 커널에 요청하는 객체를 이 게스트가 가지고 있지 않은 것입니다.

그 객체는 tun 모듈이 제공하는 문자 장치입니다. 그것을 만들 수 있는지는 커널을 누가 소유하느냐에 달려 있습니다.

데몬이 커널에 요청하는 것

OpenVPN은 /dev/net/tun을 열고 드라이버에 인터페이스를 요청합니다. 드라이버는 tun 모듈이고, 장치 노드는 사용자 공간이 그것에 도달하기 위해 쓰는 핸들입니다. 모듈이 적재되지 않았다면 노드가 없거나 열기가 실패할 수 있습니다. 두 경우 모두 server.conf을 편집해서 고쳐지지 않습니다.

이 오류를 먼저 플랫폼에 관한 질문으로 읽으십시오. 설정 오류는 장치가 열린 뒤에 나타나며 그 전에는 나타나지 않습니다.

VM인가, 커널을 공유하는 게스트인가

KVM, Xen 또는 다른 완전한 가상 머신에서는 커널을 직접 제어합니다. 모듈을 적재하고 노드를 만들 수 있습니다. OpenVZ, Virtuozzo 또는 LXC 방식 컨테이너에서는 게스트가 호스트 커널을 공유하므로, 그 안의 root도 호스트가 적재하지 않은 모듈을 적재할 수 없습니다.

따라서 같은 실패에도 책임자가 전혀 다릅니다. 전자라면 인스턴스 안에서 고칠 수 있습니다. 후자라면 호스트나 제공자에게 무언가를 노출해 달라고 요청하는 셈입니다.

어느 경우인지 판단하기 전에 ls -l /dev/net/tun, lsmod | grep tun, ip -brief link show를 실행하십시오.

VM에서는 부팅 시 모듈을 적재하십시오

가상 머신에서는 modprobe tun이 보통 장치 노드를 만듭니다. 노드가 생겼는지 확인한 다음, 한 번 입력한 명령에 의존하지 말고 배포판의 모듈 설정으로 적재를 영구화하십시오. 재부팅 후 사라지는 노드는 다음 달에 같은 티켓이 됩니다.

부팅한 커널에 그 모듈이 아예 있는지도 확인하십시오. 군더더기를 덜어낸 벤더 커널에는 없을 수 있습니다.

노드는 있는데 열기가 여전히 실패한다면, 다음 용의자는 권한과 장치의 major/minor 번호입니다. 그것들은 로컬 수정이며 제공자에게 보내는 요청이 아닙니다.

컨테이너에서는 장치가 호스트 소유입니다

컨테이너에서 장치와 권한은 별개의 두 요구 사항입니다. 런타임이 /dev/net/tun을 통과시켜야 하고, 컨테이너에는 인터페이스를 만들 네트워크 권한이 필요합니다. 둘 다 주지 않는 rootless 런타임은 프로필을 어떻게 쓰든 같은 열기 오류를 계속 냅니다. 많은 OpenVZ 호스트가 고객 패널에 TUN/TAP 토글을 제공하며, 그것을 켜고 재시작하는 것만으로 해결되는 경우가 많습니다.

제공자에게 호스트에 tun 모듈이 적재되어 있는지, 이 인스턴스 안에서 장치가 사용 가능한지 정확히 물으십시오. 모호한 티켓에는 모호한 답만 돌아옵니다.

모듈을 다시 빌드해도 거의 도움이 되지 않는 이유

게스트 안에서 모듈을 빌드하는 것은 거의 도움이 되지 않습니다. 컴파일에는 실행 중인 커널의 정확한 설정이 필요하고, /proc/config.gz은 선택 사항이며 최소 이미지에는 흔히 없습니다. 동작하는 모듈조차 컨테이너가 소유하지 않은 커널에는 넣을 수 없습니다.

장치가 나타난 뒤 서비스를 재시작하고, 트래픽을 시험하기 전에 인터페이스를 확인하십시오. tun0이 보이는 것은 데몬이 장치를 열었다는 뜻입니다. 포워딩, 방화벽 규칙, 클라이언트가 받는 경로에 대해서는 아직 아무것도 말해 주지 않습니다.

이들은 각각 다른 증거를 가진 별개의 질문입니다. 장치가 없는 것은 전제 조건의 실패이고, 존재하지만 아무것도 나르지 않는 터널은 정책의 실패입니다.

관련 글