我使用创建一个网络命名空间unshare --map-root-user --net --mount --keep-caps "do_stuff"
。
我使用将命名空间连接到互联网slirp4netns --configure --mtu=65520 $ns-id tap0
。这还允许我通过 命名空间内
进行访问,因此我可以在主机上运行 Web 服务器并从命名空间内连接到它。localhost
10.0.2.2
是否可以运行网络服务器在命名空间中,并从主机连接到它?类似于端口转发之类的东西?
答案1
这是一种完全绕过命名空间限制来转发 TCP 端口的方法。
socat
和 UNIX 套接字
一种不受名称空间阻碍的通信是标准(命名)UNIX套接字(仅抽象的UNIX 套接字依赖于网络命名空间)。使用一对socat
命令通过 UNIX 套接字代理 TCP,可以轻松地从主机到用户/网络命名空间进行通信。
假设 OP 的变量$ns_id
(用 a 更改_
为具有正确的语法)具有正确的 PID 内容。以下是使用两个附加终端以交互方式运行的示例:
term1:(用户/网络命名空间部分)
socat
可以在命令中直接从 OP 的 user/net 命名空间分叉,"do_stuff"
以节省nsenter
.这里它是从主机/初始命名空间运行的
nsenter
加入最近创建的命名空间:nsenter --preserve-credentials --user --mount --net -t $ns_id -- socat UNIX-LISTEN:/tmp/conduit,unlink-early,fork TCP4:127.0.0.1:80
term2(主机/初始命名空间部分):
socat TCP4-LISTEN:8080,reuseaddr,fork UNIX-CONNECT:/tmp/conduit
现在可以连接到 http://<host>:8080/ 来到达 user/net 命名空间的 Web 服务器,该服务器在端口 80 上侦听。流量通过 UNIX 套接字/tmp/conduit
。
笔记
此设置甚至
slirp4netns
根本不需要运行,只要用户/网络命名空间收到了ip link set dev lo up
使 TCP/IP 可用的命令某处。人们甚至可以想象配置 Web 服务器(可能nginx
然后)本身直接监听 UNIX 套接字而不是 TCP 端口 80 并仅保留第二个socat
命令(尽管我不保证任何命令的正确处理)套接字凭证如果使用了这些)。同样,人们应该能够以有限的方式代理 UDP 流量,但根据 UDP 的使用,有各种注意事项。某些用途只需将
socat
命令的 TCP 部分更改为 UDP,其他用途还需要将 UNIX 套接字部分从流套接字更改为数据报套接字(UNIX-LISTEN
->UNIX-RECVFROM
等)。可能还需要-T
超时选项。socat
未测试。
答案2
好像插座盒专门设计用于无需设置即可公开隔离网络命名空间内的服务的工具veth
。
也许是我自己的工具netns_tcp_bridge也可以实现类似的效果(效率较低),但我还没有检查它是否可以与非特权用户命名空间一起使用。