ff2d95be3d5e0350c5b457582cdb08869fc17789Tinderbox User * Copyright (C) 2011-2013, 2015-2017 Internet Systems Consortium, Inc. ("ISC")
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * This Source Code Form is subject to the terms of the Mozilla Public
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * License, v. 2.0. If a copy of the MPL was not distributed with this
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * file, You can obtain one at http://mozilla.org/MPL/2.0/.
421d4a06479e61fbdc35087f3c4abc9fe65ad72aEvan Hunt * Sub-zones of various trigger types.
421d4a06479e61fbdc35087f3c4abc9fe65ad72aEvan Hunt#define DNS_RPZ_CLIENT_IP_ZONE DNS_RPZ_PREFIX"client-ip"
94315060c2b0d9deafabe72d6a0482405fd9d377Evan Hunt#define DNS_RPZ_NSDNAME_ZONE DNS_RPZ_PREFIX"nsdname"
421d4a06479e61fbdc35087f3c4abc9fe65ad72aEvan Hunt * Special policies.
421d4a06479e61fbdc35087f3c4abc9fe65ad72aEvan Hunt#define DNS_RPZ_PASSTHRU_NAME DNS_RPZ_PREFIX"passthru"
421d4a06479e61fbdc35087f3c4abc9fe65ad72aEvan Hunt#define DNS_RPZ_TCP_ONLY_NAME DNS_RPZ_PREFIX"tcp-only"
87708bde16713bc02ff2598f4a82f98c699a2f2dMark Andrewstypedef enum {
421d4a06479e61fbdc35087f3c4abc9fe65ad72aEvan Hunt * Require DNS_RPZ_POLICY_PASSTHRU < DNS_RPZ_POLICY_DROP
421d4a06479e61fbdc35087f3c4abc9fe65ad72aEvan Hunt * < DNS_RPZ_POLICY_TCP_ONLY DNS_RPZ_POLICY_NXDOMAIN < DNS_RPZ_POLICY_NODATA
421d4a06479e61fbdc35087f3c4abc9fe65ad72aEvan Hunt * < DNS_RPZ_POLICY_CNAME to choose among competing policies.
87708bde16713bc02ff2598f4a82f98c699a2f2dMark Andrewstypedef enum {
9fee08f655527a5dd849b171daeeee1dbbccca76Vernon Schryver DNS_RPZ_POLICY_GIVEN = 0, /* 'given': what policy record says */
94315060c2b0d9deafabe72d6a0482405fd9d377Evan Hunt DNS_RPZ_POLICY_DISABLED = 1, /* log what would have happened */
9fee08f655527a5dd849b171daeeee1dbbccca76Vernon Schryver DNS_RPZ_POLICY_PASSTHRU = 2, /* 'passthru': do not rewrite */
421d4a06479e61fbdc35087f3c4abc9fe65ad72aEvan Hunt DNS_RPZ_POLICY_DROP = 3, /* 'drop': do not respond */
421d4a06479e61fbdc35087f3c4abc9fe65ad72aEvan Hunt DNS_RPZ_POLICY_TCP_ONLY = 4, /* 'tcp-only': answer UDP with TC=1 */
421d4a06479e61fbdc35087f3c4abc9fe65ad72aEvan Hunt DNS_RPZ_POLICY_NXDOMAIN = 5, /* 'nxdomain': answer with NXDOMAIN */
421d4a06479e61fbdc35087f3c4abc9fe65ad72aEvan Hunt DNS_RPZ_POLICY_NODATA = 6, /* 'nodata': answer with ANCOUNT=0 */
421d4a06479e61fbdc35087f3c4abc9fe65ad72aEvan Hunt DNS_RPZ_POLICY_CNAME = 7, /* 'cname x': answer with x's rrsets */
94315060c2b0d9deafabe72d6a0482405fd9d377Evan Hunt#define DNS_RPZ_ZBIT(n) (((dns_rpz_zbits_t)1) << (dns_rpz_num_t)(n))
94315060c2b0d9deafabe72d6a0482405fd9d377Evan Hunt * Mask of the specified and higher numbered policy zones
94315060c2b0d9deafabe72d6a0482405fd9d377Evan Hunt * Avoid hassles with (1<<33) or (1<<65)
94315060c2b0d9deafabe72d6a0482405fd9d377Evan Hunt#define DNS_RPZ_ZMASK(n) ((dns_rpz_zbits_t)((((n) >= DNS_RPZ_MAX_ZONES-1) ? \
19365b43e922fcbaf5caff3f92b87b52cbc1b530Evan Hunt * The trigger counter type.
421d4a06479e61fbdc35087f3c4abc9fe65ad72aEvan Hunt * The number of triggers of each type in a response policy zone.
94315060c2b0d9deafabe72d6a0482405fd9d377Evan Hunttypedef struct dns_rpz_triggers dns_rpz_triggers_t;
421d4a06479e61fbdc35087f3c4abc9fe65ad72aEvan Hunt * A single response policy zone.
94315060c2b0d9deafabe72d6a0482405fd9d377Evan Hunt dns_rpz_num_t num; /* ordinal in list of policy zones */
421d4a06479e61fbdc35087f3c4abc9fe65ad72aEvan Hunt dns_name_t client_ip; /* DNS_RPZ_CLIENT_IP_ZONE.origin. */
94315060c2b0d9deafabe72d6a0482405fd9d377Evan Hunt dns_name_t nsdname; /* DNS_RPZ_NSDNAME_ZONE.origin */
94315060c2b0d9deafabe72d6a0482405fd9d377Evan Hunt dns_name_t cname; /* override value for ..._CNAME */
94315060c2b0d9deafabe72d6a0482405fd9d377Evan Hunt dns_rpz_policy_t policy; /* DNS_RPZ_POLICY_GIVEN or override */
94315060c2b0d9deafabe72d6a0482405fd9d377Evan Hunt * Radix tree node for response policy IP addresses
94315060c2b0d9deafabe72d6a0482405fd9d377Evan Hunttypedef struct dns_rpz_cidr_node dns_rpz_cidr_node_t;
7e6cf6fc6e700061a1cec3bcf67786706d956fc5Evan Hunt * Bitfields indicating which policy zones have policies of
7e6cf6fc6e700061a1cec3bcf67786706d956fc5Evan Hunt * which type.
7e6cf6fc6e700061a1cec3bcf67786706d956fc5Evan Hunt * Policy options
94315060c2b0d9deafabe72d6a0482405fd9d377Evan Hunt * Response policy zones known to a view.
7e6cf6fc6e700061a1cec3bcf67786706d956fc5Evan Hunt * RPZ policy version number (initially 0, increases whenever
7e6cf6fc6e700061a1cec3bcf67786706d956fc5Evan Hunt * the server is reconfigured with new zones or policy)
94315060c2b0d9deafabe72d6a0482405fd9d377Evan Hunt * The set of records for a policy zone are in one of these states:
94315060c2b0d9deafabe72d6a0482405fd9d377Evan Hunt * never loaded load_begun=0 have=0
94315060c2b0d9deafabe72d6a0482405fd9d377Evan Hunt * during initial loading load_begun=1 have=0
94315060c2b0d9deafabe72d6a0482405fd9d377Evan Hunt * and rbtdb->rpzsp == rbtdb->load_rpzsp
94315060c2b0d9deafabe72d6a0482405fd9d377Evan Hunt * after good load load_begun=1 have!=0
94315060c2b0d9deafabe72d6a0482405fd9d377Evan Hunt * after failed initial load load_begun=1 have=0
94315060c2b0d9deafabe72d6a0482405fd9d377Evan Hunt * and rbtdb->load_rpzsp == NULL
94315060c2b0d9deafabe72d6a0482405fd9d377Evan Hunt * reloading after failure load_begun=1 have=0
94315060c2b0d9deafabe72d6a0482405fd9d377Evan Hunt * reloading after success
94315060c2b0d9deafabe72d6a0482405fd9d377Evan Hunt * main rpzs load_begun=1 have!=0
94315060c2b0d9deafabe72d6a0482405fd9d377Evan Hunt * load rpzs load_begun=1 have=0
19365b43e922fcbaf5caff3f92b87b52cbc1b530Evan Hunt * total_triggers maintains the total number of triggers in all
19365b43e922fcbaf5caff3f92b87b52cbc1b530Evan Hunt * policy zones in the view. It is only used to print summary
19365b43e922fcbaf5caff3f92b87b52cbc1b530Evan Hunt * statistics after a zone load of how the trigger counts
94315060c2b0d9deafabe72d6a0482405fd9d377Evan Hunt * One lock for short term read-only search that guarantees the
94315060c2b0d9deafabe72d6a0482405fd9d377Evan Hunt * consistency of the pointers.
94315060c2b0d9deafabe72d6a0482405fd9d377Evan Hunt * A second lock for maintenance that guarantees no other thread
94315060c2b0d9deafabe72d6a0482405fd9d377Evan Hunt * is adding or deleting nodes.
87708bde16713bc02ff2598f4a82f98c699a2f2dMark Andrews * context for finding the best policy
87708bde16713bc02ff2598f4a82f98c699a2f2dMark Andrewstypedef struct {
421d4a06479e61fbdc35087f3c4abc9fe65ad72aEvan Hunt# define DNS_RPZ_DONE_CLIENT_IP 0x0002 /* client IP address checked */
421d4a06479e61fbdc35087f3c4abc9fe65ad72aEvan Hunt# define DNS_RPZ_DONE_QNAME 0x0004 /* qname checked */
421d4a06479e61fbdc35087f3c4abc9fe65ad72aEvan Hunt# define DNS_RPZ_DONE_QNAME_IP 0x0008 /* IP addresses of qname checked */
421d4a06479e61fbdc35087f3c4abc9fe65ad72aEvan Hunt# define DNS_RPZ_DONE_NSDNAME 0x0010 /* NS name missed; checking addresses */
87708bde16713bc02ff2598f4a82f98c699a2f2dMark Andrews * Best match so far.
9fee08f655527a5dd849b171daeeee1dbbccca76Vernon Schryver * State for chasing IP addresses and NS names including recursion.
87708bde16713bc02ff2598f4a82f98c699a2f2dMark Andrews * State of real query while recursing for NSIP or NSDNAME.
7e6cf6fc6e700061a1cec3bcf67786706d956fc5Evan Hunt * A copy of the 'have' and 'p' structures and the RPZ
7e6cf6fc6e700061a1cec3bcf67786706d956fc5Evan Hunt * policy version as of the beginning of RPZ processing,
7e6cf6fc6e700061a1cec3bcf67786706d956fc5Evan Hunt * used to avoid problems when policy is updated while
7e6cf6fc6e700061a1cec3bcf67786706d956fc5Evan Hunt * RPZ recursion is ongoing.
94315060c2b0d9deafabe72d6a0482405fd9d377Evan Hunt * p_name: current policy owner name
94315060c2b0d9deafabe72d6a0482405fd9d377Evan Hunt * r_name: recursing for this name to possible policy triggers
94315060c2b0d9deafabe72d6a0482405fd9d377Evan Hunt * f_name: saved found name from before recursion
afaa290bb6acc504e93a0adbf20b6dd6c64e6d63Vernon Schryver#define DNS_RPZ_MAX_TTL_DEFAULT DNS_RPZ_TTL_DEFAULT
87708bde16713bc02ff2598f4a82f98c699a2f2dMark Andrews * So various response policy zone messages can be turned up or down.
9fee08f655527a5dd849b171daeeee1dbbccca76Vernon Schryver#define DNS_RPZ_DEBUG_LEVEL3 ISC_LOG_DEBUG(3)
afaa290bb6acc504e93a0adbf20b6dd6c64e6d63Vernon Schryver#define DNS_RPZ_DEBUG_QUIET (DNS_RPZ_DEBUG_LEVEL3+1)
94315060c2b0d9deafabe72d6a0482405fd9d377Evan Huntdns_rpz_decode_cname(dns_rpz_zone_t *rpz, dns_rdataset_t *rdataset,
94315060c2b0d9deafabe72d6a0482405fd9d377Evan Huntdns_rpz_new_zones(dns_rpz_zones_t **rpzsp, isc_mem_t *mctx);
94315060c2b0d9deafabe72d6a0482405fd9d377Evan Huntdns_rpz_attach_rpzs(dns_rpz_zones_t *source, dns_rpz_zones_t **target);
94315060c2b0d9deafabe72d6a0482405fd9d377Evan Hunt dns_rpz_zones_t **load_rpzsp, dns_rpz_num_t rpz_num);
94315060c2b0d9deafabe72d6a0482405fd9d377Evan Huntdns_rpz_add(dns_rpz_zones_t *rpzs, dns_rpz_num_t rpz_num, dns_name_t *name);
94315060c2b0d9deafabe72d6a0482405fd9d377Evan Huntdns_rpz_delete(dns_rpz_zones_t *rpzs, dns_rpz_num_t rpz_num, dns_name_t *name);
94315060c2b0d9deafabe72d6a0482405fd9d377Evan Huntdns_rpz_find_ip(dns_rpz_zones_t *rpzs, dns_rpz_type_t rpz_type,
94315060c2b0d9deafabe72d6a0482405fd9d377Evan Hunt dns_rpz_zbits_t zbits, const isc_netaddr_t *netaddr,
94315060c2b0d9deafabe72d6a0482405fd9d377Evan Huntdns_rpz_find_name(dns_rpz_zones_t *rpzs, dns_rpz_type_t rpz_type,
87708bde16713bc02ff2598f4a82f98c699a2f2dMark Andrews#endif /* DNS_RPZ_H */