Setting `firewall_backend = "iptables"` and allowing it to use the
iptables-nft shim *did* get the right rules into place.

I then ran smack into the "my main input chain has a default deny rule",
but that's my problem.  :)

On Thu, Feb 20, 2025 at 10:33 PM <robinleepow...@gmail.com> wrote:

> I do not think this is any of the similar issues that have been
> posted to this list; I've checked.
>
> In particular, this in *NOT* an issue with nft rules precedence; the
> rules are simply not being written by libvirt.
>
> I'm running vagrant which is running libvirt on a Fedora 41 host.  I
> do not think this is a vagrant problem, but if people want me to run
> virsh commands directly I certainly can.
>
> Anyway, vagrant was failing until I noticed that the default for
> /etc/libvirt/network.conf is now nftables, which I did not have set
> up.  When I set `firewall_backend = "iptables"`, everything worked
> fine.
>
> I want to emphasize that: the same vagrant / libvirt setup *was*
> working with iptables.
>
> But I took that as a sign that it was time to move to nftables, so I
> moved everything on this host and stuff is back to working.
>
> But libvirt just isn't writing out the right nft rules.  Like, at
> all.
>
> Here's the network vagrant creates:
>
>     $ sudo virsh net-dumpxml vagrant-libvirt
>     <network connections='1' ipv6='yes'>
>       <name>vagrant-libvirt</name>
>       <uuid>b2d93ef4-b305-4382-a380-c1eca92d8ebd</uuid>
>       <forward mode='nat'>
>         <nat>
>           <port start='1024' end='65535'/>
>         </nat>
>       </forward>
>       <bridge name='virbr1' stp='on' delay='0'/>
>       <mac address='52:54:00:63:d3:f6'/>
>       <ip address='192.168.121.1' netmask='255.255.255.0'>
>         <dhcp>
>           <range start='192.168.121.1' end='192.168.121.254'/>
>         </dhcp>
>       </ip>
>     </network>
>
> And here's the *entire* libvirt-related ruleset in nftables:
>
>     table ip libvirt_network {
>             chain forward {
>                     type filter hook forward priority filter; policy
> accept;
>                     counter packets 0 bytes 0 jump guest_cross
>                     counter packets 0 bytes 0 jump guest_input
>                     counter packets 0 bytes 0 jump guest_output
>             }
>
>             chain guest_output {
>                     ip saddr 192.168.121.0/24 iif "virbr1" counter
> packets 0 bytes 0 accept
>                     iif "virbr1" counter packets 0 bytes 0 reject
>             }
>
>             chain guest_input {
>                     oif "virbr1" ip daddr 192.168.121.0/24 ct state
> established,related counter packets 0 bytes 0 accept
>                     oif "virbr1" counter packets 0 bytes 0 reject
>             }
>
>             chain guest_cross {
>                     iif "virbr1" oif "virbr1" counter packets 0 bytes 0
> accept
>             }
>
>             chain guest_nat {
>                     type nat hook postrouting priority srcnat; policy
> accept;
>                     ip saddr 192.168.121.0/24 ip daddr 224.0.0.0/24
> counter packets 1 bytes 187 return
>                     ip saddr 192.168.121.0/24 ip daddr 255.255.255.255
> counter packets 0 bytes 0 return
>                     meta l4proto tcp ip saddr 192.168.121.0/24 ip daddr
> != 192.168.121.0/24 counter packets 0 bytes 0 masquerade to :1024-65535
>                     meta l4proto udp ip saddr 192.168.121.0/24 ip daddr
> != 192.168.121.0/24 counter packets 0 bytes 0 masquerade to :1024-65535
>                     ip saddr 192.168.121.0/24 ip daddr != 192.168.121.0/24
> counter packets 0 bytes 0 masquerade
>             }
>     }
>     table ip6 libvirt_network {
>             chain forward {
>                     type filter hook forward priority filter; policy
> accept;
>                     counter packets 0 bytes 0 jump guest_cross
>                     counter packets 0 bytes 0 jump guest_input
>                     counter packets 0 bytes 0 jump guest_output
>             }
>
>             chain guest_output {
>                     iif "virbr1" counter packets 0 bytes 0 reject
>             }
>
>             chain guest_input {
>                     oif "virbr1" counter packets 0 bytes 0 reject
>             }
>
>             chain guest_cross {
>                     iif "virbr1" oif "virbr1" counter packets 0 bytes 0
> accept
>             }
>
>             chain guest_nat {
>                     type nat hook postrouting priority srcnat; policy
> accept;
>             }
>     }
>
> Here's some log output (I have virtnetworkd running with -v):
>
>     $ sudo journalctl -u virtnetworkd.service  | grep -i nft
>     [snip]
>     Feb 20 21:36:42 stodi.digitalkingdom.org virtnetworkd[89119]: using
> firewall_backend: 'nftables'
>     Feb 20 21:36:46 stodi.digitalkingdom.org virtnetworkd[89119]:
> Applying 'nft list table ip libvirt_network'
>     Feb 20 21:36:46 stodi.digitalkingdom.org virtnetworkd[89119]:
> Applying 'nft list table ip6 libvirt_network'
>     Feb 20 21:36:46 stodi.digitalkingdom.org virtnetworkd[89119]:
> Applying 'nft -ae insert rule ip libvirt_network guest_output iif virbr1
> counter reject'
>     Feb 20 21:36:46 stodi.digitalkingdom.org virtnetworkd[89119]:
> Applying 'nft -ae insert rule ip libvirt_network guest_input oif virbr1
> counter reject'
>     Feb 20 21:36:46 stodi.digitalkingdom.org virtnetworkd[89119]:
> Applying 'nft -ae insert rule ip libvirt_network guest_cross iif virbr1 oif
> virbr1 counter accept'
>     Feb 20 21:36:46 stodi.digitalkingdom.org virtnetworkd[89119]:
> Applying 'nft -ae insert rule ip6 libvirt_network guest_output iif virbr1
> counter reject'
>     Feb 20 21:36:46 stodi.digitalkingdom.org virtnetworkd[89119]:
> Applying 'nft -ae insert rule ip6 libvirt_network guest_input oif virbr1
> counter reject'
>     Feb 20 21:36:46 stodi.digitalkingdom.org virtnetworkd[89119]:
> Applying 'nft -ae insert rule ip6 libvirt_network guest_cross iif virbr1
> oif virbr1 counter accept'
>     Feb 20 21:36:47 stodi.digitalkingdom.org virtnetworkd[89119]:
> Applying 'nft -ae insert rule ip libvirt_network guest_output ip saddr
> 192.168.121.0/24 iif virbr1 counter accept'
>     Feb 20 21:36:47 stodi.digitalkingdom.org virtnetworkd[89119]:
> Applying 'nft -ae insert rule ip libvirt_network guest_input oif virbr1 ip
> daddr 192.168.121.0/24 ct state related,established counter accept'
>     Feb 20 21:36:47 stodi.digitalkingdom.org virtnetworkd[89119]:
> Applying 'nft -ae insert rule ip libvirt_network guest_nat ip saddr
> 192.168.121.0/24 ip daddr '!=' 192.168.121.0/24 counter masquerade'
>     Feb 20 21:36:47 stodi.digitalkingdom.org virtnetworkd[89119]:
> Applying 'nft -ae insert rule ip libvirt_network guest_nat meta l4proto udp
> ip saddr 192.168.121.0/24 ip daddr '!=' 192.168.121.0/24 counter
> masquerade to :1024-65535'
>     Feb 20 21:36:47 stodi.digitalkingdom.org virtnetworkd[89119]:
> Applying 'nft -ae insert rule ip libvirt_network guest_nat meta l4proto tcp
> ip saddr 192.168.121.0/24 ip daddr '!=' 192.168.121.0/24 counter
> masquerade to :1024-65535'
>     Feb 20 21:36:47 stodi.digitalkingdom.org virtnetworkd[89119]:
> Applying 'nft -ae insert rule ip libvirt_network guest_nat ip saddr
> 192.168.121.0/24 ip daddr 255.255.255.255/32 counter return'
>     Feb 20 21:36:47 stodi.digitalkingdom.org virtnetworkd[89119]:
> Applying 'nft -ae insert rule ip libvirt_network guest_nat ip saddr
> 192.168.121.0/24 ip daddr 224.0.0.0/24 counter return'
>
> So it's not like trying to create the rules and failing, that I can
> see; it just isn't trying.
>
> To clarify this setup appears to be missing every rule that would be
> needed for DHCPv4 and DNS to work.
>
> Like https://gitlab.com/libvirt/libvirt/-/issues/88#note_694493261
> shows rules for udp 67 and 53 that are just 100% not being created
> at all.
>
> I have no idea what's going wrong here or even where to look; the
> code at
>
> https://lists.libvirt.org/archives/list/de...@lists.libvirt.org/thread/GT75XY7H3VJB5LTNRG4WYK47WGTQYYCZ/
> sure *looks like* it should be unconditionally adding those rules.
>
> Help?
>

Reply via email to