/etc/resolv.conf
프로그램이 특수 파일을 사용하도록 속여 비표준 이름 서버를 사용하도록 하고 싶습니다 .
확실한 해결책은 하나의 파일을 제외한 전체 파일 시스템을 다시 만들고 chroot를 사용하는 것입니다. 하지만 아마도 이 작업을 수행하는 더 쉬운 방법이 있을 것입니다.
특정 프로세스에 대해서만 파일 내용을 변경하려면 어떻게 해야 합니까?많은 경우에 작동하지만 작동하지 않는 솔루션을 제공합니다 /etc/resolv.conf
. LD_PRELOAD
libc 내의 파서가 열릴 때 이를 포착하지 못하고 /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