使用 ip 链接连接多个 chroot 监狱



我在网上做了一些研究,但我并没有真正找到任何关于如何在两个或多个chroot监狱之间建立通信链接的信息。"标准"似乎只是使用单个 chroot 监狱进行沙盒处理。

为了将事情放在上下文中,我正在尝试执行 docker 容器的基本功能,但使用 chroot jail。那么,就像两个 docker 容器可以通过 IP 相互 ping 和/或连接到同一个用户定义的 docker 网络上一样,两个 chroot 监狱可以存在吗?

我知道容器和chroot监狱是不同的东西,我熟悉两者。我只需要知道是否有办法以类似于链接两个容器的方式链接两个 chroot 监狱,或者这是否不存在,我只是在浪费我的时间

Docker 没有什么神奇之处:它只是使用 Linux 内核提供的工具来启用各种隔离。 您可以利用相同的功能。

Docker"网络"只不过是主机上的桥接设备。 您可以使用brctlip link命令轻松创建它们,如下所示:

ip link add mynetwork type bridge

您需要激活接口并分配 IP 地址:

ip addr add 192.168.23.1/24 dev mynetwork
ip link set mynetwork up

Docker 容器具有与主机不同的网络环境。 这称为网络命名空间,您可以通过以下方式操作它们 与ip netns命令的手。

您可以使用ip netns add命令创建网络命名空间。 例如,这里我们创建两个名为chroot1chroot2的命名空间:

ip netns add chroot1
ip netns add chroot2

接下来,您将创建两对虚拟网络接口。 每对的一端将附加到上述网络命名空间之一,另一端将附加到mynetwork网桥:

# create a veth-pair named chroot1-inside and chroot1-outside
ip link add chroot1-inside type veth peer name chroot1-outside
ip link set master mynetwork dev chroot1-outside
ip link set chroot1-outside up
ip link set netns chroot1 chroot1-inside
# do the same for chroot2
ip link add chroot2-inside type veth peer name chroot2-outside
ip link set netns chroot2 chroot2-inside
ip link set chroot2-outside up
ip link set master mynetwork dev chroot2-outside

现在配置网络命名空间内的接口。 我们可以使用ip命令的-n选项来执行此操作,这会导致 要在指定的网络命名空间内运行的命令:

ip -n chroot1 addr add 192.168.23.11/24 dev chroot1-inside
ip -n chroot1 link set chroot1-inside up
ip -n chroot2 addr add 192.168.23.12/24 dev chroot2-inside
ip -n chroot2 link set chroot2-inside up

请注意,在上面,ip -n <namespace>只是以下方面的快捷方式:

ip netns exec <namespace> ip ...

因此:

ip -n chroot1 link set chroot1-inside up

相当于:

ip netns exec chroot1 ip link set chroot1-inside up

(显然旧版本的iproute包不包括-n选项。

最后,您可以在这些环境中启动chroot环境。 两个命名空间。 假设您的chroot文件系统挂载在/mnt,在一个终端中运行:

ip netns exec chroot1 chroot /mnt bash

在另一个终端中:

ip netns exec chroot2 chroot /mnt bash

你会发现这两个 chroot 环境可以相互 ping 对方。 例如,在chroot1环境中:

# ip addr show
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
36: chroot1-inside@if35: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP qlen 1000
link/ether 12:1c:9c:39:22:fa brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 192.168.23.11/24 scope global chroot1-inside
valid_lft forever preferred_lft forever
inet6 fe80::101c:9cff:fe39:22fa/64 scope link 
valid_lft forever preferred_lft forever
# ping -c1 192.168.23.12
PING 192.168.23.12 (192.168.23.12) 56(84) bytes of data.                
From 192.168.23.1 icmp_seq=1 Destination Host Prohibited                
--- 192.168.23.12 ping statistics ---                                   
1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms

他们可以 ping 主机:

# ping -c1 192.168.23.1                                    
PING 192.168.23.1 (192.168.23.1) 56(84) bytes of data.     
64 bytes from 192.168.23.1: icmp_seq=1 ttl=64 time=0.115 ms
--- 192.168.23.1 ping statistics ---                       
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.115/0.115/0.115/0.000 ms          

当然,要使这个chroot环境有用,有一堆 缺少的东西,例如/proc上的虚拟文件系统,/sys, 和/dev. 设置所有这些并将其干净地拆回原处 这就是为什么人们使用像Docker或systemd-nspawn这样的工具,因为 有很多东西需要手动管理。

最新更新