From: David Gibson <david@gibson.dropbear.id.au>
To: Stefano Brivio <sbrivio@redhat.com>
Cc: EJ Campbell <ej.campbell@gmail.com>,
ej@campbell.name, passt-dev@passt.top,
Jon Maloy <jmaloy@redhat.com>
Subject: Re: [PATCH] tap: don't let overheard traffic move addr_seen when serving a fixed address
Date: Tue, 9 Jun 2026 11:54:55 +1000 [thread overview]
Message-ID: <aidyb07Q93gajE_Z@zatzit> (raw)
In-Reply-To: <20260605135741.60d87874@elisabeth>
[-- Attachment #1: Type: text/plain, Size: 9660 bytes --]
On Fri, Jun 05, 2026 at 01:57:41PM +0200, Stefano Brivio wrote:
> EJ, thanks for the detailed patch and commit message, and apologies for
> the delayed response.
>
> Some remarks:
>
> On Tue, 2 Jun 2026 18:15:24 -0700
> EJ Campbell <ej.campbell@gmail.com> wrote:
>
> > The latest source address seen on the tap interface (ip4.addr_seen) is
> > taken to be the guest's and is used as the target for inbound port
> > forwarding. The update accepts any source address.
> >
> > On a point-to-point tap that is always correct. But when the tap sits on
> > a shared L2 segment -- for example when it is bridged together with other
> > hosts -- pasta also sees frames from those other hosts.
>
> That's a interesting use case, it's the first time I see pasta used
> like this. Thanks for sharing.
Likewise, it's the first I've heard of someone using it specifically
like this, but it is a use model I've had in mind for a while. So
this is a known limitation I've been thinking about for a while. It
hasn't reached the top of my priority list because while your very
specific case almost works already, the more general case of a bridge
on the guest side requires a bunch more infrastructure. That's in
progress or at least planned, but it's going to be a while.
Fwiw, I really dislike the addr_seen mechanism even in cases where it
"works": it allows poorly configured guests to work at the expense of
substantial complexity which impacts all cases. However, it's
established behaviour, so Stefano is understandably against simply
removing it.
> > With a static
> > configuration (-a / address set, DHCP disabled), an overheard frame from
> > another host silently moves addr_seen to that host, and every subsequent
> > inbound forwarded connection is sent there instead of to the guest, so
> > connections are reset or hang.
> >
> > I hit this running pasta with its tap enslaved to a Linux bridge that also
> > carries other traffic: inbound port forwarding to the guest broke as soon
> > as another address was seen on the segment.
>
> Oops. We should definitely fix this, and maybe your patch is good enough
> for the moment (or better than the alternative), but I have a concern
> here:
>
> > Restrict the update so that, when DHCP is disabled (no_dhcp), only frames
> > sourced from the configured guest address may move addr_seen. With DHCP
> > enabled -- the default -- behaviour is unchanged, since the guest's
> > address is whatever pasta leases and tracking it is still correct.
>
> ...inferring possibly but not necessarily related information from
> whether DHCP is disabled or enabled looks a bit risky to me:
>
> - somebody might have DHCP enabled (just because it's the default
> option), but one single connected container / guest not using DHCP at
> all, and picking an address that we didn't expect. Your patch would
> break this (perhaps unlikely?) usage
>
> - somebody might have DHCP enabled but just the intended container /
> guest using it, and your same problem. Your patch wouldn't fix that
> (definitely less likely) usage
Right. I agree with Stefano that basing this of --no-dhcp is not a
good idea. It happens to work for your case, but it doesn't
generalise well. In addition to the cases Stefano mentions, for the
more general case of a guest-side bridge, we'd eventually like to have
our DHCP implementation serve multiple address, in which case we
wouldn't want addr_seen, even though DHCP is enabled.
> So I've been thinking: shouldn't we rather use as a condition the fact
> that -a / --address was explicitly given? We don't track that from
> conf() at the moment but it would be a small change.
>
> If -a / --address is given, I'd say the user is very much expecting the
> container / guest to be using that address, and in that case I think
> it's safer to ignore other addresses.
I think having an explcit -a is a sufficient condition to disable
addr_seen, but maybe not a necessary one. I think requiring the guest
to use the assigned address would be a reasonable request, even if
that address is taken from the host.
Stefano and others talked me out of an explicit --no-address-snooping
option, on the grounds of option proliferation at our last call.
However, thinking about it again, I'm still wondering if it might be
useful: we can think of addr_seen as a (not very good) address
assignment mechanism, along with DHCP, NDP, DHCPv6 and --config-net.
All of those (better) mechanisms can be explicitly disabled, so why
should we not be able to disable the worst one.
> It would be even better if we could track our designated container /
> guest among a number of them, only if there are more than one.
>
> For context, Jon is working on a series adding support for multiple
> addresses (assigned, used, or observed):
>
> https://archives.passt.top/passt-dev/20260413005319.3295910-1-jmaloy@redhat.com/
>
> and patch 8/13:
>
> https://archives.passt.top/passt-dev/20260413005319.3295910-9-jmaloy@redhat.com/
>
> refactors the same exact part your patch is touching, here:
>
> https://archives.passt.top/passt-dev/7f04e12/s/?b=tap.c#n764
>
> with no functional change.
>
> By the way, if you want to try things out on top of that series, you
> can apply it with:
>
> b4 shazam
> https://archives.passt.top/passt-dev/20260413005319.3295910-1-jmaloy@redhat.com/
>
> ...you might want to check out a slightly older revision to apply
> cleanly without conflicts.
>
> The main purpose of this work is actually to implement a netlink
> monitor to track changes in host addresses:
>
> https://bugs.passt.top/show_bug.cgi?id=141
> https://pad.passt.top/p/netlinkMonitor
>
> ...but it might also be convenient for this kind of tracking. For
> guests, we could establish some preference rules, for example:
>
> - if any guest made a DHCP / DHCPv6 request, select its address (I
> guess we should eventually implement guest-side MAC address tracking
> for a full solution but just preferring addresses we assigned might
> be quite good). I'm not sure how we would handle SLAAC
>
> - if we haven't seen any DHCP / DHCPv6 request, but we have seen a
> single address, default to that one as "guest" address
>
> and so on.
>
> For containers, we actually know which namespace we're associated to,
> so we could, on any new observed address, check the source MAC address
> of the frame and see if it corresponds to our namespace (querying via
> netlink).
>
> Thoughts? Jon?
>
> If this is all too complicated for the moment, would a condition based
> on explicit -a / --address option work for you?
>
> > The same reasoning applies to ip6.addr_seen on a shared segment; I left
> > IPv6 alone for now since I only exercise IPv4 in this setup, and would be
> > glad to extend it the same way if you prefer.
>
> I think we should definitely take care of IPv6 as well, I'm just not
> sure how.
>
> A couple of comments about the patch itself:
>
> > Signed-off-by: EJ Campbell <ej.campbell@gmail.com>
> > ---
> > tap.c | 14 +++++++++++++-
> > 1 file changed, 13 insertions(+), 1 deletion(-)
> >
> > diff --git a/tap.c b/tap.c
> > index 4cba4c7..514379e 100644
> > --- a/tap.c
> > +++ b/tap.c
> > @@ -770,7 +770,19 @@ resume:
> > continue;
>
> It looks like the patch itself was copied and pasted from a terminal,
> because all tabs became spaces, and the patch doesn't apply.
>
> It's not a problem for small patches like this one as I tend to fix
> things up manually, but it would be good to have it directly from git
> send-email instead.
>
> > }
> >
> > - if (iph->saddr && c->ip4.addr_seen.s_addr != iph->saddr)
> > + /* The latest source address seen on the tap is taken to be the
> > + * guest's, and becomes the target for inbound forwarding. On a
> > + * point-to-point tap that's always correct. But if the tap sits
> > + * on a shared L2 segment (for example bridged together with
> > + * other hosts) and we serve a fixed address (DHCP disabled), a
> > + * frame overheard from another host on that segment must not
> > + * move addr_seen and silently retarget forwarded connections
> > + * away from the guest. When DHCP is disabled, only the
> > + * configured guest address may update addr_seen; with DHCP
> > + * enabled (the default) behaviour is unchanged.
>
> The fact that the behaviour is _unchanged_ (by your patch) belongs in
> the commit message rather than the code, because if one reads the code
> they aren't explicitly reading your change and it's not clear to what
> previous behaviour you would be referring to.
>
> Other than that it's pretty well described, thanks. Let's see if we can
> find a better solution though.
>
> > + */
> > + if (iph->saddr && c->ip4.addr_seen.s_addr != iph->saddr &&
> > + (!c->no_dhcp || iph->saddr == c->ip4.addr.s_addr))
> > c->ip4.addr_seen.s_addr = iph->saddr;
> >
> > if (!iov_drop_header(&data, hlen))
> >
> > base-commit: 4b2823784aab04a70dfc295b16fd6f0592955790
> > --
> > 2.53.0
> >
>
> --
> Stefano
>
>
--
David Gibson (he or they) | I'll have my music baroque, and my code
david AT gibson.dropbear.id.au | minimalist, thank you, not the other way
| around.
http://www.ozlabs.org/~dgibson
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
prev parent reply other threads:[~2026-06-09 1:55 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-06-03 1:15 EJ Campbell
2026-06-05 11:57 ` Stefano Brivio
2026-06-09 1:54 ` David Gibson [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=aidyb07Q93gajE_Z@zatzit \
--to=david@gibson.dropbear.id.au \
--cc=ej.campbell@gmail.com \
--cc=ej@campbell.name \
--cc=jmaloy@redhat.com \
--cc=passt-dev@passt.top \
--cc=sbrivio@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://passt.top/passt
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for IMAP folder(s).