使用 ip link 连接多个 Chroot 监狱
Using ip link To Connect Multiple Chroot Jails
我在网上做了一些研究,但我并没有真正找到任何关于如何在两个或多个 chroot 监狱之间建立通信 link 的信息。 "standard" 似乎只是使用一个单独的 chroot jail 进行沙箱处理。
具体来说,我正在尝试执行 docker 容器的基本功能,但使用 chroot 监狱。因此,就像两个 docker 容器可以通过 IP and/or 相互 ping 连接到同一个用户定义的 docker 网络一样,两个 chroot 监狱是否存在这种情况?
我知道容器和 chroot 监狱是不同的东西,我对两者都很熟悉。我只需要知道是否有办法 link 两个 chroot 监狱以类似于 linking 两个容器的方式,或者如果这是不存在的,我只是在浪费我的时间
Docker 没有什么神奇之处:它只是使用 Linux 内核提供的功能来启用各种隔离。您可以利用相同的功能。
A Docker "network" 只不过是主机上的桥接设备。您可以使用 brctl
或 ip link
命令轻松创建它们,如:
ip link add mynetwork type bridge
您需要激活界面并分配一个 IP 地址:
ip addr add 192.168.23.1/24 dev mynetwork
ip link set mynetwork up
一个Docker容器有一个独立于主机的网络环境。
这称为 network namespace,您可以通过
使用 ip netns
命令。
您可以使用 ip netns add
命令创建 网络命名空间。例如,这里我们创建了两个名称空间 chroot1
和 chroot2
:
ip netns add chroot1
ip netns add chroot2
接下来,您将创建两对 veth network interfaces。每对的一端将附加到上述网络命名空间之一,另一端将附加到 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 这样的工具的原因,因为
有很多东西需要手动管理。
我在网上做了一些研究,但我并没有真正找到任何关于如何在两个或多个 chroot 监狱之间建立通信 link 的信息。 "standard" 似乎只是使用一个单独的 chroot jail 进行沙箱处理。
具体来说,我正在尝试执行 docker 容器的基本功能,但使用 chroot 监狱。因此,就像两个 docker 容器可以通过 IP and/or 相互 ping 连接到同一个用户定义的 docker 网络一样,两个 chroot 监狱是否存在这种情况?
我知道容器和 chroot 监狱是不同的东西,我对两者都很熟悉。我只需要知道是否有办法 link 两个 chroot 监狱以类似于 linking 两个容器的方式,或者如果这是不存在的,我只是在浪费我的时间
Docker 没有什么神奇之处:它只是使用 Linux 内核提供的功能来启用各种隔离。您可以利用相同的功能。
A Docker "network" 只不过是主机上的桥接设备。您可以使用 brctl
或 ip link
命令轻松创建它们,如:
ip link add mynetwork type bridge
您需要激活界面并分配一个 IP 地址:
ip addr add 192.168.23.1/24 dev mynetwork
ip link set mynetwork up
一个Docker容器有一个独立于主机的网络环境。
这称为 network namespace,您可以通过
使用 ip netns
命令。
您可以使用 ip netns add
命令创建 网络命名空间。例如,这里我们创建了两个名称空间 chroot1
和 chroot2
:
ip netns add chroot1
ip netns add chroot2
接下来,您将创建两对 veth network interfaces。每对的一端将附加到上述网络命名空间之一,另一端将附加到 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 这样的工具的原因,因为
有很多东西需要手动管理。