Rootless podman 容器的网络隔离

有时候在容器中测试服务,需要服务本身不能访问外部网络,但主机要能请求容器内的服务。在以前的 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