名称解析在 chroot 中对用户不起作用,但对 root 有效

名称解析在 chroot 中对用户不起作用,但对 root 有效

我启动了一个 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安装后立即停止。

在此输入图像描述

相关内容