public inbox for passt-user@passt.top
 help / color / mirror / Atom feed
From: Niklas Beierl <no.shoes@posteo.net>
To: david@gibson.dropbear.id.au
Cc: passt-user@passt.top
Subject: Re: Passt port forwards to guest when host is "offline"
Date: Mon, 11 May 2026 12:52:45 +0000	[thread overview]
Message-ID: <ad99c75d-15fe-4997-90fc-a2189347837f@posteo.net> (raw)
In-Reply-To: <agG8eoXMd-CWqjwb@zatzit>

On 11/05/2026 13:24, David Gibson wrote:
> On Sun, May 10, 2026 at 01:40:56PM +0000, Niklas Beierl wrote:
>> Hello,
>>
>> I hope I am not violating any mailinglist etiquette. I am not too 
>> familiar
>> with this way of communicating and I haven't found a guide for passts 
>> list.
>> Please feel free to point me out.
>>
>> I have the following Problem: I have a libvirt VM using passt as usermode
>> networking backend. I set up a port-forward to access a service on 
>> the VM.
>> In principle, this setup serves me well. There is just one edge-case 
>> that is
>> very unergonomic:
>> When the VM boots while the host (laptop) is offline, the VM get's no IP
>> either and the the port-forward doesn't work since passt has no IP to
>> forward to.
> Ok, this is a known problem - or, rather a known cluster of
> overlapping problems. There are some a fair few complications in
> working out exactly how best to address it though, which is why it's
> still there.
>
>> 35.2917: ERROR:   Flow 0 (INI): No rules to forward HOST TCP
>> [127.0.0.1]:42336 -> [127.0.0.1]:3389
>>
>> This unfortunately happens quite frequently because I travel a lot. I 
>> know
>> this scenario doesn't really have an obvious, well defined solution, 
>> because
>> passt is supposed to just make the guest believe it has the same ip 
>> as the
>> host and in this case the host has no ip. A few things I have considered:
>>
>> Assigning an additional, static IP to the guest and somehow forcing 
>> traffic
>> for it to passt. Not sure if/how this would work.
>> Assigning an additional, static IP on some host interface, hoping 
>> passt will
>> pick it up and advertise it via DHCP?
>> Am I missing a more elegant approach?
>>
>> I was also thinking that it would perhaps be cool if passt could make
>> port-forwards for localhost connections work irrespective of whether the
>> host otherwise has network connectivity. Haven't thought it 100% through,
>> but if 127.0.0.1/8 is src and dst of the connection, there is no broken
>> return route on the guest or anything so in theory this should be 
>> possible I
>> guess? I'd be happy to bounce ideas back and forth.
>>
>> For reference: The interface definition:
>>
>>     <interface type='user'>
>>       <mac address='52:54:00:16:63:9f'/>
>>       <portForward proto='tcp'>
>>         <range start='3389'/>
>>       </portForward>
>>       <model type='e1000e'/>
>>       <backend type='passt' logFile='/tmp/win11passt.log'/>
>>       <address type='pci' domain='0x0000' bus='0x01' slot='0x00'
>> function='0x0'/>
>>     </interface>
> So, this isn't really related to port forwarding at all. As long as
> the forward doesn't have a specific listening address (which your
> example doesn't), it should work fine whatever the guest address -
> even if the guest changes address.
>
> The problem with forwards is just due to not getting an address at
> all. The primary difficulty here is that if the host has no address,
> we have to conjure one out of thin air for the guest. But, if the
> host later goes online, we don't want whatever we picked for the guest
> to conflict with that. Finding a safe choice is quite tricky.

I'd venture to say that RFC3927 link-local addresses (169.254.0.0/16)  
would be the sanest choice. Passt already seems to use that as a 
fallback for --address but that never triggers on my machine, probably 
because when "offline" I still do have ip-addresses from docker bridges 
but no default gateway?

> Jon Maloy is currently working on a series of patches that reworks the
> management of guest addresses. The primary aim is to support multiple
> concurrent guest addresses. However, it will also provide a better
> foundation on which to handle the assignment of addresses when we
> can't take one from the host.
Multiple ips would be pretty cool as you could use a link-local address 
as "fallback". :)
> In the meantime there's are some workarounds you could try:
>
> * What version of passt do you have? Newer versions have "local
> mode". It isn't perfect, but it has at least some ability to
> assign a guest address when the host doesn't have one.
>
> * If it's not important to you that the guest take the host address
> when the host *is* online, then passt has the ability to explicitly
> assign a guest address. You can use that via libvirt by adding
> lines like:
> <ip address='172.17.2.0' family='ipv4' prefix='24'/>
> <ip address='2001:db8:ac10:fd01::feed' family='ipv6'/>
> to the interface block.

Version: passt 2026_05_07.1afd4ed. What exactly is "local mode" ? I 
couldn't identify something relevant in the man page? I tried static IPs 
but it seemed to me that when I use that, I also need to statically 
configure the gateway, which makes the whole thing a hassle when I do 
have "internet" and want to use it from the guest.

For the record, here is my workaround for the moment: I am adding a 
dummy (as in type dummy) interface with a private ipv4 range and a 
default route with the lowest possible precedence (high prio). This has 
the obvious caveat that I might encounter a conflict If I ever want to 
connect to a network with the chosen CIDR.

ip link add dummy0 type dummy
ip link set dummy0 up
ip addr add 192.168.250.5/24 dev dummy0
ip route add default via 192.168.250.1 dev dummy0 metric 4294967295

This ensures that there always is at least a faked "local network" on my 
machine that provides an address for the guest To persist it with 
NetworkManager:

nmcli connection add \
   type dummy \
   ifname dummy0 \
   con-name dummy0 \
   ipv4.method manual \
   ipv4.addresses 192.168.250.5/24 \
   ipv4.gateway 192.168.250.1 \
   ipv4.route-metric 4294967295 \
   ipv6.method disabled \
   connection.autoconnect yes




  reply	other threads:[~2026-05-11 12:52 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-05-10 13:40 Niklas Beierl
2026-05-11 11:24 ` David Gibson
2026-05-11 12:52   ` Niklas Beierl [this message]
2026-05-12  0:49     ` David Gibson
2026-05-11 13:06   ` Stefano Brivio

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=ad99c75d-15fe-4997-90fc-a2189347837f@posteo.net \
    --to=no.shoes@posteo.net \
    --cc=david@gibson.dropbear.id.au \
    --cc=passt-user@passt.top \
    /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.
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).