Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 8 Jun 2026 10:29:30 +0100
From:      Doug Rabson <dfr@rabson.org>
To:        Kristof Provost <kp@freebsd.org>
Cc:        freebsd-jail@freebsd.org
Subject:   Re: Running pfctl inside a jail
Message-ID:  <CACA0VUhPCX9AzJzaNYF=25PRgU4TeUMPn36CZhBrb8wPDdFX9w@mail.gmail.com>
In-Reply-To: <7C23D3B8-1A14-41B7-839A-580DB61E0403@FreeBSD.org>
References:  <CACA0VUhJ78ES4AGMtLvZOVRJLoK=w=Vot%2BKSbx3Q=ikdC8UkFQ@mail.gmail.com> <96E80293-2013-452F-859C-B725EA7963CF@FreeBSD.org> <CACA0VUhigsCrqxrBySxptLCfh_K6%2BCb%2BT%2BDSJZgHnSMr0i9WOQ@mail.gmail.com> <7C23D3B8-1A14-41B7-839A-580DB61E0403@FreeBSD.org>

index | next in thread | previous in thread | raw e-mail

[-- Attachment #1 --]
On Mon, 8 Jun 2026 at 09:37, Kristof Provost <kp@freebsd.org> wrote:

> On 8 Jun 2026, at 10:00, Doug Rabson wrote:
> > In my smallest test-case, the host and jail use the same root filesystem
> > and the host is running 15.0-RELEASE-p8. I haven't tested with stable/15
> > yet.  This reproduces the problem for me:
> >
> > $ sudo pfctl -s nat
> > nat on bridge42 inet from <cni-nat> to any -> (bridge42) round-robin
> > nat on bridge42 inet6 from <cni-nat> to ! ff00::/8 -> (bridge42)
> round-robin
> > nat-anchor "cni-rdr/*" all
> > rdr-anchor "cni-rdr/*" all
> > $ cat jail-pfctl-15
> > #! /bin/sh
> > j=$(jail -ic name=pfctl-in-jail15 ip4=inherit ip6=inherit path=/ persist)
> > jexec $j pfctl -s nat
> > jail -r $j
> > $ sudo ./jail-pfctl-15
> > pfctl: DIOCGETRULES: Operation not permitted
> > $ freebsd-version -k
> > 15.0-RELEASE-p8
> >
> >
> > Do the pf unit tests cover the case where the jail shares the host vnet?
> >
> Oh. No, no they do not. That’s just plain not supposed to work.
>

Historically, though, it has always worked, at least as far back as
FreeBSD-13 so this is a regression.


> You only ever get to manage your own pf instance, never the one of a
> parent jail.
>

It seems reasonable (to me at least) that if a jail inherits a vnet from
its parent, it should be able to manage that vnet. I see some evidence in
the history that at least parts of netlink are intended to work for jails
which don't have their own vnet (e.g.
https://cgit.freebsd.org/src/commit/sys/netlink?id=04f75b980293d517558990a7fda6900445edcac6).
I would also like to be able to create interfaces in non-vnet jails but
that is another conversation entirely.

For what it's worth, this pattern of delegating network management to a
privileged container is common on Linux. For instance, the Linux version of
kube-proxy as well as the popular Calico cluster networking stack, uses
this pattern to manage interfaces and iptable rule sets.

Doug.

[-- Attachment #2 --]
<div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote gmail_quote_container"><div dir="ltr" class="gmail_attr">On Mon, 8 Jun 2026 at 09:37, Kristof Provost &lt;<a href="mailto:kp@freebsd.org">kp@freebsd.org</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">On 8 Jun 2026, at 10:00, Doug Rabson wrote:<br>
&gt; In my smallest test-case, the host and jail use the same root filesystem<br>
&gt; and the host is running 15.0-RELEASE-p8. I haven&#39;t tested with stable/15<br>
&gt; yet.  This reproduces the problem for me:<br>
&gt;<br>
&gt; $ sudo pfctl -s nat<br>
&gt; nat on bridge42 inet from &lt;cni-nat&gt; to any -&gt; (bridge42) round-robin<br>
&gt; nat on bridge42 inet6 from &lt;cni-nat&gt; to ! ff00::/8 -&gt; (bridge42) round-robin<br>
&gt; nat-anchor &quot;cni-rdr/*&quot; all<br>
&gt; rdr-anchor &quot;cni-rdr/*&quot; all<br>
&gt; $ cat jail-pfctl-15<br>
&gt; #! /bin/sh<br>
&gt; j=$(jail -ic name=pfctl-in-jail15 ip4=inherit ip6=inherit path=/ persist)<br>
&gt; jexec $j pfctl -s nat<br>
&gt; jail -r $j<br>
&gt; $ sudo ./jail-pfctl-15<br>
&gt; pfctl: DIOCGETRULES: Operation not permitted<br>
&gt; $ freebsd-version -k<br>
&gt; 15.0-RELEASE-p8<br>
&gt;<br>
&gt;<br>
&gt; Do the pf unit tests cover the case where the jail shares the host vnet?<br>
&gt;<br>
Oh. No, no they do not. That’s just plain not supposed to work.<br></blockquote><div><br></div><div>Historically, though, it has always worked, at least as far back as FreeBSD-13 so this is a regression.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">You only ever get to manage your own pf instance, never the one of a parent jail.<br></blockquote><div><br></div><div>It seems reasonable (to me at least) that if a jail inherits a vnet from its parent, it should be able to manage that vnet. I see some evidence in the history that at least parts of netlink are intended to work for jails which don&#39;t have their own vnet (e.g. <a href="https://cgit.freebsd.org/src/commit/sys/netlink?id=04f75b980293d517558990a7fda6900445edcac6">https://cgit.freebsd.org/src/commit/sys/netlink?id=04f75b980293d517558990a7fda6900445edcac6</a>). I would also like to be able to create interfaces in non-vnet jails but that is another conversation entirely.</div><div><br></div><div>For what it&#39;s worth, this pattern of delegating network management to a privileged container is common on Linux. For instance, the Linux version of kube-proxy as well as the popular Calico cluster networking stack, uses this pattern to manage interfaces and <span class="G8OMXb ng">iptable</span> rule sets.</div><div> </div><div>Doug.</div></div></div>
home | help

Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CACA0VUhPCX9AzJzaNYF=25PRgU4TeUMPn36CZhBrb8wPDdFX9w>