이름 확인은 chroot 사용자에게는 작동하지 않지만 루트에서는 작동합니다.

이름 확인은 chroot 사용자에게는 작동하지 않지만 루트에서는 작동합니다.

해당 시스템을 실제로 부팅하지 않고 다른 작업 시스템에서 일부 패키지를 다운로드, 컴파일 및 설치하기 위해 live-cd를 시작했습니다.

다음 명령을 실행하여 시스템에 빌드 사용자를 생성했습니다.useradd -m -G wheel -s /bin/bash builder

그런 다음 파티션과 chroot 환경을 설치했습니다.

# mount /dev/mapper/luksdev on /mnt
# cd /mnt
# cp /etc/resolv.conf etc
# mount -t proc /proc proc
# mount --make-rslave --rbind /sys sys
# mount --make-rslave --rbind /dev dev
# mount --make-rslave --rbind /run run
# chroot /mnt /bin/bash

그런 다음 Clone하고 Chown하고 빌드할 프로젝트로 이동합니다.

(chroot)# git clone https://aur.archlinux.org/lighttpd2-git.git /home/builder/lighttpd2
(chroot)# chown -R builder.builder /home/builder/lighttpd2
(chroot)# sudo -u builder -s
(chroot|builder ~)$ cd /home/builder/lighttpd2/
(chroot|builder lighttpd2)$ /usr/bin/makepkg -s --noconfirm

루트로서 이름 조회를 수행하는 데 아무런 문제가 없으므로 git clone예상대로 작동합니다. 하지만 이 패키지를 빌드하는 동안 다른 사용자로 전환하세요.(또는 git clone루트가 아닌 사용자로 실행하는 경우), 나는 다음을 얻을 것이다:

fatal: unable to access 'https://git.lighttpd.net/lighttpd/lighttpd2.git/': Could not resolve host: git.lighttpd.net

ping그래서 문제를 파악하기 위해 간단한 검사를 해볼까 생각했습니다 . ping www.google.com처럼 행동하되 root그렇게 하지 마십시오 builder. 그러나ping 8.8.8.8 둘 다에 유효 root& builder.

(chroot)# ping -c 1 www.google.com
PING www.google.com (172.217.22.164) 56(84) bytes of data.
64 bytes from arn09s11-in-f164.1e100.net (172.217.22.164): icmp_seq=1 ttl=55 time=2.03 ms

(chroot|builder)$ ping -c 1 www.google.com
ping: www.google.com: Name or service not known

(chroot)# ping -c 1 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=121 time=1.97 ms

(chroot|builder)$  ping -c 1 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=121 time=1.98 ms

논리적으로 이것은 특정 사용자의 이름 확인과 관련이 있다고 생각합니다. 하지만 이렇게 하면:

(chroot)# nslookup www.google.com
Server:    8.8.8.8
Name:      www.google.com
Address: 216.58.207.196

(chroot|builder)$ nslookup www.google.com
Server:    8.8.8.8
Name:      www.google.com
Address: 216.58.207.196

두 사용자 모두 nslookup을 실행할 수 있으며 이는 /etc/resolv.conf존재하고 유효한 것으로 보입니다. 그러나 호스트 이름을 ping하거나 nslookup/dig 이외의 모든 종류의 이름 확인 작업을 사용하면 작동하지 않습니다.

(chroot|builder)$ python
>>> from socket import *
>>> s = socket()
>>> s.connect(('www.google.com', 80))
socket.gaierror: [Errno -2] Name or service not known

간단하게 하기 위해 ping만 사용해 보았습니다.
또한 다음을 사용하여 내 핑을 차단하는 것이 없는지 확인하려고 시도했습니다.

(chroot)# chown root:root /bin/ping; chmod u+srwx,go=rx /bin/ping
(chroot)# getcap /usr/bin/ping
/usr/bin/ping = cap_net_raw+ep

하지만 그때에도 호스트 이름으로 핑을 할 수는 없지만 IP는 여전히 작동합니다.

(chroot|builder)$ strace ping www.google.com
socket(AF_INET, SOCK_DGRAM, IPPROTO_ICMP) = -1 EACCESS (Permission denied)
socket(AF_INET, SOCK_RAW, IPPROTO_ICMP) = -1 EPERM (Operation not permitted)
write(2, "ping: socket: Operation not perm"..., 38ping: socket: Operation not permitted)= 38

/home그리고 /root둘 다 설치되어 있지 않습니다 nosuid. 안타깝게도 이것은 가상 머신이므로스크린샷의.

에서 ping을 시도하고 있으므로 /home이것이 왜 문제를 일으키는지 알 수 없습니다. 시스템으로 부팅하고 live-cd 부팅 중에 생성한 사용자로 똑같은 작업을 수행하면 호스트 이름을 ping할 수 있습니다.

이 시점에서 나는 왜 일부 사용자는 ping, 조회 등을 수행할 수 있지만 다른 사용자는 chroot 환경에서 수행할 수 없는지 이해하고 싶습니다. 근본적인 문제를 해결하거나 이해하기 위해 여기에서 디버깅/계속을 어디서 시작해야 할지 잘 모르겠습니다. IRC의 일부 도움을 주는 사람들도 연락을 시도했지만 우리는 모두 혼란스러웠습니다.

편집하다:

mount --make-rslave --rbind /run run문제 로 좁혀봤습니다 . 이유가 무엇이든 이것이 이유입니다. 문제가 시작될 때 ping www.google.com각 명령을 실행한 후 시도하면 설치 직후에 중지됩니다.mount/run

여기에 이미지 설명을 입력하세요.

관련 정보