특별한 resolv.conf를 사용하도록 프로그램에 지시

특별한 resolv.conf를 사용하도록 프로그램에 지시

/etc/resolv.conf프로그램이 특수 파일을 사용하도록 속여 비표준 이름 서버를 사용하도록 하고 싶습니다 .

확실한 해결책은 하나의 파일을 제외한 전체 파일 시스템을 다시 만들고 chroot를 사용하는 것입니다. 하지만 아마도 이 작업을 수행하는 더 쉬운 방법이 있을 것입니다.

특정 프로세스에 대해서만 파일 내용을 변경하려면 어떻게 해야 합니까?많은 경우에 작동하지만 작동하지 않는 솔루션을 제공합니다 /etc/resolv.conf. LD_PRELOADlibc 내의 파서가 열릴 때 이를 포착하지 못하고 /etc/resolv.conf바인드 마운트가 심볼릭 링크를 덮어쓸 수 없습니다(링크 대상이 없거나 나중에 링크가 변경된 경우).

편집 : 관련 질문은깨진 심볼릭 링크에 파일을 설치하는 방법은 무엇입니까?일반적인 해결책을 찾을 수 없습니다

답변1

하나는 사용할 수 있습니다overlayfs중복을 피하기 위해. 일시적인 경우에는 를 사용하여 모든 작업을 수행할 수 있습니다 /tmp. 마운트 네임스페이스와 결합하면 개별 애플리케이션에 영향을 미칠 수 있습니다. 루트에서 준비(일반 사용자가 루트로 매핑되는 user+mount 네임스페이스에서 작동하지만 권한 도움말 및/또는 최신 pid 변환 커널이 없으면 사용자 매핑은 유용한 작업을 수행하는 데 도움이 되지 않습니다).

  • 새 마운트 네임스페이스 생성
  • overlayfs만들기
  • 이 오버레이를 바인딩하여 다시 마운트하세요./etc
  • 콘텐츠 변경(예: /etc/resolv.conf심볼릭 링크 제거 및 맞춤 콘텐츠가 포함된 일반 파일 생성 /etc/resolv.conf)
  • 이 마운트된 네임스페이스에서 애플리케이션을 계속 실행합니다.

예:

mkdir /tmp/upper /tmp/work /tmp/fake_etc
unshare -m

다음 명령은 새 마운트 네임스페이스에서 실행됩니다.

mount -t overlay -olowerdir=/etc,upperdir=/tmp/upper,workdir=/tmp/work overlay_etc /tmp/fake_etc

그런 다음 /etc내용을 위조하는 데 사용된 것으로 덮어씁니다.

mount --bind /tmp/fake_etc /etc

변경합니다(마운트 네임스페이스의 오버레이에만 영향을 줍니다).

rm /etc/resolv.conf
echo nameserver 192.0.2.2 > /etc/resolv.conf

AFAIK를 설치할 수 없습니다참조를 유지하기 위한 네임스페이스입니다. 원하는 경우 대신 마운트 네임스페이스에서 PID 참조를 사용할 수 있습니다.

# echo $$
325304

동일한 셸 또는 별도의(루트) 셸에서 다음 명령을 실행합니다.

nsenter -t 325304 --mount

그런 다음 이전 예를 따르십시오(이름 서버 192.0.2.2에 연결할 수 없음).

# su - -c 'ping stackexchange.com' someuser 
ping: stackexchange.com: Name or service not known

다른 곳에서는 평소와 같이 업무가 진행될 것입니다 ping.

답변2

당신은 그것을 사용할 수 있습니다bubblewrap마운트 네임스페이스를 생성합니다. Flatpak에서 요구하기 때문에 대부분의 배포판에 포함되어 있습니다.

bwrap \
    --bind / / \
    --bind /home/user/resolv.conf /etc/resolv.conf \
    binary parameter1 parameter2d

관련 정보