[libvirt PATCH 05/28] util: move backend-agnostic virNetfilter*() functions to their own file
Daniel P. Berrangé
berrange at redhat.com
Wed May 3 15:56:30 UTC 2023
On Sun, Apr 30, 2023 at 11:19:20PM -0400, Laine Stump wrote:
> These function are all moved into virnetfilter.[ch]. The only
> functions from viriptables.[ch] that are still called from the
> consumer (network bridge driver) are iptablesSetupPrivateChains()
> (which creates the private chains that all iptables rules will be
> added to), and iptablesAddOutputFixUdpChecksum() and
> iptablesRemoveOutputFixUdpChecksum() (which add/remove rules to fix
> improper checksum of DHCP packets, which is something not supported by
> nftables)
>
> Signed-off-by: Laine Stump <laine at redhat.com>
> ---
> src/libvirt_private.syms | 51 +--
> src/network/bridge_driver_linux.c | 1 +
> src/util/meson.build | 1 +
> src/util/viriptables.c | 522 +--------------------------
> src/util/viriptables.h | 212 +++++------
> src/util/virnetfilter.c | 570 ++++++++++++++++++++++++++++++
> src/util/virnetfilter.h | 151 ++++++++
> 7 files changed, 849 insertions(+), 659 deletions(-)
> create mode 100644 src/util/virnetfilter.c
> create mode 100644 src/util/virnetfilter.h
If we move 'viriptables.{ch}' to 'src/network/bridge_iptables.{ch}
as first step in this series, then we would naturally also
have 'src/network/bridge_netfilter.{ch}' for this patch.
>
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index 9f3868bbac..11b84a866a 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -2550,30 +2550,6 @@ virInitctlSetRunLevel;
> iptablesAddOutputFixUdpChecksum;
> iptablesRemoveOutputFixUdpChecksum;
> iptablesSetupPrivateChains;
> -virNetfilterAddDontMasquerade;
> -virNetfilterAddForwardAllowCross;
> -virNetfilterAddForwardAllowIn;
> -virNetfilterAddForwardAllowOut;
> -virNetfilterAddForwardAllowRelatedIn;
> -virNetfilterAddForwardMasquerade;
> -virNetfilterAddForwardRejectIn;
> -virNetfilterAddForwardRejectOut;
> -virNetfilterAddTcpInput;
> -virNetfilterAddTcpOutput;
> -virNetfilterAddUdpInput;
> -virNetfilterAddUdpOutput;
> -virNetfilterRemoveDontMasquerade;
> -virNetfilterRemoveForwardAllowCross;
> -virNetfilterRemoveForwardAllowIn;
> -virNetfilterRemoveForwardAllowOut;
> -virNetfilterRemoveForwardAllowRelatedIn;
> -virNetfilterRemoveForwardMasquerade;
> -virNetfilterRemoveForwardRejectIn;
> -virNetfilterRemoveForwardRejectOut;
> -virNetfilterRemoveTcpInput;
> -virNetfilterRemoveTcpOutput;
> -virNetfilterRemoveUdpInput;
> -virNetfilterRemoveUdpOutput;
>
>
> # util/viriscsi.h
> @@ -2960,6 +2936,33 @@ virNetDevVPortProfileOpTypeFromString;
> virNetDevVPortProfileOpTypeToString;
>
>
> +# util/virnetfilter.h
> +virNetfilterAddDontMasquerade;
> +virNetfilterAddForwardAllowCross;
> +virNetfilterAddForwardAllowIn;
> +virNetfilterAddForwardAllowOut;
> +virNetfilterAddForwardAllowRelatedIn;
> +virNetfilterAddForwardMasquerade;
> +virNetfilterAddForwardRejectIn;
> +virNetfilterAddForwardRejectOut;
> +virNetfilterAddTcpInput;
> +virNetfilterAddTcpOutput;
> +virNetfilterAddUdpInput;
> +virNetfilterAddUdpOutput;
> +virNetfilterRemoveDontMasquerade;
> +virNetfilterRemoveForwardAllowCross;
> +virNetfilterRemoveForwardAllowIn;
> +virNetfilterRemoveForwardAllowOut;
> +virNetfilterRemoveForwardAllowRelatedIn;
> +virNetfilterRemoveForwardMasquerade;
> +virNetfilterRemoveForwardRejectIn;
> +virNetfilterRemoveForwardRejectOut;
> +virNetfilterRemoveTcpInput;
> +virNetfilterRemoveTcpOutput;
> +virNetfilterRemoveUdpInput;
> +virNetfilterRemoveUdpOutput;
> +
> +
> # util/virnetlink.h
> virNetlinkCommand;
> virNetlinkDelLink;
> diff --git a/src/network/bridge_driver_linux.c b/src/network/bridge_driver_linux.c
> index da7d78a40a..e03c17b259 100644
> --- a/src/network/bridge_driver_linux.c
> +++ b/src/network/bridge_driver_linux.c
> @@ -22,6 +22,7 @@
> #include <config.h>
>
> #include "virfile.h"
> +#include "virnetfilter.h"
> #include "viriptables.h"
> #include "virstring.h"
> #include "virlog.h"
> diff --git a/src/util/meson.build b/src/util/meson.build
> index c2175f1098..aa570ed02a 100644
> --- a/src/util/meson.build
> +++ b/src/util/meson.build
> @@ -69,6 +69,7 @@ util_sources = [
> 'virnetdevveth.c',
> 'virnetdevvlan.c',
> 'virnetdevvportprofile.c',
> + 'virnetfilter.c',
> 'virnetlink.c',
> 'virnodesuspend.c',
> 'virnuma.c',
> diff --git a/src/util/viriptables.c b/src/util/viriptables.c
> index 8db5bb3e4b..a85f3ea603 100644
> --- a/src/util/viriptables.c
> +++ b/src/util/viriptables.c
> @@ -27,6 +27,7 @@
> #include <sys/stat.h>
>
> #include "internal.h"
> +#include "virnetfilter.h"
> #include "viriptables.h"
> #include "virfirewalld.h"
> #include "virerror.h"
> @@ -37,11 +38,6 @@ VIR_LOG_INIT("util.iptables");
>
> #define VIR_FROM_THIS VIR_FROM_NONE
>
> -enum {
> - VIR_NETFILTER_INSERT = 0,
> - VIR_NETFILTER_DELETE
> -};
> -
> typedef struct {
> const char *parent;
> const char *child;
> @@ -155,7 +151,7 @@ iptablesSetupPrivateChains(virFirewallLayer layer)
> }
>
>
> -static void
> +void
> iptablesInput(virFirewall *fw,
> virFirewallLayer layer,
> const char *iface,
> @@ -176,7 +172,7 @@ iptablesInput(virFirewall *fw,
> NULL);
> }
>
> -static void
> +void
> iptablesOutput(virFirewall *fw,
> virFirewallLayer layer,
> const char *iface,
> @@ -197,155 +193,11 @@ iptablesOutput(virFirewall *fw,
> NULL);
> }
>
> -/**
> - * virNetfilterAddTcpInput:
> - * @ctx: pointer to the IP table context
> - * @iface: the interface name
> - * @port: the TCP port to add
> - *
> - * Add an input to the IP table allowing access to the given @port on
> - * the given @iface interface for TCP packets
> - */
> -void
> -virNetfilterAddTcpInput(virFirewall *fw,
> - virFirewallLayer layer,
> - const char *iface,
> - int port)
> -{
> - iptablesInput(fw, layer, iface, port, VIR_NETFILTER_INSERT, 1);
> -}
> -
> -/**
> - * virNetfilterRemoveTcpInput:
> - * @ctx: pointer to the IP table context
> - * @iface: the interface name
> - * @port: the TCP port to remove
> - *
> - * Removes an input from the IP table, hence forbidding access to the given
> - * @port on the given @iface interface for TCP packets
> - */
> -void
> -virNetfilterRemoveTcpInput(virFirewall *fw,
> - virFirewallLayer layer,
> - const char *iface,
> - int port)
> -{
> - iptablesInput(fw, layer, iface, port, VIR_NETFILTER_DELETE, 1);
> -}
> -
> -/**
> - * virNetfilterAddUdpInput:
> - * @ctx: pointer to the IP table context
> - * @iface: the interface name
> - * @port: the UDP port to add
> - *
> - * Add an input to the IP table allowing access to the given @port on
> - * the given @iface interface for UDP packets
> - */
> -void
> -virNetfilterAddUdpInput(virFirewall *fw,
> - virFirewallLayer layer,
> - const char *iface,
> - int port)
> -{
> - iptablesInput(fw, layer, iface, port, VIR_NETFILTER_INSERT, 0);
> -}
> -
> -/**
> - * virNetfilterRemoveUdpInput:
> - * @ctx: pointer to the IP table context
> - * @iface: the interface name
> - * @port: the UDP port to remove
> - *
> - * Removes an input from the IP table, hence forbidding access to the given
> - * @port on the given @iface interface for UDP packets
> - */
> -void
> -virNetfilterRemoveUdpInput(virFirewall *fw,
> - virFirewallLayer layer,
> - const char *iface,
> - int port)
> -{
> - iptablesInput(fw, layer, iface, port, VIR_NETFILTER_DELETE, 0);
> -}
> -
> -/**
> - * virNetfilterAddTcpOutput:
> - * @ctx: pointer to the IP table context
> - * @iface: the interface name
> - * @port: the TCP port to add
> - *
> - * Add an output to the IP table allowing access to the given @port from
> - * the given @iface interface for TCP packets
> - */
> -void
> -virNetfilterAddTcpOutput(virFirewall *fw,
> - virFirewallLayer layer,
> - const char *iface,
> - int port)
> -{
> - iptablesOutput(fw, layer, iface, port, VIR_NETFILTER_INSERT, 1);
> -}
> -
> -/**
> - * virNetfilterRemoveTcpOutput:
> - * @ctx: pointer to the IP table context
> - * @iface: the interface name
> - * @port: the UDP port to remove
> - *
> - * Removes an output from the IP table, hence forbidding access to the given
> - * @port from the given @iface interface for TCP packets
> - */
> -void
> -virNetfilterRemoveTcpOutput(virFirewall *fw,
> - virFirewallLayer layer,
> - const char *iface,
> - int port)
> -{
> - iptablesOutput(fw, layer, iface, port, VIR_NETFILTER_DELETE, 1);
> -}
> -
> -/**
> - * virNetfilterAddUdpOutput:
> - * @ctx: pointer to the IP table context
> - * @iface: the interface name
> - * @port: the UDP port to add
> - *
> - * Add an output to the IP table allowing access to the given @port from
> - * the given @iface interface for UDP packets
> - */
> -void
> -virNetfilterAddUdpOutput(virFirewall *fw,
> - virFirewallLayer layer,
> - const char *iface,
> - int port)
> -{
> - iptablesOutput(fw, layer, iface, port, VIR_NETFILTER_INSERT, 0);
> -}
> -
> -/**
> - * virNetfilterRemoveUdpOutput:
> - * @ctx: pointer to the IP table context
> - * @iface: the interface name
> - * @port: the UDP port to remove
> - *
> - * Removes an output from the IP table, hence forbidding access to the given
> - * @port from the given @iface interface for UDP packets
> - */
> -void
> -virNetfilterRemoveUdpOutput(virFirewall *fw,
> - virFirewallLayer layer,
> - const char *iface,
> - int port)
> -{
> - iptablesOutput(fw, layer, iface, port, VIR_NETFILTER_DELETE, 0);
> -}
> -
>
> /* Allow all traffic coming from the bridge, with a valid network address
> * to proceed to WAN
> */
> -static int
> +int
> iptablesForwardAllowOut(virFirewall *fw,
> virSocketAddr *netaddr,
> unsigned int prefix,
> @@ -383,59 +235,11 @@ iptablesForwardAllowOut(virFirewall *fw,
> return 0;
> }
>
> -/**
> - * virNetfilterAddForwardAllowOut:
> - * @ctx: pointer to the IP table context
> - * @network: the source network name
> - * @iface: the source interface name
> - * @physdev: the physical output device
> - *
> - * Add a rule to the IP table context to allow the traffic for the
> - * network @network via interface @iface to be forwarded to
> - * @physdev device. This allow the outbound traffic on a bridge.
> - *
> - * Returns 0 in case of success or an error code otherwise
> - */
> -int
> -virNetfilterAddForwardAllowOut(virFirewall *fw,
> - virSocketAddr *netaddr,
> - unsigned int prefix,
> - const char *iface,
> - const char *physdev)
> -{
> - return iptablesForwardAllowOut(fw, netaddr, prefix, iface, physdev,
> - VIR_NETFILTER_INSERT);
> -}
> -
> -/**
> - * virNetfilterRemoveForwardAllowOut:
> - * @ctx: pointer to the IP table context
> - * @network: the source network name
> - * @iface: the source interface name
> - * @physdev: the physical output device
> - *
> - * Remove a rule from the IP table context hence forbidding forwarding
> - * of the traffic for the network @network via interface @iface
> - * to the @physdev device output. This stops the outbound traffic on a bridge.
> - *
> - * Returns 0 in case of success or an error code otherwise
> - */
> -int
> -virNetfilterRemoveForwardAllowOut(virFirewall *fw,
> - virSocketAddr *netaddr,
> - unsigned int prefix,
> - const char *iface,
> - const char *physdev)
> -{
> - return iptablesForwardAllowOut(fw, netaddr, prefix, iface, physdev,
> - VIR_NETFILTER_DELETE);
> -}
> -
>
> /* Allow all traffic destined to the bridge, with a valid network address
> * and associated with an existing connection
> */
> -static int
> +int
> iptablesForwardAllowRelatedIn(virFirewall *fw,
> virSocketAddr *netaddr,
> unsigned int prefix,
> @@ -477,57 +281,10 @@ iptablesForwardAllowRelatedIn(virFirewall *fw,
> return 0;
> }
>
> -/**
> - * virNetfilterAddForwardAllowRelatedIn:
> - * @ctx: pointer to the IP table context
> - * @network: the source network name
> - * @iface: the output interface name
> - * @physdev: the physical input device or NULL
> - *
> - * Add rules to the IP table context to allow the traffic for the
> - * network @network on @physdev device to be forwarded to
> - * interface @iface, if it is part of an existing connection.
> - *
> - * Returns 0 in case of success or an error code otherwise
> - */
> -int
> -virNetfilterAddForwardAllowRelatedIn(virFirewall *fw,
> - virSocketAddr *netaddr,
> - unsigned int prefix,
> - const char *iface,
> - const char *physdev)
> -{
> - return iptablesForwardAllowRelatedIn(fw, netaddr, prefix, iface, physdev,
> - VIR_NETFILTER_INSERT);
> -}
> -
> -/**
> - * virNetfilterRemoveForwardAllowRelatedIn:
> - * @ctx: pointer to the IP table context
> - * @network: the source network name
> - * @iface: the output interface name
> - * @physdev: the physical input device or NULL
> - *
> - * Remove rules from the IP table context hence forbidding the traffic for
> - * network @network on @physdev device to be forwarded to
> - * interface @iface, if it is part of an existing connection.
> - *
> - * Returns 0 in case of success or an error code otherwise
> - */
> -int
> -virNetfilterRemoveForwardAllowRelatedIn(virFirewall *fw,
> - virSocketAddr *netaddr,
> - unsigned int prefix,
> - const char *iface,
> - const char *physdev)
> -{
> - return iptablesForwardAllowRelatedIn(fw, netaddr, prefix, iface, physdev,
> - VIR_NETFILTER_DELETE);
> -}
>
> /* Allow all traffic destined to the bridge, with a valid network address
> */
> -static int
> +int
> iptablesForwardAllowIn(virFirewall *fw,
> virSocketAddr *netaddr,
> unsigned int prefix,
> @@ -564,55 +321,8 @@ iptablesForwardAllowIn(virFirewall *fw,
> return 0;
> }
>
> -/**
> - * virNetfilterAddForwardAllowIn:
> - * @ctx: pointer to the IP table context
> - * @network: the source network name
> - * @iface: the output interface name
> - * @physdev: the physical input device or NULL
> - *
> - * Add rules to the IP table context to allow the traffic for the
> - * network @network on @physdev device to be forwarded to
> - * interface @iface. This allow the inbound traffic on a bridge.
> - *
> - * Returns 0 in case of success or an error code otherwise
> - */
> -int
> -virNetfilterAddForwardAllowIn(virFirewall *fw,
> - virSocketAddr *netaddr,
> - unsigned int prefix,
> - const char *iface,
> - const char *physdev)
> -{
> - return iptablesForwardAllowIn(fw, netaddr, prefix, iface, physdev,
> - VIR_NETFILTER_INSERT);
> -}
>
> -/**
> - * virNetfilterRemoveForwardAllowIn:
> - * @ctx: pointer to the IP table context
> - * @network: the source network name
> - * @iface: the output interface name
> - * @physdev: the physical input device or NULL
> - *
> - * Remove rules from the IP table context hence forbidding the traffic for
> - * network @network on @physdev device to be forwarded to
> - * interface @iface. This stops the inbound traffic on a bridge.
> - *
> - * Returns 0 in case of success or an error code otherwise
> - */
> -int
> -virNetfilterRemoveForwardAllowIn(virFirewall *fw,
> - virSocketAddr *netaddr,
> - unsigned int prefix,
> - const char *iface,
> - const char *physdev)
> -{
> - return iptablesForwardAllowIn(fw, netaddr, prefix, iface, physdev,
> - VIR_NETFILTER_DELETE);
> -}
> -
> -static void
> +void
> iptablesForwardAllowCross(virFirewall *fw,
> virFirewallLayer layer,
> const char *iface,
> @@ -628,45 +338,8 @@ iptablesForwardAllowCross(virFirewall *fw,
> NULL);
> }
>
> -/**
> - * virNetfilterAddForwardAllowCross:
> - * @ctx: pointer to the IP table context
> - * @iface: the input/output interface name
> - *
> - * Add rules to the IP table context to allow traffic to cross that
> - * interface. It allows all traffic between guests on the same bridge
> - * represented by that interface.
> - *
> - * Returns 0 in case of success or an error code otherwise
> - */
> -void
> -virNetfilterAddForwardAllowCross(virFirewall *fw,
> - virFirewallLayer layer,
> - const char *iface)
> -{
> - iptablesForwardAllowCross(fw, layer, iface, VIR_NETFILTER_INSERT);
> -}
>
> -/**
> - * virNetfilterRemoveForwardAllowCross:
> - * @ctx: pointer to the IP table context
> - * @iface: the input/output interface name
> - *
> - * Remove rules to the IP table context to block traffic to cross that
> - * interface. It forbids traffic between guests on the same bridge
> - * represented by that interface.
> - *
> - * Returns 0 in case of success or an error code otherwise
> - */
> void
> -virNetfilterRemoveForwardAllowCross(virFirewall *fw,
> - virFirewallLayer layer,
> - const char *iface)
> -{
> - iptablesForwardAllowCross(fw, layer, iface, VIR_NETFILTER_DELETE);
> -}
> -
> -static void
> iptablesForwardRejectOut(virFirewall *fw,
> virFirewallLayer layer,
> const char *iface,
> @@ -681,44 +354,8 @@ iptablesForwardRejectOut(virFirewall *fw,
> NULL);
> }
>
> -/**
> - * virNetfilterAddForwardRejectOut:
> - * @ctx: pointer to the IP table context
> - * @iface: the output interface name
> - *
> - * Add rules to the IP table context to forbid all traffic to that
> - * interface. It forbids forwarding from the bridge to that interface.
> - *
> - * Returns 0 in case of success or an error code otherwise
> - */
> -void
> -virNetfilterAddForwardRejectOut(virFirewall *fw,
> - virFirewallLayer layer,
> - const char *iface)
> -{
> - iptablesForwardRejectOut(fw, layer, iface, VIR_NETFILTER_INSERT);
> -}
>
> -/**
> - * virNetfilterRemoveForwardRejectOut:
> - * @ctx: pointer to the IP table context
> - * @iface: the output interface name
> - *
> - * Remove rules from the IP table context forbidding all traffic to that
> - * interface. It reallow forwarding from the bridge to that interface.
> - *
> - * Returns 0 in case of success or an error code otherwise
> - */
> void
> -virNetfilterRemoveForwardRejectOut(virFirewall *fw,
> - virFirewallLayer layer,
> - const char *iface)
> -{
> - iptablesForwardRejectOut(fw, layer, iface, VIR_NETFILTER_DELETE);
> -}
> -
> -
> -static void
> iptablesForwardRejectIn(virFirewall *fw,
> virFirewallLayer layer,
> const char *iface,
> @@ -733,47 +370,11 @@ iptablesForwardRejectIn(virFirewall *fw,
> NULL);
> }
>
> -/**
> - * virNetfilterAddForwardRejectIn:
> - * @ctx: pointer to the IP table context
> - * @iface: the input interface name
> - *
> - * Add rules to the IP table context to forbid all traffic from that
> - * interface. It forbids forwarding from that interface to the bridge.
> - *
> - * Returns 0 in case of success or an error code otherwise
> - */
> -void
> -virNetfilterAddForwardRejectIn(virFirewall *fw,
> - virFirewallLayer layer,
> - const char *iface)
> -{
> - iptablesForwardRejectIn(fw, layer, iface, VIR_NETFILTER_INSERT);
> -}
> -
> -/**
> - * virNetfilterRemoveForwardRejectIn:
> - * @ctx: pointer to the IP table context
> - * @iface: the input interface name
> - *
> - * Remove rules from the IP table context forbidding all traffic from that
> - * interface. It allows forwarding from that interface to the bridge.
> - *
> - * Returns 0 in case of success or an error code otherwise
> - */
> -void
> -virNetfilterRemoveForwardRejectIn(virFirewall *fw,
> - virFirewallLayer layer,
> - const char *iface)
> -{
> - iptablesForwardRejectIn(fw, layer, iface, VIR_NETFILTER_DELETE);
> -}
> -
>
> /* Masquerade all traffic coming from the network associated
> * with the bridge
> */
> -static int
> +int
> iptablesForwardMasquerade(virFirewall *fw,
> virSocketAddr *netaddr,
> unsigned int prefix,
> @@ -868,65 +469,11 @@ iptablesForwardMasquerade(virFirewall *fw,
> return 0;
> }
>
> -/**
> - * virNetfilterAddForwardMasquerade:
> - * @ctx: pointer to the IP table context
> - * @network: the source network name
> - * @physdev: the physical input device or NULL
> - * @protocol: the network protocol or NULL
> - *
> - * Add rules to the IP table context to allow masquerading
> - * network @network on @physdev. This allow the bridge to
> - * masquerade for that network (on @physdev).
> - *
> - * Returns 0 in case of success or an error code otherwise
> - */
> -int
> -virNetfilterAddForwardMasquerade(virFirewall *fw,
> - virSocketAddr *netaddr,
> - unsigned int prefix,
> - const char *physdev,
> - virSocketAddrRange *addr,
> - virPortRange *port,
> - const char *protocol)
> -{
> - return iptablesForwardMasquerade(fw, netaddr, prefix,
> - physdev, addr, port, protocol,
> - VIR_NETFILTER_INSERT);
> -}
> -
> -/**
> - * virNetfilterRemoveForwardMasquerade:
> - * @ctx: pointer to the IP table context
> - * @network: the source network name
> - * @physdev: the physical input device or NULL
> - * @protocol: the network protocol or NULL
> - *
> - * Remove rules from the IP table context to stop masquerading
> - * network @network on @physdev. This stops the bridge from
> - * masquerading for that network (on @physdev).
> - *
> - * Returns 0 in case of success or an error code otherwise
> - */
> -int
> -virNetfilterRemoveForwardMasquerade(virFirewall *fw,
> - virSocketAddr *netaddr,
> - unsigned int prefix,
> - const char *physdev,
> - virSocketAddrRange *addr,
> - virPortRange *port,
> - const char *protocol)
> -{
> - return iptablesForwardMasquerade(fw, netaddr, prefix,
> - physdev, addr, port, protocol,
> - VIR_NETFILTER_DELETE);
> -}
> -
>
> /* Don't masquerade traffic coming from the network associated with the bridge
> * if said traffic targets @destaddr.
> */
> -static int
> +int
> iptablesForwardDontMasquerade(virFirewall *fw,
> virSocketAddr *netaddr,
> unsigned int prefix,
> @@ -964,57 +511,6 @@ iptablesForwardDontMasquerade(virFirewall *fw,
> return 0;
> }
>
> -/**
> - * virNetfilterAddDontMasquerade:
> - * @netaddr: the source network name
> - * @prefix: prefix (# of 1 bits) of netmask to apply to @netaddr
> - * @physdev: the physical output device or NULL
> - * @destaddr: the destination network not to masquerade for
> - *
> - * Add rules to the IP table context to avoid masquerading from
> - * @netaddr/@prefix to @destaddr on @physdev. @destaddr must be in a format
> - * directly consumable by iptables/nftables, it must not depend on user input or
> - * configuration.
> - *
> - * Returns 0 in case of success or an error code otherwise.
> - */
> -int
> -virNetfilterAddDontMasquerade(virFirewall *fw,
> - virSocketAddr *netaddr,
> - unsigned int prefix,
> - const char *physdev,
> - const char *destaddr)
> -{
> - return iptablesForwardDontMasquerade(fw, netaddr, prefix,
> - physdev, destaddr, VIR_NETFILTER_INSERT);
> -}
> -
> -/**
> - * virNetfilterRemoveDontMasquerade:
> - * @netaddr: the source network name
> - * @prefix: prefix (# of 1 bits) of netmask to apply to @netaddr
> - * @physdev: the physical output device or NULL
> - * @destaddr: the destination network not to masquerade for
> - *
> - * Remove rules from the IP table context that prevent masquerading from
> - * @netaddr/@prefix to @destaddr on @physdev. @destaddr must be in a format
> - * directly consumable by iptables/nftables, it must not depend on user input or
> - * configuration.
> - *
> - * Returns 0 in case of success or an error code otherwise.
> - */
> -int
> -virNetfilterRemoveDontMasquerade(virFirewall *fw,
> - virSocketAddr *netaddr,
> - unsigned int prefix,
> - const char *physdev,
> - const char *destaddr)
> -{
> - return iptablesForwardDontMasquerade(fw, netaddr, prefix,
> - physdev, destaddr,
> - VIR_NETFILTER_DELETE);
> -}
> -
>
> static void
> iptablesOutputFixUdpChecksum(virFirewall *fw,
> diff --git a/src/util/viriptables.h b/src/util/viriptables.h
> index 610c4dccde..6ea589121e 100644
> --- a/src/util/viriptables.h
> +++ b/src/util/viriptables.h
> @@ -23,133 +23,101 @@
> #include "virsocketaddr.h"
> #include "virfirewall.h"
>
> +/* These functions are (currently) called directly from the consumer
> + * (e.g. the network driver), and only when the iptables backend is
> + * selected. (Possibly/probably functions should be added to the
> + * netfilter*() API that will call them instead, but that first
> + * requires untangling all the special cases for setting up private
> + * chains that are necessitated by firewalld reloads).
> + */
> int iptablesSetupPrivateChains (virFirewallLayer layer);
>
> -void virNetfilterAddTcpInput (virFirewall *fw,
> - virFirewallLayer layer,
> - const char *iface,
> - int port);
> -void virNetfilterRemoveTcpInput (virFirewall *fw,
> - virFirewallLayer layer,
> - const char *iface,
> - int port);
> -
> -void virNetfilterAddUdpInput (virFirewall *fw,
> - virFirewallLayer layer,
> - const char *iface,
> - int port);
> -void virNetfilterRemoveUdpInput (virFirewall *fw,
> - virFirewallLayer layer,
> - const char *iface,
> - int port);
> -
> -void virNetfilterAddTcpOutput (virFirewall *fw,
> - virFirewallLayer layer,
> - const char *iface,
> - int port);
> -void virNetfilterRemoveTcpOutput (virFirewall *fw,
> - virFirewallLayer layer,
> - const char *iface,
> - int port);
> -void virNetfilterAddUdpOutput (virFirewall *fw,
> - virFirewallLayer layer,
> - const char *iface,
> - int port);
> -void virNetfilterRemoveUdpOutput (virFirewall *fw,
> - virFirewallLayer layer,
> - const char *iface,
> - int port);
> -
> -int virNetfilterAddForwardAllowOut (virFirewall *fw,
> - virSocketAddr *netaddr,
> - unsigned int prefix,
> - const char *iface,
> - const char *physdev)
> - G_GNUC_WARN_UNUSED_RESULT;
> -int virNetfilterRemoveForwardAllowOut(virFirewall *fw,
> - virSocketAddr *netaddr,
> - unsigned int prefix,
> - const char *iface,
> - const char *physdev)
> - G_GNUC_WARN_UNUSED_RESULT;
> -int virNetfilterAddForwardAllowRelatedIn(virFirewall *fw,
> - virSocketAddr *netaddr,
> - unsigned int prefix,
> - const char *iface,
> - const char *physdev)
> - G_GNUC_WARN_UNUSED_RESULT;
> -int virNetfilterRemoveForwardAllowRelatedIn(virFirewall *fw,
> - virSocketAddr *netaddr,
> - unsigned int prefix,
> - const char *iface,
> - const char *physdev)
> - G_GNUC_WARN_UNUSED_RESULT;
> -
> -int virNetfilterAddForwardAllowIn (virFirewall *fw,
> - virSocketAddr *netaddr,
> - unsigned int prefix,
> - const char *iface,
> - const char *physdev)
> - G_GNUC_WARN_UNUSED_RESULT;
> -int virNetfilterRemoveForwardAllowIn(virFirewall *fw,
> - virSocketAddr *netaddr,
> - unsigned int prefix,
> - const char *iface,
> - const char *physdev)
> - G_GNUC_WARN_UNUSED_RESULT;
> -
> -void virNetfilterAddForwardAllowCross(virFirewall *fw,
> - virFirewallLayer layer,
> - const char *iface);
> -void virNetfilterRemoveForwardAllowCross(virFirewall *fw,
> - virFirewallLayer layer,
> - const char *iface);
> -
> -void virNetfilterAddForwardRejectOut (virFirewall *fw,
> - virFirewallLayer layer,
> - const char *iface);
> -void virNetfilterRemoveForwardRejectOut(virFirewall *fw,
> - virFirewallLayer layer,
> - const char *iface);
> -
> -void virNetfilterAddForwardRejectIn (virFirewall *fw,
> - virFirewallLayer layer,
> - const char *iface);
> -void virNetfilterRemoveForwardRejectIn(virFirewall *fw,
> - virFirewallLayer layery,
> - const char *iface);
> -
> -int virNetfilterAddForwardMasquerade(virFirewall *fw,
> - virSocketAddr *netaddr,
> - unsigned int prefix,
> - const char *physdev,
> - virSocketAddrRange *addr,
> - virPortRange *port,
> - const char *protocol)
> - G_GNUC_WARN_UNUSED_RESULT;
> -int virNetfilterRemoveForwardMasquerade(virFirewall *fw,
> - virSocketAddr *netaddr,
> - unsigned int prefix,
> - const char *physdev,
> - virSocketAddrRange *addr,
> - virPortRange *port,
> - const char *protocol)
> - G_GNUC_WARN_UNUSED_RESULT;
> -int virNetfilterAddDontMasquerade (virFirewall *fw,
> - virSocketAddr *netaddr,
> - unsigned int prefix,
> - const char *physdev,
> - const char *destaddr)
> - G_GNUC_WARN_UNUSED_RESULT;
> -int virNetfilterRemoveDontMasquerade(virFirewall *fw,
> - virSocketAddr *netaddr,
> - unsigned int prefix,
> - const char *physdev,
> - const char *destaddr)
> - G_GNUC_WARN_UNUSED_RESULT;
> void iptablesAddOutputFixUdpChecksum (virFirewall *fw,
> const char *iface,
> int port);
> void iptablesRemoveOutputFixUdpChecksum (virFirewall *fw,
> const char *iface,
> int port);
> +
> +/* These functions are only called from virnetfilter.c. Each can be
> + * called with an action of VIR_NETFILTER_INSERT or
> + * VIR_NETFILTER_DELETE, to add or remove the described rule(s) in the
> + * appropriate chain.
> + */
> +
> +void
> +iptablesInput(virFirewall *fw,
> + virFirewallLayer layer,
> + const char *iface,
> + int port,
> + int action,
> + int tcp);
> +
> +void
> +iptablesOutput(virFirewall *fw,
> + virFirewallLayer layer,
> + const char *iface,
> + int port,
> + int action,
> + int tcp);
> +
> +int
> +iptablesForwardAllowOut(virFirewall *fw,
> + virSocketAddr *netaddr,
> + unsigned int prefix,
> + const char *iface,
> + const char *physdev,
> + int action);
> +
> +int
> +iptablesForwardAllowRelatedIn(virFirewall *fw,
> + virSocketAddr *netaddr,
> + unsigned int prefix,
> + const char *iface,
> + const char *physdev,
> + int action);
> +
> +int
> +iptablesForwardAllowIn(virFirewall *fw,
> + virSocketAddr *netaddr,
> + unsigned int prefix,
> + const char *iface,
> + const char *physdev,
> + int action);
> +
> +
> +void
> +iptablesForwardAllowCross(virFirewall *fw,
> + virFirewallLayer layer,
> + const char *iface,
> + int action);
> +
> +void
> +iptablesForwardRejectOut(virFirewall *fw,
> + virFirewallLayer layer,
> + const char *iface,
> + int action);
> +
> +void
> +iptablesForwardRejectIn(virFirewall *fw,
> + virFirewallLayer layer,
> + const char *iface,
> + int action);
> +
> +int
> +iptablesForwardMasquerade(virFirewall *fw,
> + virSocketAddr *netaddr,
> + unsigned int prefix,
> + const char *physdev,
> + virSocketAddrRange *addr,
> + virPortRange *port,
> + const char *protocol,
> + int action);
> +
> +int
> +iptablesForwardDontMasquerade(virFirewall *fw,
> + virSocketAddr *netaddr,
> + unsigned int prefix,
> + const char *physdev,
> + const char *destaddr,
> + int action);
> diff --git a/src/util/virnetfilter.c b/src/util/virnetfilter.c
> new file mode 100644
> index 0000000000..efe2ca01dc
> --- /dev/null
> +++ b/src/util/virnetfilter.c
> @@ -0,0 +1,570 @@
> +/*
> + * virnetfilter.c: backend-agnostic packet filter helper APIs
> + *
> + * Copyright (C) 2023 Red Hat, Inc.
> + *
> + * This library is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU Lesser General Public
> + * License as published by the Free Software Foundation; either
> + * version 2.1 of the License, or (at your option) any later version.
> + *
> + * This library is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + * Lesser General Public License for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public
> + * License along with this library. If not, see
> + * <http://www.gnu.org/licenses/>.
> + */
> +
> +#include <config.h>
> +
> +#include <stdarg.h>
> +#include <unistd.h>
> +#include <fcntl.h>
> +#include <sys/types.h>
> +#include <sys/stat.h>
> +
> +#include "internal.h"
> +#include "virnetfilter.h"
> +#include "viriptables.h"
> +#include "vircommand.h"
> +#include "viralloc.h"
> +#include "virerror.h"
> +#include "virfile.h"
> +#include "virlog.h"
> +#include "virthread.h"
> +#include "virstring.h"
> +#include "virutil.h"
> +#include "virhash.h"
> +
> +VIR_LOG_INIT("util.netfilter");
> +
> +#define VIR_FROM_THIS VIR_FROM_NONE
> +
> +
> +/**
> + * virNetfilterAddTcpInput:
> + * @ctx: pointer to the IP table context
> + * @iface: the interface name
> + * @port: the TCP port to add
> + *
> + * Add an input to the IP table allowing access to the given @port on
> + * the given @iface interface for TCP packets
> + */
> +void
> +virNetfilterAddTcpInput(virFirewall *fw,
> + virFirewallLayer layer,
> + const char *iface,
> + int port)
> +{
> + iptablesInput(fw, layer, iface, port, VIR_NETFILTER_INSERT, 1);
> +}
> +
> +
> +/**
> + * virNetfilterRemoveTcpInput:
> + * @ctx: pointer to the IP table context
> + * @iface: the interface name
> + * @port: the TCP port to remove
> + *
> + * Removes an input from the IP table, hence forbidding access to the given
> + * @port on the given @iface interface for TCP packets
> + */
> +void
> +virNetfilterRemoveTcpInput(virFirewall *fw,
> + virFirewallLayer layer,
> + const char *iface,
> + int port)
> +{
> + iptablesInput(fw, layer, iface, port, VIR_NETFILTER_DELETE, 1);
> +}
> +
> +
> +/**
> + * virNetfilterAddUdpInput:
> + * @ctx: pointer to the IP table context
> + * @iface: the interface name
> + * @port: the UDP port to add
> + *
> + * Add an input to the IP table allowing access to the given @port on
> + * the given @iface interface for UDP packets
> + */
> +void
> +virNetfilterAddUdpInput(virFirewall *fw,
> + virFirewallLayer layer,
> + const char *iface,
> + int port)
> +{
> + iptablesInput(fw, layer, iface, port, VIR_NETFILTER_INSERT, 0);
> +}
> +
> +
> +/**
> + * virNetfilterRemoveUdpInput:
> + * @ctx: pointer to the IP table context
> + * @iface: the interface name
> + * @port: the UDP port to remove
> + *
> + * Removes an input from the IP table, hence forbidding access to the given
> + * @port on the given @iface interface for UDP packets
> + */
> +void
> +virNetfilterRemoveUdpInput(virFirewall *fw,
> + virFirewallLayer layer,
> + const char *iface,
> + int port)
> +{
> + iptablesInput(fw, layer, iface, port, VIR_NETFILTER_DELETE, 0);
> +}
> +
> +
> +/**
> + * virNetfilterAddTcpOutput:
> + * @ctx: pointer to the IP table context
> + * @iface: the interface name
> + * @port: the TCP port to add
> + *
> + * Add an output to the IP table allowing access to the given @port from
> + * the given @iface interface for TCP packets
> + */
> +void
> +virNetfilterAddTcpOutput(virFirewall *fw,
> + virFirewallLayer layer,
> + const char *iface,
> + int port)
> +{
> + iptablesOutput(fw, layer, iface, port, VIR_NETFILTER_INSERT, 1);
> +}
> +
> +
> +/**
> + * virNetfilterRemoveTcpOutput:
> + * @ctx: pointer to the IP table context
> + * @iface: the interface name
> + * @port: the UDP port to remove
> + *
> + * Removes an output from the IP table, hence forbidding access to the given
> + * @port from the given @iface interface for TCP packets
> + */
> +void
> +virNetfilterRemoveTcpOutput(virFirewall *fw,
> + virFirewallLayer layer,
> + const char *iface,
> + int port)
> +{
> + iptablesOutput(fw, layer, iface, port, VIR_NETFILTER_DELETE, 1);
> +}
> +
> +
> +/**
> + * virNetfilterAddUdpOutput:
> + * @ctx: pointer to the IP table context
> + * @iface: the interface name
> + * @port: the UDP port to add
> + *
> + * Add an output to the IP table allowing access to the given @port from
> + * the given @iface interface for UDP packets
> + */
> +void
> +virNetfilterAddUdpOutput(virFirewall *fw,
> + virFirewallLayer layer,
> + const char *iface,
> + int port)
> +{
> + iptablesOutput(fw, layer, iface, port, VIR_NETFILTER_INSERT, 0);
> +}
> +
> +
> +/**
> + * virNetfilterRemoveUdpOutput:
> + * @ctx: pointer to the IP table context
> + * @iface: the interface name
> + * @port: the UDP port to remove
> + *
> + * Removes an output from the IP table, hence forbidding access to the given
> + * @port from the given @iface interface for UDP packets
> + */
> +void
> +virNetfilterRemoveUdpOutput(virFirewall *fw,
> + virFirewallLayer layer,
> + const char *iface,
> + int port)
> +{
> + iptablesOutput(fw, layer, iface, port, VIR_NETFILTER_DELETE, 0);
> +}
> +
> +
> +/**
> + * virNetfilterAddForwardAllowOut:
> + * @ctx: pointer to the IP table context
> + * @network: the source network name
> + * @iface: the source interface name
> + * @physdev: the physical output device
> + *
> + * Add a rule to the IP table context to allow the traffic for the
> + * network @network via interface @iface to be forwarded to
> + * @physdev device. This allow the outbound traffic on a bridge.
> + *
> + * Returns 0 in case of success or an error code otherwise
> + */
> +int
> +virNetfilterAddForwardAllowOut(virFirewall *fw,
> + virSocketAddr *netaddr,
> + unsigned int prefix,
> + const char *iface,
> + const char *physdev)
> +{
> + return iptablesForwardAllowOut(fw, netaddr, prefix, iface, physdev,
> + VIR_NETFILTER_INSERT);
> +}
> +
> +
> +/**
> + * virNetfilterRemoveForwardAllowOut:
> + * @ctx: pointer to the IP table context
> + * @network: the source network name
> + * @iface: the source interface name
> + * @physdev: the physical output device
> + *
> + * Remove a rule from the IP table context hence forbidding forwarding
> + * of the traffic for the network @network via interface @iface
> + * to the @physdev device output. This stops the outbound traffic on a bridge.
> + *
> + * Returns 0 in case of success or an error code otherwise
> + */
> +int
> +virNetfilterRemoveForwardAllowOut(virFirewall *fw,
> + virSocketAddr *netaddr,
> + unsigned int prefix,
> + const char *iface,
> + const char *physdev)
> +{
> + return iptablesForwardAllowOut(fw, netaddr, prefix, iface, physdev,
> + VIR_NETFILTER_DELETE);
> +}
> +
> +
> +/**
> + * virNetfilterAddForwardAllowRelatedIn:
> + * @ctx: pointer to the IP table context
> + * @network: the source network name
> + * @iface: the output interface name
> + * @physdev: the physical input device or NULL
> + *
> + * Add rules to the IP table context to allow the traffic for the
> + * network @network on @physdev device to be forwarded to
> + * interface @iface, if it is part of an existing connection.
> + *
> + * Returns 0 in case of success or an error code otherwise
> + */
> +int
> +virNetfilterAddForwardAllowRelatedIn(virFirewall *fw,
> + virSocketAddr *netaddr,
> + unsigned int prefix,
> + const char *iface,
> + const char *physdev)
> +{
> + return iptablesForwardAllowRelatedIn(fw, netaddr, prefix, iface, physdev,
> + VIR_NETFILTER_INSERT);
> +}
> +
> +
> +/**
> + * virNetfilterRemoveForwardAllowRelatedIn:
> + * @ctx: pointer to the IP table context
> + * @network: the source network name
> + * @iface: the output interface name
> + * @physdev: the physical input device or NULL
> + *
> + * Remove rules from the IP table context hence forbidding the traffic for
> + * network @network on @physdev device to be forwarded to
> + * interface @iface, if it is part of an existing connection.
> + *
> + * Returns 0 in case of success or an error code otherwise
> + */
> +int
> +virNetfilterRemoveForwardAllowRelatedIn(virFirewall *fw,
> + virSocketAddr *netaddr,
> + unsigned int prefix,
> + const char *iface,
> + const char *physdev)
> +{
> + return iptablesForwardAllowRelatedIn(fw, netaddr, prefix, iface, physdev,
> + VIR_NETFILTER_DELETE);
> +}
> +
> +
> +/**
> + * virNetfilterAddForwardAllowIn:
> + * @ctx: pointer to the IP table context
> + * @network: the source network name
> + * @iface: the output interface name
> + * @physdev: the physical input device or NULL
> + *
> + * Add rules to the IP table context to allow the traffic for the
> + * network @network on @physdev device to be forwarded to
> + * interface @iface. This allow the inbound traffic on a bridge.
> + *
> + * Returns 0 in case of success or an error code otherwise
> + */
> +int
> +virNetfilterAddForwardAllowIn(virFirewall *fw,
> + virSocketAddr *netaddr,
> + unsigned int prefix,
> + const char *iface,
> + const char *physdev)
> +{
> + return iptablesForwardAllowIn(fw, netaddr, prefix, iface, physdev,
> + VIR_NETFILTER_INSERT);
> +}
> +
> +
> +/**
> + * virNetfilterRemoveForwardAllowIn:
> + * @ctx: pointer to the IP table context
> + * @network: the source network name
> + * @iface: the output interface name
> + * @physdev: the physical input device or NULL
> + *
> + * Remove rules from the IP table context hence forbidding the traffic for
> + * network @network on @physdev device to be forwarded to
> + * interface @iface. This stops the inbound traffic on a bridge.
> + *
> + * Returns 0 in case of success or an error code otherwise
> + */
> +int
> +virNetfilterRemoveForwardAllowIn(virFirewall *fw,
> + virSocketAddr *netaddr,
> + unsigned int prefix,
> + const char *iface,
> + const char *physdev)
> +{
> + return iptablesForwardAllowIn(fw, netaddr, prefix, iface, physdev,
> + VIR_NETFILTER_DELETE);
> +}
> +
> +
> +/**
> + * virNetfilterAddForwardAllowCross:
> + * @ctx: pointer to the IP table context
> + * @iface: the input/output interface name
> + *
> + * Add rules to the IP table context to allow traffic to cross that
> + * interface. It allows all traffic between guests on the same bridge
> + * represented by that interface.
> + *
> + * Returns 0 in case of success or an error code otherwise
> + */
> +void
> +virNetfilterAddForwardAllowCross(virFirewall *fw,
> + virFirewallLayer layer,
> + const char *iface)
> +{
> + iptablesForwardAllowCross(fw, layer, iface, VIR_NETFILTER_INSERT);
> +}
> +
> +
> +/**
> + * virNetfilterRemoveForwardAllowCross:
> + * @ctx: pointer to the IP table context
> + * @iface: the input/output interface name
> + *
> + * Remove rules to the IP table context to block traffic to cross that
> + * interface. It forbids traffic between guests on the same bridge
> + * represented by that interface.
> + *
> + * Returns 0 in case of success or an error code otherwise
> + */
> +void
> +virNetfilterRemoveForwardAllowCross(virFirewall *fw,
> + virFirewallLayer layer,
> + const char *iface)
> +{
> + iptablesForwardAllowCross(fw, layer, iface, VIR_NETFILTER_DELETE);
> +}
> +
> +
> +/**
> + * virNetfilterAddForwardRejectOut:
> + * @ctx: pointer to the IP table context
> + * @iface: the output interface name
> + *
> + * Add rules to the IP table context to forbid all traffic to that
> + * interface. It forbids forwarding from the bridge to that interface.
> + *
> + * Returns 0 in case of success or an error code otherwise
> + */
> +void
> +virNetfilterAddForwardRejectOut(virFirewall *fw,
> + virFirewallLayer layer,
> + const char *iface)
> +{
> + iptablesForwardRejectOut(fw, layer, iface, VIR_NETFILTER_INSERT);
> +}
> +
> +/**
> + * virNetfilterRemoveForwardRejectOut:
> + * @ctx: pointer to the IP table context
> + * @iface: the output interface name
> + *
> + * Remove rules from the IP table context forbidding all traffic to that
> + * interface. It reallow forwarding from the bridge to that interface.
> + *
> + * Returns 0 in case of success or an error code otherwise
> + */
> +void
> +virNetfilterRemoveForwardRejectOut(virFirewall *fw,
> + virFirewallLayer layer,
> + const char *iface)
> +{
> + iptablesForwardRejectOut(fw, layer, iface, VIR_NETFILTER_DELETE);
> +}
> +
> +
> +/**
> + * virNetfilterAddForwardRejectIn:
> + * @ctx: pointer to the IP table context
> + * @iface: the input interface name
> + *
> + * Add rules to the IP table context to forbid all traffic from that
> + * interface. It forbids forwarding from that interface to the bridge.
> + *
> + * Returns 0 in case of success or an error code otherwise
> + */
> +void
> +virNetfilterAddForwardRejectIn(virFirewall *fw,
> + virFirewallLayer layer,
> + const char *iface)
> +{
> + iptablesForwardRejectIn(fw, layer, iface, VIR_NETFILTER_INSERT);
> +}
> +
> +
> +/**
> + * virNetfilterRemoveForwardRejectIn:
> + * @ctx: pointer to the IP table context
> + * @iface: the input interface name
> + *
> + * Remove rules from the IP table context forbidding all traffic from that
> + * interface. It allows forwarding from that interface to the bridge.
> + *
> + * Returns 0 in case of success or an error code otherwise
> + */
> +void
> +virNetfilterRemoveForwardRejectIn(virFirewall *fw,
> + virFirewallLayer layer,
> + const char *iface)
> +{
> + iptablesForwardRejectIn(fw, layer, iface, VIR_NETFILTER_DELETE);
> +}
> +
> +
> +/**
> + * virNetfilterAddForwardMasquerade:
> + * @ctx: pointer to the IP table context
> + * @network: the source network name
> + * @physdev: the physical input device or NULL
> + * @protocol: the network protocol or NULL
> + *
> + * Add rules to the IP table context to allow masquerading
> + * network @network on @physdev. This allow the bridge to
> + * masquerade for that network (on @physdev).
> + *
> + * Returns 0 in case of success or an error code otherwise
> + */
> +int
> +virNetfilterAddForwardMasquerade(virFirewall *fw,
> + virSocketAddr *netaddr,
> + unsigned int prefix,
> + const char *physdev,
> + virSocketAddrRange *addr,
> + virPortRange *port,
> + const char *protocol)
> +{
> + return iptablesForwardMasquerade(fw, netaddr, prefix,
> + physdev, addr, port, protocol,
> + VIR_NETFILTER_INSERT);
> +}
> +
> +
> +/**
> + * virNetfilterRemoveForwardMasquerade:
> + * @ctx: pointer to the IP table context
> + * @network: the source network name
> + * @physdev: the physical input device or NULL
> + * @protocol: the network protocol or NULL
> + *
> + * Remove rules from the IP table context to stop masquerading
> + * network @network on @physdev. This stops the bridge from
> + * masquerading for that network (on @physdev).
> + *
> + * Returns 0 in case of success or an error code otherwise
> + */
> +int
> +virNetfilterRemoveForwardMasquerade(virFirewall *fw,
> + virSocketAddr *netaddr,
> + unsigned int prefix,
> + const char *physdev,
> + virSocketAddrRange *addr,
> + virPortRange *port,
> + const char *protocol)
> +{
> + return iptablesForwardMasquerade(fw, netaddr, prefix,
> + physdev, addr, port, protocol,
> + VIR_NETFILTER_DELETE);
> +}
> +
> +
> +/**
> + * virNetfilterAddDontMasquerade:
> + * @netaddr: the source network name
> + * @prefix: prefix (# of 1 bits) of netmask to apply to @netaddr
> + * @physdev: the physical output device or NULL
> + * @destaddr: the destination network not to masquerade for
> + *
> + * Add rules to the IP table context to avoid masquerading from
> + * @netaddr/@prefix to @destaddr on @physdev. @destaddr must be in a format
> + * directly consumable by iptables/nftables, it must not depend on user input or
> + * configuration.
> + *
> + * Returns 0 in case of success or an error code otherwise.
> + */
> +int
> +virNetfilterAddDontMasquerade(virFirewall *fw,
> + virSocketAddr *netaddr,
> + unsigned int prefix,
> + const char *physdev,
> + const char *destaddr)
> +{
> + return iptablesForwardDontMasquerade(fw, netaddr, prefix,
> + physdev, destaddr, VIR_NETFILTER_INSERT);
> +}
> +
> +
> +/**
> + * virNetfilterRemoveDontMasquerade:
> + * @netaddr: the source network name
> + * @prefix: prefix (# of 1 bits) of netmask to apply to @netaddr
> + * @physdev: the physical output device or NULL
> + * @destaddr: the destination network not to masquerade for
> + *
> + * Remove rules from the IP table context that prevent masquerading from
> + * @netaddr/@prefix to @destaddr on @physdev. @destaddr must be in a format
> + * directly consumable by iptables/nftables, it must not depend on user input or
> + * configuration.
> + *
> + * Returns 0 in case of success or an error code otherwise.
> + */
> +int
> +virNetfilterRemoveDontMasquerade(virFirewall *fw,
> + virSocketAddr *netaddr,
> + unsigned int prefix,
> + const char *physdev,
> + const char *destaddr)
> +{
> + return iptablesForwardDontMasquerade(fw, netaddr, prefix,
> + physdev, destaddr,
> + VIR_NETFILTER_DELETE);
> +}
> diff --git a/src/util/virnetfilter.h b/src/util/virnetfilter.h
> new file mode 100644
> index 0000000000..c75f7eccbd
> --- /dev/null
> +++ b/src/util/virnetfilter.h
> @@ -0,0 +1,151 @@
> +/*
> + * virnetfilter.h: backend-agnostic packet filter helper APIs
> + *
> + * Copyright (C) 2023 Red Hat, Inc.
> + *
> + * This library is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU Lesser General Public
> + * License as published by the Free Software Foundation; either
> + * version 2.1 of the License, or (at your option) any later version.
> + *
> + * This library is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + * Lesser General Public License for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public
> + * License along with this library. If not, see
> + * <http://www.gnu.org/licenses/>.
> + */
> +
> +#pragma once
> +
> +#include "virsocketaddr.h"
> +#include "virfirewall.h"
> +
> +enum {
> + VIR_NETFILTER_INSERT = 0,
> + VIR_NETFILTER_DELETE
> +};
> +
> +void virNetfilterAddTcpInput (virFirewall *fw,
> + virFirewallLayer layer,
> + const char *iface,
> + int port);
> +void virNetfilterRemoveTcpInput (virFirewall *fw,
> + virFirewallLayer layer,
> + const char *iface,
> + int port);
> +void virNetfilterAddUdpInput (virFirewall *fw,
> + virFirewallLayer layer,
> + const char *iface,
> + int port);
> +void virNetfilterRemoveUdpInput (virFirewall *fw,
> + virFirewallLayer layer,
> + const char *iface,
> + int port);
> +
> +void virNetfilterAddTcpOutput (virFirewall *fw,
> + virFirewallLayer layer,
> + const char *iface,
> + int port);
> +void virNetfilterRemoveTcpOutput (virFirewall *fw,
> + virFirewallLayer layer,
> + const char *iface,
> + int port);
> +void virNetfilterAddUdpOutput (virFirewall *fw,
> + virFirewallLayer layer,
> + const char *iface,
> + int port);
> +void virNetfilterRemoveUdpOutput (virFirewall *fw,
> + virFirewallLayer layer,
> + const char *iface,
> + int port);
> +
> +int virNetfilterAddForwardAllowOut (virFirewall *fw,
> + virSocketAddr *netaddr,
> + unsigned int prefix,
> + const char *iface,
> + const char *physdev)
> + G_GNUC_WARN_UNUSED_RESULT;
> +int virNetfilterRemoveForwardAllowOut(virFirewall *fw,
> + virSocketAddr *netaddr,
> + unsigned int prefix,
> + const char *iface,
> + const char *physdev)
> + G_GNUC_WARN_UNUSED_RESULT;
> +int virNetfilterAddForwardAllowRelatedIn(virFirewall *fw,
> + virSocketAddr *netaddr,
> + unsigned int prefix,
> + const char *iface,
> + const char *physdev)
> + G_GNUC_WARN_UNUSED_RESULT;
> +int virNetfilterRemoveForwardAllowRelatedIn(virFirewall *fw,
> + virSocketAddr *netaddr,
> + unsigned int prefix,
> + const char *iface,
> + const char *physdev)
> + G_GNUC_WARN_UNUSED_RESULT;
> +
> +int virNetfilterAddForwardAllowIn (virFirewall *fw,
> + virSocketAddr *netaddr,
> + unsigned int prefix,
> + const char *iface,
> + const char *physdev)
> + G_GNUC_WARN_UNUSED_RESULT;
> +int virNetfilterRemoveForwardAllowIn(virFirewall *fw,
> + virSocketAddr *netaddr,
> + unsigned int prefix,
> + const char *iface,
> + const char *physdev)
> + G_GNUC_WARN_UNUSED_RESULT;
> +
> +void virNetfilterAddForwardAllowCross(virFirewall *fw,
> + virFirewallLayer layer,
> + const char *iface);
> +void virNetfilterRemoveForwardAllowCross(virFirewall *fw,
> + virFirewallLayer layer,
> + const char *iface);
> +
> +void virNetfilterAddForwardRejectOut (virFirewall *fw,
> + virFirewallLayer layer,
> + const char *iface);
> +void virNetfilterRemoveForwardRejectOut(virFirewall *fw,
> + virFirewallLayer layer,
> + const char *iface);
> +
> +void virNetfilterAddForwardRejectIn (virFirewall *fw,
> + virFirewallLayer layer,
> + const char *iface);
> +void virNetfilterRemoveForwardRejectIn(virFirewall *fw,
> + virFirewallLayer layery,
> + const char *iface);
> +
> +int virNetfilterAddForwardMasquerade(virFirewall *fw,
> + virSocketAddr *netaddr,
> + unsigned int prefix,
> + const char *physdev,
> + virSocketAddrRange *addr,
> + virPortRange *port,
> + const char *protocol)
> + G_GNUC_WARN_UNUSED_RESULT;
> +int virNetfilterRemoveForwardMasquerade(virFirewall *fw,
> + virSocketAddr *netaddr,
> + unsigned int prefix,
> + const char *physdev,
> + virSocketAddrRange *addr,
> + virPortRange *port,
> + const char *protocol)
> + G_GNUC_WARN_UNUSED_RESULT;
> +int virNetfilterAddDontMasquerade (virFirewall *fw,
> + virSocketAddr *netaddr,
> + unsigned int prefix,
> + const char *physdev,
> + const char *destaddr)
> + G_GNUC_WARN_UNUSED_RESULT;
> +int virNetfilterRemoveDontMasquerade(virFirewall *fw,
> + virSocketAddr *netaddr,
> + unsigned int prefix,
> + const char *physdev,
> + const char *destaddr)
> + G_GNUC_WARN_UNUSED_RESULT;
> --
> 2.39.2
>
With regards,
Daniel
--
|: https://berrange.com -o- https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org -o- https://fstop138.berrange.com :|
|: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|
More information about the libvir-list
mailing list