On 5/17/24 11:16 AM, Michal Prívozník wrote:
On 5/17/24 14:21, Anchal Nigam wrote:
> I don't have a router that I can create custom rules to block things. I was
hoping there would be a way to do this entirely on the host but it doesn't look like
it is possible.
>
macvtap IS purely host thing. No need to set anything on the router. In
fact, you'd need a special switch if you wanted two guests using macvtap
on the same host to talk to each other (it's called hairpinning).
More specifially, if the macvtap interface (type='direct' in the libvirt
domain XML) has
<source dev='ethX' mode='private'/>
*then* that guest can only communicate with other guests connected via
dev='ethX' if the traffic is hair-pinned back from the bridge that
connects device 'ethX' to the physical network. But if it is
<source dev='ethX' mode='bridge'/>
then that guest *can* communicate with all other guests connected to
ethX. In both cases, the guests cannot communicate with the host.
But even mode='private' doesn't provide the level of isolation that's
being requested. You might think you could combine macvtap/private with
a few iptables/nftables rules on the host that reject any forwarded
traffic that has source or destination on the local network, but none of
the iptables hooks works with traffic on a macvtap interface. It *is*
apparently possible (although I've not tried it) to do nftables
filtering of traffic on a macvtap interface by using the "netdev"
ingress and egress hooks, as outlined here:
https://serverfault.com/questions/1147529/applying-nftables-rules-to-macv...
(it even gives an example of implementing this in a libvirt hook script,
which would be necessary for you to use it with a libvirt-created
macvtap interface).
An alternate implementation managed entirely on the host, would be to
connect the guest via a libvirt network in nat/bridge/open forward mode
(to ensure that a regular tap device is used) and then use libvirt's
nwfilter to create a filter that rejects all traffic to the local
network, but allows everything else. Basic information about libvirt's
nwfilter driver is here:
https://libvirt.org/formatnwfilter.html