⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 server.c

📁 非常好的dns解析软件
💻 C
📖 第 1 页 / 共 5 页
字号:
	 * Warning if both "recursion no;" and allow-recursion are active	 * except for "allow-recursion { none; };".	 */	if (!view->recursion && view->recursionacl != NULL &&	    (view->recursionacl->length != 1 ||	     view->recursionacl->elements[0].type != dns_aclelementtype_any ||	     view->recursionacl->elements[0].negative != ISC_TRUE))		isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,			      NS_LOGMODULE_SERVER, ISC_LOG_WARNING,			      "both \"recursion no;\" and \"allow-recursion\" "			      "active%s%s", forview, viewname);	/*	 * Set default "allow-recursion" acl.	 */	if (view->recursionacl == NULL && view->recursion)		CHECK(configure_view_acl(NULL, ns_g_defaults, "allow-recursion",					 actx, ns_g_mctx, &view->recursionacl));	CHECK(configure_view_acl(vconfig, config, "sortlist",				 actx, ns_g_mctx, &view->sortlist));	obj = NULL;	result = ns_config_get(maps, "request-ixfr", &obj);	INSIST(result == ISC_R_SUCCESS);	view->requestixfr = cfg_obj_asboolean(obj);	obj = NULL;	result = ns_config_get(maps, "provide-ixfr", &obj);	INSIST(result == ISC_R_SUCCESS);	view->provideixfr = cfg_obj_asboolean(obj);	obj = NULL;	result = ns_config_get(maps, "max-clients-per-query", &obj);	INSIST(result == ISC_R_SUCCESS);	max_clients_per_query = cfg_obj_asuint32(obj);	obj = NULL;	result = ns_config_get(maps, "clients-per-query", &obj);	INSIST(result == ISC_R_SUCCESS);	dns_resolver_setclientsperquery(view->resolver,					cfg_obj_asuint32(obj),					max_clients_per_query);				obj = NULL;	result = ns_config_get(maps, "dnssec-enable", &obj);	INSIST(result == ISC_R_SUCCESS);	view->enablednssec = cfg_obj_asboolean(obj);	obj = NULL;	result = ns_config_get(maps, "dnssec-accept-expired", &obj);	INSIST(result == ISC_R_SUCCESS);	view->acceptexpired = cfg_obj_asboolean(obj);	obj = NULL;	result = ns_config_get(maps, "dnssec-validation", &obj);	INSIST(result == ISC_R_SUCCESS);	view->enablevalidation = cfg_obj_asboolean(obj);	obj = NULL;	result = ns_config_get(maps, "dnssec-lookaside", &obj);	if (result == ISC_R_SUCCESS) {		for (element = cfg_list_first(obj);		     element != NULL;		     element = cfg_list_next(element))		{			const char *str;			isc_buffer_t b;			dns_name_t *dlv;			obj = cfg_listelt_value(element);#if 0			dns_fixedname_t fixed;			dns_name_t *name;			/*			 * When we support multiple dnssec-lookaside			 * entries this is how to find the domain to be			 * checked. XXXMPA			 */			dns_fixedname_init(&fixed);			name = dns_fixedname_name(&fixed);			str = cfg_obj_asstring(cfg_tuple_get(obj,							     "domain"));			isc_buffer_init(&b, str, strlen(str));			isc_buffer_add(&b, strlen(str));			CHECK(dns_name_fromtext(name, &b, dns_rootname,						ISC_TRUE, NULL));#endif			str = cfg_obj_asstring(cfg_tuple_get(obj,							     "trust-anchor"));			isc_buffer_init(&b, str, strlen(str));			isc_buffer_add(&b, strlen(str));			dlv = dns_fixedname_name(&view->dlv_fixed);			CHECK(dns_name_fromtext(dlv, &b, dns_rootname,						ISC_TRUE, NULL));			view->dlv = dns_fixedname_name(&view->dlv_fixed);		}	} else		view->dlv = NULL;	/*	 * For now, there is only one kind of trusted keys, the	 * "security roots".	 */	CHECK(configure_view_dnsseckeys(vconfig, config, mctx,					&view->secroots));	dns_resolver_resetmustbesecure(view->resolver);	obj = NULL;	result = ns_config_get(maps, "dnssec-must-be-secure", &obj);	if (result == ISC_R_SUCCESS)		CHECK(mustbesecure(obj, view->resolver));	obj = NULL;	result = ns_config_get(maps, "max-cache-ttl", &obj);	INSIST(result == ISC_R_SUCCESS);	view->maxcachettl = cfg_obj_asuint32(obj);	obj = NULL;	result = ns_config_get(maps, "max-ncache-ttl", &obj);	INSIST(result == ISC_R_SUCCESS);	view->maxncachettl = cfg_obj_asuint32(obj);	if (view->maxncachettl > 7 * 24 * 3600)		view->maxncachettl = 7 * 24 * 3600;	obj = NULL;	result = ns_config_get(maps, "preferred-glue", &obj);	if (result == ISC_R_SUCCESS) {		str = cfg_obj_asstring(obj);		if (strcasecmp(str, "a") == 0)			view->preferred_glue = dns_rdatatype_a;		else if (strcasecmp(str, "aaaa") == 0)			view->preferred_glue = dns_rdatatype_aaaa;		else			view->preferred_glue = 0;	} else		view->preferred_glue = 0;	obj = NULL;	result = ns_config_get(maps, "root-delegation-only", &obj);	if (result == ISC_R_SUCCESS) {		dns_view_setrootdelonly(view, ISC_TRUE);		if (!cfg_obj_isvoid(obj)) {			dns_fixedname_t fixed;			dns_name_t *name;			isc_buffer_t b;			const char *str;			const cfg_obj_t *exclude;			dns_fixedname_init(&fixed);			name = dns_fixedname_name(&fixed);			for (element = cfg_list_first(obj);			     element != NULL;			     element = cfg_list_next(element)) {				exclude = cfg_listelt_value(element);				str = cfg_obj_asstring(exclude);				isc_buffer_init(&b, str, strlen(str));				isc_buffer_add(&b, strlen(str));				CHECK(dns_name_fromtext(name, &b, dns_rootname,							ISC_FALSE, NULL));				CHECK(dns_view_excludedelegationonly(view,								     name));			}		}	} else		dns_view_setrootdelonly(view, ISC_FALSE);	/*	 * Setup automatic empty zones.  If recursion is off then	 * they are disabled by default.	 */	obj = NULL;	(void)ns_config_get(maps, "empty-zones-enable", &obj);	(void)ns_config_get(maps, "disable-empty-zone", &disablelist);	if (obj == NULL && disablelist == NULL &&	    view->rdclass == dns_rdataclass_in) {		rfc1918 = ISC_FALSE;		empty_zones_enable = view->recursion;	} else if (view->rdclass == dns_rdataclass_in) {		rfc1918 = ISC_TRUE;		if (obj != NULL)			empty_zones_enable = cfg_obj_asboolean(obj);		else			empty_zones_enable = view->recursion;	} else {		rfc1918 = ISC_FALSE;		empty_zones_enable = ISC_FALSE;	}	if (empty_zones_enable) {		const char *empty;		int empty_zone = 0;		dns_fixedname_t fixed;		dns_name_t *name;		isc_buffer_t buffer;		const char *str;		char server[DNS_NAME_FORMATSIZE + 1];		char contact[DNS_NAME_FORMATSIZE + 1];		isc_boolean_t logit;		const char *empty_dbtype[4] =				    { "_builtin", "empty", NULL, NULL };		int empty_dbtypec = 4;		dns_fixedname_init(&fixed);		name = dns_fixedname_name(&fixed);		obj = NULL;		result = ns_config_get(maps, "empty-server", &obj);		if (result == ISC_R_SUCCESS) {			str = cfg_obj_asstring(obj);			isc_buffer_init(&buffer, str, strlen(str));			isc_buffer_add(&buffer, strlen(str));			CHECK(dns_name_fromtext(name, &buffer, dns_rootname,						ISC_FALSE, NULL));			isc_buffer_init(&buffer, server, sizeof(server) - 1);			CHECK(dns_name_totext(name, ISC_FALSE, &buffer));			server[isc_buffer_usedlength(&buffer)] = 0;			empty_dbtype[2] = server;		} else			empty_dbtype[2] = "@";		obj = NULL;		result = ns_config_get(maps, "empty-contact", &obj);		if (result == ISC_R_SUCCESS) {			str = cfg_obj_asstring(obj);			isc_buffer_init(&buffer, str, strlen(str));			isc_buffer_add(&buffer, strlen(str));			CHECK(dns_name_fromtext(name, &buffer, dns_rootname,						ISC_FALSE, NULL));			isc_buffer_init(&buffer, contact, sizeof(contact) - 1);			CHECK(dns_name_totext(name, ISC_FALSE, &buffer));			contact[isc_buffer_usedlength(&buffer)] = 0;			empty_dbtype[3] = contact;		} else			empty_dbtype[3] = ".";		logit = ISC_TRUE;		for (empty = empty_zones[empty_zone].zone;		     empty != NULL;		     empty = empty_zones[++empty_zone].zone)		{			dns_forwarders_t *forwarders = NULL;			dns_view_t *pview = NULL;			isc_buffer_init(&buffer, empty, strlen(empty));			isc_buffer_add(&buffer, strlen(empty));			/*			 * Look for zone on drop list.			 */			CHECK(dns_name_fromtext(name, &buffer, dns_rootname,						ISC_FALSE, NULL));			if (disablelist != NULL &&			    on_disable_list(disablelist, name))				continue;			/*			 * This zone already exists.			 */			(void)dns_view_findzone(view, name, &zone);			if (zone != NULL) {				dns_zone_detach(&zone);				continue;			}			/*			 * If we would forward this name don't add a			 * empty zone for it.			 */			result = dns_fwdtable_find(view->fwdtable, name,						   &forwarders);			if (result == ISC_R_SUCCESS &&			    forwarders->fwdpolicy == dns_fwdpolicy_only)				continue;									if (!rfc1918 && empty_zones[empty_zone].rfc1918) {				if (logit) {					isc_log_write(ns_g_lctx,						      NS_LOGCATEGORY_GENERAL,						      NS_LOGMODULE_SERVER,						      ISC_LOG_WARNING,					              "Warning%s%s: "						      "'empty-zones-enable/"						      "disable-empty-zone' "						      "not set: disabling "						      "RFC 1918 empty zones",						      sep, viewname);					logit = ISC_FALSE;				}				continue;			}			/*			 * See if we can re-use a existing zone.			 */			result = dns_viewlist_find(&ns_g_server->viewlist,						   view->name, view->rdclass,						   &pview);			if (result != ISC_R_NOTFOUND &&			    result != ISC_R_SUCCESS)				goto cleanup;			if (pview != NULL) {				(void)dns_view_findzone(pview, name, &zone);				dns_view_detach(&pview);				if (zone != NULL)					check_dbtype(&zone, empty_dbtypec,						     empty_dbtype, mctx);				if (zone != NULL) {					dns_zone_setview(zone, view);					dns_zone_detach(&zone);					continue;				}			}			CHECK(dns_zone_create(&zone, mctx));			CHECK(dns_zone_setorigin(zone, name));			dns_zone_setview(zone, view);			CHECK(dns_zonemgr_managezone(ns_g_server->zonemgr, zone));			dns_zone_setclass(zone, view->rdclass);			dns_zone_settype(zone, dns_zone_master);			CHECK(dns_zone_setdbtype(zone, empty_dbtypec,					 	 empty_dbtype));			if (view->queryacl != NULL)				dns_zone_setqueryacl(zone, view->queryacl);			dns_zone_setdialup(zone, dns_dialuptype_no);			dns_zone_setnotifytype(zone, dns_notifytype_no);			dns_zone_setoption(zone, DNS_ZONEOPT_NOCHECKNS,					   ISC_TRUE);			CHECK(dns_view_addzone(view, zone));			isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,				      NS_LOGMODULE_SERVER, ISC_LOG_INFO,				      "automatic empty zone%s%s: %s",				      sep, viewname,  empty);			dns_zone_detach(&zone);		}	}		result = ISC_R_SUCCESS; cleanup:	if (zone != NULL)		dns_zone_detach(&zone);	if (dispatch4 != NULL)		dns_dispatch_detach(&dispatch4);	if (dispatch6 != NULL)		dns_dispatch_detach(&dispatch6);	if (order != NULL)		dns_order_detach(&order);	if (cmctx != NULL)		isc_mem_detach(&cmctx);	if (cache != NULL)		dns_cache_detach(&cache);	return (result);}static isc_result_tconfigure_hints(dns_view_t *view, const char *filename) {	isc_result_t result;	dns_db_t *db;	db = NULL;	result = dns_rootns_create(view->mctx, view->rdclass, filename, &db);	if (result == ISC_R_SUCCESS) {		dns_view_sethints(view, db);		dns_db_detach(&db);	}	return (result);}static isc_result_tconfigure_alternates(const cfg_obj_t *config, dns_view_t *view,		     const cfg_obj_t *alternates){	const cfg_obj_t *portobj;	const cfg_obj_t *addresses;	const cfg_listelt_t *element;	isc_result_t result = ISC_R_SUCCESS;	in_port_t port;	/*	 * Determine which port to send requests to.	 */	if (ns_g_lwresdonly && ns_g_port != 0)		port = ns_g_port;	else		CHECKM(ns_config_getport(config, &port), "port");	if (alternates != NULL) {		portobj = cfg_tuple_get(alternates, "port");		if (cfg_obj_isuint32(portobj)) {			isc_uint32_t val = cfg_obj_asuint32(portobj);			if (val > ISC_UINT16_MAX) {				cfg_obj_log(portobj, ns_g_lctx, ISC_LOG_ERROR,					    "port '%u' out of range", val);				return (ISC_R_RANGE);			}			port = (in_port_t) val;		}	}	addresses = NULL;	if (alternates != NULL)		addresses = cfg_tuple_get(alternates, "addresses");	for (element = cfg_list_first(addresses);	     element != NULL;	     element = cfg_list_next(element))	{		const cfg_obj_t *alternate = cfg_listelt_value(element);		isc_sockaddr_t sa;		if (!cfg_obj_issockaddr(alternate)) {			dns_fixedname_t fixed;			dns_name_t *name;			const char *str = cfg_obj_asstring(cfg_tuple_get(							   alternate, "name"));			isc_buffer_t buffer;			in_port_t myport = port;			isc_buffer_init(&buffer, str, strlen(str));			isc_buffer_add(&buffer, strlen(str));			dns_fixedname_init(&fixed);			name = dns_fixedname_name(&fixed);			CHECK(dns_name_fromtext(name, &buffer, dns_rootname,						ISC_FALSE, NULL));			portobj = cfg_tuple_get(alternate, "port");			if (cfg_obj_isuint32(portobj)) {				isc_uint32_t val = cfg_obj_asuint32(portobj);				if (val > ISC_UINT16_MAX) {					cfg_obj_log(portobj, ns_g_lctx,						    ISC_LOG_ERROR,						    "port '%u' out of range",						     val);					return (ISC_R_RANGE);				}				myport = (in_port_t) val;			}			CHECK(dns_resolver_addalternate(view->resolver, NULL,							name, myport));			continue;		}		sa = *cfg_obj_assockaddr(alternate);		if (isc_sockaddr_getport(&sa) == 0)			isc_sockaddr_setport(&sa, port);		CHECK(dns_resolver_addalternate(view->resolver, &sa,						NULL, 0));	} cleanup:	return (result);}static isc_result_tconfigure_forward(const cfg_obj_t *config, dns_view_t *view, dns_name_t *origin,		  const cfg_obj_t *forwarders, const cfg_obj_t *forwardtype){	const cfg_obj_t *portobj;	const cfg_obj_t *faddresses;	const cfg_listelt_t *element;	dns_fwdpolicy_t fwdpolicy = dns_fwdpolicy_none;	isc_sockaddrlist_t addresses;	isc_sockaddr_t *sa;	isc_result_t result;	in_port_t port;	/*	 * Determine which port to send forwarded requests to.	 */	if (ns_g_lwresdonly && ns_g_port != 0)		port = ns_g_port;	else		CHECKM(ns_config_getport(config, &port), "port");	if (forwarders != NULL) {		portobj = cfg_tuple_get(forwarders, "port");		if (cfg_obj_isuint32(portobj)) {			isc_uint32_t val = cfg_obj_asuint32(portobj);			if (val > ISC_UINT16_MAX) {				cfg_obj_log(portobj, ns_g_lctx, ISC_LOG_ERROR,

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -