1 /* $OpenBSD: unwind.h,v 1.56 2021/08/31 20:18:03 kn Exp $ */ 2 3 /* 4 * Copyright (c) 2018 Florian Obser <florian@openbsd.org> 5 * Copyright (c) 2004 Esben Norby <norby@openbsd.org> 6 * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org> 7 * 8 * Permission to use, copy, modify, and distribute this software for any 9 * purpose with or without fee is hereby granted, provided that the above 10 * copyright notice and this permission notice appear in all copies. 11 * 12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 13 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 14 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 15 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 16 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 17 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 18 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 19 */ 20 21 #include <sys/types.h> 22 #include <sys/tree.h> 23 #include <netinet/in.h> /* INET6_ADDRSTRLEN */ 24 #include <event.h> 25 #include <imsg.h> 26 #include <netdb.h> /* NI_MAXHOST */ 27 #include <stdint.h> 28 29 #ifndef nitems 30 #define nitems(_a) (sizeof((_a)) / sizeof((_a)[0])) 31 #endif 32 33 #define _PATH_CONF_FILE "/etc/unwind.conf" 34 #define _PATH_UNWIND_SOCKET "/dev/unwind.sock" 35 #define UNWIND_USER "_unwind" 36 37 #define OPT_VERBOSE 0x00000001 38 #define OPT_VERBOSE2 0x00000002 39 #define OPT_VERBOSE3 0x00000004 40 #define OPT_NOACTION 0x00000008 41 42 #define ROOT_DNSKEY_TTL 172800 /* TTL from authority */ 43 #define KSK2017 ". 172800 IN DNSKEY 257 3 8 AwEAAaz/tAm8yTn4Mfeh5eyI96WSVexTBAvkMgJzkKTOiW1vkIbzxeF3+/4RgWOq7HrxRixHlFlExOLAJr5emLvN7SWXgnLh4+B5xQlNVz8Og8kvArMtNROxVQuCaSnIDdD5LKyWbRd2n9WGe2R8PzgCmr3EgVLrjyBxWezF0jLHwVN8efS3rCj/EWgvIWgb9tarpVUDK/b58Da+sqqls3eNbuv7pr+eoZG+SrDK6nWeL3c6H5Apxz7LjVc1uTIdsIXxuOLYA4/ilBmSVIzuDWfdRUfhHdY6+cn8HFRm+2hM8AnXGXws9555KrUB5qihylGa8subX2Nn6UwNR1AkUTV74bU=" 44 45 #define IMSG_DATA_SIZE(imsg) ((imsg).hdr.len - IMSG_HEADER_SIZE) 46 47 enum uw_resolver_type { 48 UW_RES_RECURSOR, 49 UW_RES_AUTOCONF, 50 UW_RES_ODOT_AUTOCONF, 51 UW_RES_ASR, 52 UW_RES_FORWARDER, 53 UW_RES_ODOT_FORWARDER, 54 UW_RES_DOT, 55 UW_RES_NONE 56 }; 57 58 static const char * const uw_resolver_type_str[] = { 59 "recursor", 60 "autoconf", 61 "oDoT-autoconf", 62 "stub", 63 "forwarder", 64 "oDoT-forwarder", 65 "DoT" 66 }; 67 68 static const char * const uw_resolver_type_short[] = { 69 "rec", 70 "auto", 71 "auto*", 72 "stub", 73 "forw", 74 "forw*", 75 "DoT" 76 }; 77 78 struct imsgev { 79 struct imsgbuf ibuf; 80 void (*handler)(int, short, void *); 81 struct event ev; 82 short events; 83 }; 84 85 enum imsg_type { 86 IMSG_NONE, 87 IMSG_CTL_LOG_VERBOSE, 88 IMSG_CTL_RELOAD, 89 IMSG_CTL_STATUS, 90 IMSG_CTL_AUTOCONF, 91 IMSG_CTL_MEM, 92 IMSG_RECONF_CONF, 93 IMSG_RECONF_BLOCKLIST_FILE, 94 IMSG_RECONF_FORWARDER, 95 IMSG_RECONF_DOT_FORWARDER, 96 IMSG_RECONF_FORCE, 97 IMSG_RECONF_END, 98 IMSG_UDP4SOCK, 99 IMSG_UDP6SOCK, 100 IMSG_TCP4SOCK, 101 IMSG_TCP6SOCK, 102 IMSG_ROUTESOCK, 103 IMSG_CONTROLFD, 104 IMSG_STARTUP, 105 IMSG_STARTUP_DONE, 106 IMSG_SOCKET_IPC_FRONTEND, 107 IMSG_SOCKET_IPC_RESOLVER, 108 IMSG_QUERY, 109 IMSG_ANSWER, 110 IMSG_CTL_RESOLVER_INFO, 111 IMSG_CTL_AUTOCONF_RESOLVER_INFO, 112 IMSG_CTL_MEM_INFO, 113 IMSG_CTL_END, 114 IMSG_HTTPSOCK, 115 IMSG_TAFD, 116 IMSG_NEW_TA, 117 IMSG_NEW_TAS_ABORT, 118 IMSG_NEW_TAS_DONE, 119 IMSG_NETWORK_CHANGED, 120 IMSG_BLFD, 121 IMSG_REPLACE_DNS, 122 IMSG_NEW_DNS64_PREFIXES_START, 123 IMSG_NEW_DNS64_PREFIX, 124 IMSG_NEW_DNS64_PREFIXES_DONE, 125 IMSG_CHANGE_AFS, 126 }; 127 128 struct uw_forwarder { 129 TAILQ_ENTRY(uw_forwarder) entry; 130 char ip[INET6_ADDRSTRLEN]; 131 char auth_name[NI_MAXHOST]; 132 uint16_t port; 133 uint32_t if_index; 134 int src; 135 }; 136 137 struct force_tree_entry { 138 RB_ENTRY(force_tree_entry) entry; 139 char domain[NI_MAXHOST]; 140 enum uw_resolver_type type; 141 int acceptbogus; 142 }; 143 144 RB_HEAD(force_tree, force_tree_entry); 145 146 struct resolver_preference { 147 enum uw_resolver_type types[UW_RES_NONE]; 148 int len; 149 }; 150 151 TAILQ_HEAD(uw_forwarder_head, uw_forwarder); 152 struct uw_conf { 153 struct uw_forwarder_head uw_forwarder_list; 154 struct uw_forwarder_head uw_dot_forwarder_list; 155 struct force_tree force; 156 struct resolver_preference res_pref; 157 int enabled_resolvers[UW_RES_NONE]; 158 char *blocklist_file; 159 int blocklist_log; 160 }; 161 162 struct query_imsg { 163 uint64_t id; 164 char qname[NI_MAXHOST]; 165 int t; 166 int c; 167 struct timespec tp; 168 }; 169 170 struct answer_header { 171 uint64_t id; 172 int srvfail; 173 int bogus; 174 int answer_len; 175 }; 176 177 extern uint32_t cmd_opts; 178 179 /* unwind.c */ 180 void main_imsg_compose_frontend(int, pid_t, void *, uint16_t); 181 void main_imsg_compose_frontend_fd(int, pid_t, int); 182 void main_imsg_compose_resolver(int, pid_t, void *, uint16_t); 183 void merge_config(struct uw_conf *, struct uw_conf *); 184 void imsg_event_add(struct imsgev *); 185 int imsg_compose_event(struct imsgev *, uint16_t, uint32_t, pid_t, 186 int, void *, uint16_t); 187 void imsg_receive_config(struct imsg *, struct uw_conf **); 188 189 struct uw_conf *config_new_empty(void); 190 void config_clear(struct uw_conf *); 191 192 /* printconf.c */ 193 void print_config(struct uw_conf *); 194 195 /* parse.y */ 196 struct uw_conf *parse_config(char *); 197 int cmdline_symset(char *); 198 199 RB_PROTOTYPE(force_tree, force_tree_entry, entry, force_tree_cmp); 200