我启动了一个 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
之后,我克隆、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
作为 root,我在执行名称查找时没有任何问题,因此它将git clone
按预期工作。但是在这个包的构建过程中切换到任何其他用户(或者如果我git clone
以非root身份运行), 我会得到:
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。
我还尝试确保没有任何东西阻止我的 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
但即便如此,我也不允许使用主机名 ping,但 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
安装后立即停止。