linux - 使用 ip link 连接多个 Chroot Jails
问题描述
我在网上做了一些研究,但我并没有真正找到任何关于如何在两个或多个 chroot 监狱之间建立通信链接的信息。“标准”似乎只是使用单个 chroot 监狱进行沙盒。
为了把事情放在上下文中,我试图执行 docker 容器的基本功能,但使用 chroot 监狱。那么,就像两个 docker 容器可以通过 IP 相互 ping 和/或连接到同一个用户定义的 docker 网络上一样,这可以存在于两个 chroot 监狱吗?
我知道容器和 chroot 监狱是不同的东西,我对两者都很熟悉。我只需要知道是否有一种方法可以以与链接两个容器类似的方式链接两个 chroot 监狱,或者这是否不存在而我只是在浪费时间
解决方案
Docker 没有什么神奇之处:它只是使用 Linux 内核提供的工具来实现各种隔离。您可以利用相同的功能。
Docker“网络”只不过是主机上的桥接设备。您可以使用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 容器具有与主机不同的网络环境。这称为网络命名空间,您可以使用ip netns
命令手动操作它们。
您可以使用该命令创建网络命名空间。ip netns add
例如,这里我们创建了两个命名空间,命名为chroot1
and chroot2
:
ip netns add chroot1
ip netns add chroot2
接下来,您将创建两对veth 网络接口。每对的一端将附加到上述网络命名空间之一,另一端将附加到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
现在配置网络命名空间内的接口。我们可以使用命令的-n
选项来执行此操作ip
,这会导致命令在指定的网络命名空间内运行:
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等工具的原因,因为有很多东西需要手动管理。
推荐阅读
- java - 我的二维数组程序的打印输出出现问题
- c++ - Makefile 找不到共享库
- spring - Spring Data JPA - 具有规范和可分页的基于类的投影
- swift - 如何在 Xcode 中查看 *public only* Swift 文件的界面?
- javascript - 如何在范围滑块的句柄之间添加文本
- rust - 无法在 Raspberry PI3 上编译静态二进制文件
- c# - 对多个数组进行排序和切片
- sql - 计算整年日期之前的记录
- animation - 如何为落下的水滴设置动画?
- node.js - Sequelize:当对象从桌子上拉出时,有什么方法可以修改它?