새 컨테이너 로그는 /proc/sys/net/ipv4/route/flush 에 대한 Read-only file system 불만으로 끝나는 경우가 많고, 그 줄이 완전히 정상일 수도 있는 터널 탓으로 돌려집니다. 그 뒤의 쓰기는 IPv4 경로 캐시가 사라진 뒤로 더는 유용한 일을 하지 않는 커널 항목을 겨냥합니다. 컨테이너 안에서 /proc/sys 은 읽기 전용으로 마운트되므로 값이 들어가기 전에 리디렉션이 거부되고 셸이 그 거부를 출력합니다. 동작하는 터널도 옛 줄이 스크립트에 남아 있는 한 이 경고를 계속 출력할 수 있고, --privileged 은 쓰기를 결코 의미 있게 만들지 않습니다.

스크립트가 플러시하려던 것

오래된 연결 스크립트는 캐시 정리로 끝났습니다. 커널 제어 파일에 값을 쓰고 IPv4 스택에 라우팅 캐시를 버리라고 요청해서, 오래된 항목이 만료되기를 기다리지 않고 새 터널 경로가 선택되게 했습니다. 파일은 /proc/sys/net/ipv4/ 아래에 지정되어 있었기 때문에 이 작업은 라우팅 명령이 아니라 셸 리디렉션이 되었습니다. 커널 3.6이 그 캐시를 제거했고, 플러시가 존재하던 이유도 함께 사라졌습니다. 현재 데이터 경로에서 그 쓰기에 의존하는 것은 없습니다.

항목 자체는 레거시 쓰기 전용 파일로 남았으므로, 아직 거기에 쓰는 스크립트는 실제 경로와 실제 권한 검사에 도달합니다. 호스트에서는 쓰기가 성공을 반환하고 아무것도 바꾸지 않습니다. 컨테이너에서는 같은 리디렉션이 읽기 전용 /proc/sys 에 부딪혀 EROFS 로 실패하고, 셸은 이를 읽기 전용 파일 시스템 메시지로 출력합니다. 경로가 정말로 없는 커널에서는 문구가 No such file or directory 이 되며 결론은 바뀌지 않습니다.

두 오류는 다른 이야기를 하며, 그 차이는 분명히 유지할 가치가 있습니다. Read-only file system 은 커널이 항목에 도달해 쓰기를 거부했다는 뜻이고, No such file or directory 은 항목이 사라졌다는 뜻입니다. 어느 메시지도 터널 장치, 경로, 이름 해석에 대해 보고하지 않으므로 어느 것도 더 많은 권한을 정당화할 수 없습니다.

메시지를 원인처럼 보이게 하는 것은 순서입니다. 연결 스크립트는 마지막 정리에 도달하기 전에 경로를 설치하고, 인터페이스 상태를 바꾸고, 이름 해석을 다시 씁니다. 그래서 마지막으로 출력된 줄이 사람들이 인용하는 줄이 됩니다. 중요한 단계가 모두 성공을 반환했더라도 마찬가지입니다. 이 경고를 출력하면서 연결되고 트래픽을 실어 나르는 터널은 위의 메커니즘과 정확히 들어맞습니다.

권한을 추가하기 전에 마운트와 경로를 확인하십시오

세 가지 확인이 겉모습의 경고와 실제 장애를 구분합니다. 설치된 스크립트에 아직 그 줄이 있는지, /proc/sys 이 어떻게 마운트되었는지, 그리고 애플리케이션 트래픽이 실제로 어디로 가는지 입니다. 경고가 나타난 같은 컨테이너 네임스페이스나 호스트에서 실행하십시오. 무관한 머신에서의 확인은 다른 질문에 답할 뿐입니다.

grep -n 'ipv4/route/flush' /usr/share/vpnc-scripts/vpnc-script
findmnt -no OPTIONS /proc/sys
ip -4 route get 10.20.5.10

grep의 답은 보기보다 약합니다. 일치한다는 것은 그 줄이 존재한다는 증거일 뿐, 보호 없이 실행된다는 뜻은 아닙니다. 유지 관리되는 스크립트는 그 줄을 건너뛰는 가드 안에 쓰기를 담을 수 있습니다. findmnt -no OPTIONS /proc/sys 는 마운트를 직접 판정하고, 그 출력의 ro 은 그 지점 아래의 모든 쓰기가 스크립트가 무엇을 하든 거부된다는 뜻입니다. 이어서 경로 조회는 애플리케이션에 필요한 대상이 터널 인터페이스로 해석되는지 컨테이너의 기본 게이트웨이로 해석되는지를 보여 줍니다. 기본 게이트웨이를 고르는 조회는 터널은 올라왔지만 아무것도 그리로 라우팅되지 않는다는 뜻이며, 이는 권한 문제가 아니라 라우팅 문제입니다.

수정은 실제로 어디서 제공되는가

유지 관리되는 수정은 컨테이너 플래그가 아니라 스크립트에 있습니다. upstream vpnc-script 가 이 작업을 처리하는 방식을 바꾸었으므로, 이미지 안의 사본을 현재 upstream과 비교하고 그것을 제공하는 패키지나 이미지 빌드를 통해 업데이트하십시오. 실행 중인 컨테이너 안에서 손으로 편집한 파일은 검토할 수 없고 다음 빌드에서 살아남지 못합니다.

--privileged 은 모든 기능과 광범위한 장치 접근을 부여하는 것으로 문서화되어 있으며, 아무것도 바꾸지 않는 메시지에 대한 큰 양보입니다. 정말로 빠진 기능이 있다면 그 기능을 지목하십시오. 업데이트 후 경로 조회를 반복하고 애플리케이션이 터널을 사용하게 하십시오. 조용한 로그와 동작하는 연결은 별개의 결과입니다.

관련 글