Rootless podman 容器的网络隔离
Rootless 容器中的网络用不上内核提供的丰富特性,默认是允许访问外界的。但通过 pasta 提供的选项,还是可以做一下网络隔离。
有时候在容器中测试服务,需要服务本身不能访问外部网络,但主机要能请求容器内的服务。在以前的 rootful 容器中,一般是用一个单独的 bridge 网络来实现的。但在 rootless 容器中, bridge 网络是用不了的,只能通过 pasta 或者 slirp4netns 的参数来限制容器对外部网络的访问。
根据 pasta 的文档,可以使用 -o
/--outbound
来绑定 outbound socket 的地址,那么只要把 socket bind 到 lo 上,包就不会发到外部网络了。再根据 podman-run(1) 给 pasta 传参的语法,就可以写成
podman run --rm -ti --network pasta:-o,127.0.0.1 docker.io/library/archlinux /bin/bash
试了一下,发现泄漏的 IPv6 流量和 DNS 流量,进一步改成:
podman run --rm -ti --network pasta:--ipv4-only,-o,127.0.0.1,-D,none docker.io/library/archlinux /bin/bash
其中,
--ipv4-only
禁用 IPv6-o,127.0.0.1
把 socket bind 到 lo 接口,使流量无法离开本机-D,none
停止提供 DNS 服务
这样看起来就比较完善了。
不过注意,这不阻止容器内的服务访问容器外的本机服务。达到的效果是:本机上容器内外能互通,容器内和本机以外的网络不互通,适合在容器里调试网络服务的场景。
最后修改于 2024-10-10