Ping이 새 C 컨테이너에서 작동하지 않습니다.

Ping이 새 C 컨테이너에서 작동하지 않습니다.

나는 처음부터 C로 나만의 Linux 컨테이너를 작성해 왔습니다. 여러 곳에서 코드를 빌려 기본 버전을 제공했습니다.네임스페이스&cgroup.

기본적으로 나는클론모두가 함께하는 새로운 프로세스clone_new*새 네임스페이스 생성을 위한 플래그복제됨프로세스.

또한 다음을 삽입하여 UID 매핑을 설정했습니다.0 0 1000입력하다uid_map그리고gid_map문서. 확실히하고 싶어뿌리컨테이너 내부는 다음과 같이 매핑됩니다.뿌리외부.

파일 시스템의 경우 기본 이미지를 사용했습니다.긴장내장부팅 방지 프로그램.

이제 컨테이너 내부에서 네트워크 연결을 설정하려고 합니다. 나는 사용했다이것컨테이너 내부의 인터페이스를 설정하기 위한 스크립트입니다. 이 스크립트는 고유한 새 네트워크 네임스페이스를 생성합니다. 새로 생성된 네트워크 네임스페이스에 생성된 프로세스의 네트워크 네임스페이스를 스크립트를 통해 설치하도록 살짝 편집했습니다.

mount --bind /proc/$PID/ns/net /var/run/netns/demo

다음과 같이 새 네트워크 네임스페이스를 입력할 수 있습니다.

ip netns exec ${NS} /bin/bash --rcfile <(echo "PS1=\"${NS}> \"")

외부에서 성공적으로 핑을 보냈습니다.

그러나 기본적으로 복제 프로세스를 시작하면 bash 셸에서 ping을 실행할 수 없습니다. 오류가 발생합니다.

ping: socket: Operation not permitted

기능 설정을 시도했습니다.cap_net_raw그리고cap_net_admin

안내를 좀 받고 싶습니다.

답변1

나는 좀 더 완전한 사양으로 작업하는 것을 선호합니다. 그러나 스크립트와 설명을 주의 깊게 읽은 결과 스크립트를 사용하여 네트워크 네임스페이스를 먼저 입력한 다음 사용자 네임스페이스를 입력한다는 결론을 내렸습니다.

netns는 하위 사용자가 아닌 초기 사용자가 소유합니다. 이렇게 하려면 pingnetns를 소유한 사용자에서 cap_net_raw를 사용해야 합니다. 제 생각에는.

참조 문서에 대한 링크를 제공하는 유사한 답변은 다음과 같습니다.Linux 및 사용자 네임스페이스의 기능

(ICMP 소켓에 액세스할 수 있으면 권한 없이도 작동할 수 있다고 생각합니다 ping. 하지만 적어도 내 Fedora 29에서는 이 작업이 수행되지 않는 것 같습니다. Unprivileged는 cp "$(which ping)" && ping localhost동일하게 표시됩니다 socket: Operation not permitted. 왜 수행되지 않는지 잘 모르겠습니다.)

관련 정보