libvirt/src/util/viriptables.h

156 lines
8.7 KiB
C
Raw Normal View History

/*
* viriptables.h: helper APIs for managing iptables
*
* Copyright (C) 2007, 2008 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"
int iptablesSetupPrivateChains (virFirewallLayer layer);
util: create private chains for virtual network firewall rules Historically firewall rules for virtual networks were added straight into the base chains. This works but has a number of bugs and design limitations: - It is inflexible for admins wanting to add extra rules ahead of libvirt's rules, via hook scripts. - It is not clear to the admin that the rules were created by libvirt - Each rule must be deleted by libvirt individually since they are all directly in the builtin chains - The ordering of rules in the forward chain is incorrect when multiple networks are created, allowing traffic to mistakenly flow between networks in one direction. To address all of these problems, libvirt needs to move to creating rules in its own private chains. In the top level builtin chains, libvirt will add links to its own private top level chains. Addressing the traffic ordering bug requires some extra steps. With everything going into the FORWARD chain there was interleaving of rules for outbound traffic and inbound traffic for each network: -A FORWARD -d 192.168.3.0/24 -o virbr1 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A FORWARD -s 192.168.3.0/24 -i virbr1 -j ACCEPT -A FORWARD -i virbr1 -o virbr1 -j ACCEPT -A FORWARD -o virbr1 -j REJECT --reject-with icmp-port-unreachable -A FORWARD -i virbr1 -j REJECT --reject-with icmp-port-unreachable -A FORWARD -d 192.168.2.0/24 -o virbr0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A FORWARD -s 192.168.2.0/24 -i virbr0 -j ACCEPT -A FORWARD -i virbr0 -o virbr0 -j ACCEPT -A FORWARD -o virbr0 -j REJECT --reject-with icmp-port-unreachable -A FORWARD -i virbr0 -j REJECT --reject-with icmp-port-unreachable The rule allowing outbound traffic from virbr1 would mistakenly allow packets from virbr1 to virbr0, before the rule denying input to virbr0 gets a chance to run. What we really need todo is group the forwarding rules into three distinct sets: * Cross rules - LIBVIRT_FWX -A FORWARD -i virbr1 -o virbr1 -j ACCEPT -A FORWARD -i virbr0 -o virbr0 -j ACCEPT * Incoming rules - LIBVIRT_FWI -A FORWARD -d 192.168.3.0/24 -o virbr1 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A FORWARD -o virbr1 -j REJECT --reject-with icmp-port-unreachable -A FORWARD -d 192.168.2.0/24 -o virbr0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A FORWARD -o virbr0 -j REJECT --reject-with icmp-port-unreachable * Outgoing rules - LIBVIRT_FWO -A FORWARD -s 192.168.3.0/24 -i virbr1 -j ACCEPT -A FORWARD -i virbr1 -j REJECT --reject-with icmp-port-unreachable -A FORWARD -s 192.168.2.0/24 -i virbr0 -j ACCEPT -A FORWARD -i virbr0 -j REJECT --reject-with icmp-port-unreachable There is thus no risk of outgoing rules for one network mistakenly allowing incoming traffic for another network, as all incoming rules are evalated first. With this in mind, we'll thus need three distinct chains linked from the FORWARD chain, so we end up with: INPUT --> LIBVIRT_INP (filter) OUTPUT --> LIBVIRT_OUT (filter) FORWARD +-> LIBVIRT_FWX (filter) +-> LIBVIRT_FWO \-> LIBVIRT_FWI POSTROUTING --> LIBVIRT_PRT (nat & mangle) Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
2018-10-31 19:33:21 +00:00
void iptablesAddTcpInput (virFirewall *fw,
virFirewallLayer layer,
const char *iface,
int port);
void iptablesRemoveTcpInput (virFirewall *fw,
virFirewallLayer layer,
const char *iface,
int port);
void iptablesAddUdpInput (virFirewall *fw,
virFirewallLayer layer,
const char *iface,
int port);
void iptablesRemoveUdpInput (virFirewall *fw,
virFirewallLayer layer,
const char *iface,
int port);
void iptablesAddTcpOutput (virFirewall *fw,
virFirewallLayer layer,
const char *iface,
int port);
void iptablesRemoveTcpOutput (virFirewall *fw,
virFirewallLayer layer,
const char *iface,
int port);
void iptablesAddUdpOutput (virFirewall *fw,
virFirewallLayer layer,
const char *iface,
int port);
void iptablesRemoveUdpOutput (virFirewall *fw,
virFirewallLayer layer,
const char *iface,
int port);
int iptablesAddForwardAllowOut (virFirewall *fw,
virSocketAddr *netaddr,
unsigned int prefix,
2007-03-13 22:43:22 +00:00
const char *iface,
const char *physdev)
G_GNUC_WARN_UNUSED_RESULT;
int iptablesRemoveForwardAllowOut (virFirewall *fw,
virSocketAddr *netaddr,
unsigned int prefix,
2007-03-13 22:43:22 +00:00
const char *iface,
const char *physdev)
G_GNUC_WARN_UNUSED_RESULT;
int iptablesAddForwardAllowRelatedIn(virFirewall *fw,
virSocketAddr *netaddr,
unsigned int prefix,
const char *iface,
const char *physdev)
G_GNUC_WARN_UNUSED_RESULT;
int iptablesRemoveForwardAllowRelatedIn(virFirewall *fw,
virSocketAddr *netaddr,
unsigned int prefix,
const char *iface,
const char *physdev)
G_GNUC_WARN_UNUSED_RESULT;
int iptablesAddForwardAllowIn (virFirewall *fw,
virSocketAddr *netaddr,
unsigned int prefix,
2007-03-13 22:43:22 +00:00
const char *iface,
const char *physdev)
G_GNUC_WARN_UNUSED_RESULT;
int iptablesRemoveForwardAllowIn (virFirewall *fw,
virSocketAddr *netaddr,
unsigned int prefix,
2007-03-13 22:43:22 +00:00
const char *iface,
const char *physdev)
G_GNUC_WARN_UNUSED_RESULT;
void iptablesAddForwardAllowCross (virFirewall *fw,
virFirewallLayer layer,
const char *iface);
void iptablesRemoveForwardAllowCross (virFirewall *fw,
virFirewallLayer layer,
const char *iface);
void iptablesAddForwardRejectOut (virFirewall *fw,
virFirewallLayer layer,
const char *iface);
void iptablesRemoveForwardRejectOut (virFirewall *fw,
virFirewallLayer layer,
const char *iface);
void iptablesAddForwardRejectIn (virFirewall *fw,
virFirewallLayer layer,
const char *iface);
void iptablesRemoveForwardRejectIn (virFirewall *fw,
virFirewallLayer layery,
const char *iface);
int iptablesAddForwardMasquerade (virFirewall *fw,
virSocketAddr *netaddr,
unsigned int prefix,
const char *physdev,
virSocketAddrRange *addr,
virPortRange *port,
const char *protocol)
G_GNUC_WARN_UNUSED_RESULT;
int iptablesRemoveForwardMasquerade (virFirewall *fw,
virSocketAddr *netaddr,
unsigned int prefix,
const char *physdev,
virSocketAddrRange *addr,
virPortRange *port,
const char *protocol)
G_GNUC_WARN_UNUSED_RESULT;
int iptablesAddDontMasquerade (virFirewall *fw,
virSocketAddr *netaddr,
unsigned int prefix,
const char *physdev,
const char *destaddr)
G_GNUC_WARN_UNUSED_RESULT;
int iptablesRemoveDontMasquerade (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);