Hi,
I recently installed a test box using CentOS 8 and installed a CentOS 8 guest
via libvirt (KVM).
I need to use "routed" forwarding as the datacenter only gives me individual IPs
which are routed to the physical interface and the switch only accepts packets
with a well-known MAC address.
On the host I enabled firewalld and moved the guest to a specific firewalld
zone. I verified that libvirt is detecting firewalld.
My idea was that I could use this to create somewhat fine-grained filters on the
host for traffic from the internet to the guest (and possibly vice-versa).
However it seems like that does not work the way I wanted:
It seems as if nothing changes when I allow/disallow SSH for that zone. I can
still ssh from the internet to the guest.
After several reads on the documentation I have a guess of what might be going
on but I'd like to confirm that:
https://libvirt.org/firewall.html#fw-firewalld-and-virtual-network-driver
If firewalld is active on the host, libvirt will attempt to place the bridge
interface of a libvirt virtual network into the firewalld zone named
"libvirt" (thus making all guest->host traffic on that network subject to
the rules of the "libvirt" zone).
Does that mean libvirt's firewalld usage is ONLY for traffic guest->host and
does not affect all other traffic (e.g. host->guest, guest<->internet)?
That sounds incredibly narrow (and not very useful for me) but it would explain
why I don't see any effects in my experiment...
---
In a related note it would be nice if there was a way to make routed setups with
individual IPs easier. This problem hunts me for more than 10 years (I think I
posted something in 2009 - still the same problem basically) and it would be
nice if libvirt could somehow support this use case better:
I want to allow traffic guest <-> internet in a routed setup. libvirt generates
iptables rules like these:
Chain LIBVIRT_FWO (1 references)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- br-private * 10.11.0.0/24
0.0.0.0/0
0 0 REJECT all -- br-private * 0.0.0.0/0
0.0.0.0/0 reject-with icmp-port-unreachable
0 0 ACCEPT all -- br-public * (NETWORK IP )
0.0.0.0/0
43 3232 REJECT all -- br-public * 0.0.0.0/0
0.0.0.0/0 reject-with icmp-port-unreachable
I my case "NETWORK IP" is a /32 IPv4 and AFAIK I have to put the host's IPv4
here (which is basically the router) so I can assign the guest IP inside the VM.
What I need is basically a rule like ACCEPT one above but with the GUEST IP. I
have some elaborate Python script which I can use as a "network" hook but that
requires parsing output of "iptables" due to libvirt's events (e.g. libvirtd
restart triggers one "plugged" event per VM).
Thank you very much,
Felix