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

📄 zone.c

📁 非常好的dns解析软件
💻 C
📖 第 1 页 / 共 5 页
字号:
		level = ISC_LOG_ERROR;	else		level = ISC_LOG_WARNING;	dns_fixedname_init(&fixed);	foundname = dns_fixedname_name(&fixed);	result = dns_db_find(db, name, NULL, dns_rdatatype_a,			     0, 0, NULL, foundname, NULL, NULL);	if (result == ISC_R_SUCCESS)		return (ISC_TRUE);	if (result == DNS_R_NXRRSET) {		result = dns_db_find(db, name, NULL, dns_rdatatype_aaaa,				     0, 0, NULL, foundname, NULL, NULL);		if (result == ISC_R_SUCCESS)			return (ISC_TRUE);	}	dns_name_format(owner, ownerbuf, sizeof ownerbuf);	dns_name_format(name, namebuf, sizeof namebuf);	if (result == DNS_R_NXRRSET || result == DNS_R_NXDOMAIN ||	    result == DNS_R_EMPTYNAME) {		dns_zone_log(zone, level,			     "%s/MX '%s' has no address records (A or AAAA)",			     ownerbuf, namebuf);		/* XXX950 make fatal for 9.5.0. */		return (ISC_TRUE);	}	if (result == DNS_R_CNAME) {		if (DNS_ZONE_OPTION(zone, DNS_ZONEOPT_WARNMXCNAME) ||		    DNS_ZONE_OPTION(zone, DNS_ZONEOPT_IGNOREMXCNAME))			level = ISC_LOG_WARNING;		if (!DNS_ZONE_OPTION(zone, DNS_ZONEOPT_IGNOREMXCNAME))			dns_zone_log(zone, level,				     "%s/MX '%s' is a CNAME (illegal)",				     ownerbuf, namebuf);		return ((level == ISC_LOG_WARNING) ? ISC_TRUE : ISC_FALSE);	}	if (result == DNS_R_DNAME) {		if (DNS_ZONE_OPTION(zone, DNS_ZONEOPT_WARNMXCNAME) ||		    DNS_ZONE_OPTION(zone, DNS_ZONEOPT_IGNOREMXCNAME))			level = ISC_LOG_WARNING;		if (!DNS_ZONE_OPTION(zone, DNS_ZONEOPT_IGNOREMXCNAME)) {			dns_name_format(foundname, altbuf, sizeof altbuf);			dns_zone_log(zone, level, "%s/MX '%s' is below a DNAME"				     " '%s' (illegal)", ownerbuf, namebuf,				     altbuf);		}		return ((level == ISC_LOG_WARNING) ? ISC_TRUE : ISC_FALSE);	}	if (zone->checkmx != NULL && result == DNS_R_DELEGATION)		return ((zone->checkmx)(zone, name, owner));	return (ISC_TRUE);}static isc_boolean_tzone_check_srv(dns_zone_t *zone, dns_db_t *db, dns_name_t *name,	       dns_name_t *owner){	isc_result_t result;	char ownerbuf[DNS_NAME_FORMATSIZE];	char namebuf[DNS_NAME_FORMATSIZE];	char altbuf[DNS_NAME_FORMATSIZE];	dns_fixedname_t fixed;	dns_name_t *foundname;	int level;		/*	 * "." means the services does not exist.	 */	if (dns_name_equal(name, dns_rootname))		return (ISC_TRUE);	/*	 * Outside of zone.	 */	if (!dns_name_issubdomain(name, &zone->origin)) {		if (zone->checksrv != NULL)			return ((zone->checksrv)(zone, name, owner));		return (ISC_TRUE);	}	if (zone->type == dns_zone_master)		level = ISC_LOG_ERROR;	else		level = ISC_LOG_WARNING;	dns_fixedname_init(&fixed);	foundname = dns_fixedname_name(&fixed);	result = dns_db_find(db, name, NULL, dns_rdatatype_a,			     0, 0, NULL, foundname, NULL, NULL);	if (result == ISC_R_SUCCESS)		return (ISC_TRUE);	if (result == DNS_R_NXRRSET) {		result = dns_db_find(db, name, NULL, dns_rdatatype_aaaa,				     0, 0, NULL, foundname, NULL, NULL);		if (result == ISC_R_SUCCESS)			return (ISC_TRUE);	}	dns_name_format(owner, ownerbuf, sizeof ownerbuf);	dns_name_format(name, namebuf, sizeof namebuf);	if (result == DNS_R_NXRRSET || result == DNS_R_NXDOMAIN ||	    result == DNS_R_EMPTYNAME) {		dns_zone_log(zone, level,			     "%s/SRV '%s' has no address records (A or AAAA)",			     ownerbuf, namebuf);		/* XXX950 make fatal for 9.5.0. */		return (ISC_TRUE);	}	if (result == DNS_R_CNAME) {		if (DNS_ZONE_OPTION(zone, DNS_ZONEOPT_WARNSRVCNAME) ||		    DNS_ZONE_OPTION(zone, DNS_ZONEOPT_IGNORESRVCNAME))			level = ISC_LOG_WARNING;		if (!DNS_ZONE_OPTION(zone, DNS_ZONEOPT_IGNORESRVCNAME))			dns_zone_log(zone, level,				     "%s/SRV '%s' is a CNAME (illegal)",				     ownerbuf, namebuf);		return ((level == ISC_LOG_WARNING) ? ISC_TRUE : ISC_FALSE);	}	if (result == DNS_R_DNAME) {		if (DNS_ZONE_OPTION(zone, DNS_ZONEOPT_WARNSRVCNAME) ||		    DNS_ZONE_OPTION(zone, DNS_ZONEOPT_IGNORESRVCNAME))			level = ISC_LOG_WARNING;		if (!DNS_ZONE_OPTION(zone, DNS_ZONEOPT_IGNORESRVCNAME)) {			dns_name_format(foundname, altbuf, sizeof altbuf);			dns_zone_log(zone, level, "%s/SRV '%s' is below a "				     "DNAME '%s' (illegal)", ownerbuf, namebuf,				     altbuf);		}		return ((level == ISC_LOG_WARNING) ? ISC_TRUE : ISC_FALSE);	}	if (zone->checksrv != NULL && result == DNS_R_DELEGATION)		return ((zone->checksrv)(zone, name, owner));	return (ISC_TRUE);}static isc_boolean_tzone_check_glue(dns_zone_t *zone, dns_db_t *db, dns_name_t *name,		dns_name_t *owner){	isc_boolean_t answer = ISC_TRUE;	isc_result_t result, tresult;	char ownerbuf[DNS_NAME_FORMATSIZE];	char namebuf[DNS_NAME_FORMATSIZE];	char altbuf[DNS_NAME_FORMATSIZE];	dns_fixedname_t fixed;	dns_name_t *foundname;	dns_rdataset_t a;	dns_rdataset_t aaaa;	int level;		/*	 * Outside of zone.	 */	if (!dns_name_issubdomain(name, &zone->origin)) {		if (zone->checkns != NULL)			return ((zone->checkns)(zone, name, owner, NULL, NULL));		return (ISC_TRUE);	}	if (zone->type == dns_zone_master)		level = ISC_LOG_ERROR;	else		level = ISC_LOG_WARNING;	dns_fixedname_init(&fixed);	foundname = dns_fixedname_name(&fixed);	dns_rdataset_init(&a);	dns_rdataset_init(&aaaa);	result = dns_db_find(db, name, NULL, dns_rdatatype_a,			     DNS_DBFIND_GLUEOK, 0, NULL,			     foundname, &a, NULL);	if (result == ISC_R_SUCCESS) {		dns_rdataset_disassociate(&a);		return (ISC_TRUE);	} else if (result == DNS_R_DELEGATION)		dns_rdataset_disassociate(&a);	if (result == DNS_R_NXRRSET || result == DNS_R_DELEGATION ||	    result == DNS_R_GLUE) {		tresult = dns_db_find(db, name, NULL, dns_rdatatype_aaaa,				     DNS_DBFIND_GLUEOK, 0, NULL,				     foundname, &aaaa, NULL);		if (tresult == ISC_R_SUCCESS) {			dns_rdataset_disassociate(&aaaa);			return (ISC_TRUE);		} 		if (tresult == DNS_R_DELEGATION)			dns_rdataset_disassociate(&aaaa);		if (result == DNS_R_GLUE || tresult == DNS_R_GLUE) {			/*			 * Check glue against child zone.			 */			if (zone->checkns != NULL)				answer = (zone->checkns)(zone, name, owner,							 &a, &aaaa);			if (dns_rdataset_isassociated(&a))				dns_rdataset_disassociate(&a);			if (dns_rdataset_isassociated(&aaaa))				dns_rdataset_disassociate(&aaaa);			return (answer);		}	} else		tresult = result;	dns_name_format(owner, ownerbuf, sizeof ownerbuf);	dns_name_format(name, namebuf, sizeof namebuf);	if (result == DNS_R_NXRRSET || result == DNS_R_NXDOMAIN ||	    result == DNS_R_EMPTYNAME || result == DNS_R_DELEGATION) {		const char *what;		if (dns_name_issubdomain(name, owner))			what = "REQUIRED GLUE ";		else if (result == DNS_R_DELEGATION)			what = "SIBLING GLUE ";		else			what = "";		if (result != DNS_R_DELEGATION ||		    DNS_ZONE_OPTION(zone, DNS_ZONEOPT_CHECKSIBLING)) {			dns_zone_log(zone, level, "%s/NS '%s' has no %s"				     "address records (A or AAAA)",				     ownerbuf, namebuf, what);			/*			 * Log missing address record.			 */			if (result == DNS_R_DELEGATION && zone->checkns != NULL)				(void)(zone->checkns)(zone, name, owner,						      &a, &aaaa);			/* XXX950 make fatal for 9.5.0. */			/* answer = ISC_FALSE; */		}	} else if (result == DNS_R_CNAME) {		dns_zone_log(zone, level, "%s/NS '%s' is a CNAME (illegal)",			     ownerbuf, namebuf);		/* XXX950 make fatal for 9.5.0. */		/* answer = ISC_FALSE; */	} else if (result == DNS_R_DNAME) {		dns_name_format(foundname, altbuf, sizeof altbuf);		dns_zone_log(zone, level,			     "%s/NS '%s' is below a DNAME '%s' (illegal)",			     ownerbuf, namebuf, altbuf);		/* XXX950 make fatal for 9.5.0. */		/* answer = ISC_FALSE; */	}	if (dns_rdataset_isassociated(&a))		dns_rdataset_disassociate(&a);	if (dns_rdataset_isassociated(&aaaa))		dns_rdataset_disassociate(&aaaa);	return (answer);}static isc_boolean_tintegrity_checks(dns_zone_t *zone, dns_db_t *db) {	dns_dbiterator_t *dbiterator = NULL;	dns_dbnode_t *node = NULL;	dns_rdataset_t rdataset;	dns_fixedname_t fixed;	dns_fixedname_t fixedbottom;	dns_rdata_mx_t mx;	dns_rdata_ns_t ns;	dns_rdata_in_srv_t srv;	dns_rdata_t rdata;	dns_name_t *name;	dns_name_t *bottom;	isc_result_t result;	isc_boolean_t ok = ISC_TRUE;	dns_fixedname_init(&fixed);	name = dns_fixedname_name(&fixed);	dns_fixedname_init(&fixedbottom);	bottom = dns_fixedname_name(&fixedbottom);	dns_rdataset_init(&rdataset);	dns_rdata_init(&rdata);	result = dns_db_createiterator(db, ISC_FALSE, &dbiterator);	if (result != ISC_R_SUCCESS)		return (ISC_TRUE);	result = dns_dbiterator_first(dbiterator);	while (result == ISC_R_SUCCESS) {		result = dns_dbiterator_current(dbiterator, &node, name);		if (result != ISC_R_SUCCESS)			goto cleanup;		/*		 * Is this name visible in the zone?		 */		if (!dns_name_issubdomain(name, &zone->origin) ||		    (dns_name_countlabels(bottom) > 0 &&		     dns_name_issubdomain(name, bottom)))			goto next;		/*		 * Don't check the NS records at the origin.		 */		if (dns_name_equal(name, &zone->origin))			goto checkmx;		result = dns_db_findrdataset(db, node, NULL, dns_rdatatype_ns, 					     0, 0, &rdataset, NULL);		if (result != ISC_R_SUCCESS)			goto checkmx;		/*		 * Remember bottom of zone.		 */		dns_name_copy(name, bottom, NULL);		result = dns_rdataset_first(&rdataset);		while (result == ISC_R_SUCCESS) {			dns_rdataset_current(&rdataset, &rdata);			result = dns_rdata_tostruct(&rdata, &ns, NULL);			RUNTIME_CHECK(result == ISC_R_SUCCESS);			if (!zone_check_glue(zone, db, &ns.name, name))				ok = ISC_FALSE;			dns_rdata_reset(&rdata);			result = dns_rdataset_next(&rdataset);		}		dns_rdataset_disassociate(&rdataset); checkmx:		result = dns_db_findrdataset(db, node, NULL, dns_rdatatype_mx, 					     0, 0, &rdataset, NULL);		if (result != ISC_R_SUCCESS)			goto checksrv;		result = dns_rdataset_first(&rdataset);		while (result == ISC_R_SUCCESS) {			dns_rdataset_current(&rdataset, &rdata);			result = dns_rdata_tostruct(&rdata, &mx, NULL);			RUNTIME_CHECK(result == ISC_R_SUCCESS);			if (!zone_check_mx(zone, db, &mx.mx, name))				ok = ISC_FALSE;			dns_rdata_reset(&rdata);			result = dns_rdataset_next(&rdataset);		}		dns_rdataset_disassociate(&rdataset); checksrv:		if (zone->rdclass != dns_rdataclass_in)			goto next;		result = dns_db_findrdataset(db, node, NULL, dns_rdatatype_srv, 					     0, 0, &rdataset, NULL);		if (result != ISC_R_SUCCESS)			goto next;		result = dns_rdataset_first(&rdataset);		while (result == ISC_R_SUCCESS) {			dns_rdataset_current(&rdataset, &rdata);			result = dns_rdata_tostruct(&rdata, &srv, NULL);			RUNTIME_CHECK(result == ISC_R_SUCCESS);			if (!zone_check_srv(zone, db, &srv.target, name))				ok = ISC_FALSE;			dns_rdata_reset(&rdata);			result = dns_rdataset_next(&rdataset);		}		dns_rdataset_disassociate(&rdataset); next:		dns_db_detachnode(db, &node);		result = dns_dbiterator_next(dbiterator);	} cleanup:	if (node != NULL)		dns_db_detachnode(db, &node);	dns_dbiterator_destroy(&dbiterator);	return (ok);}/* * OpenSSL verification of RSA keys with exponent 3 is known to be * broken prior OpenSSL 0.9.8c/0.9.7k.  Look for such keys and warn * if they are in use. */static voidzone_check_dnskeys(dns_zone_t *zone, dns_db_t *db) {	dns_dbnode_t *node = NULL;	dns_dbversion_t *version = NULL;	dns_rdata_dnskey_t dnskey;	dns_rdata_t rdata = DNS_RDATA_INIT;	dns_rdataset_t rdataset;	isc_result_t result;	isc_boolean_t logit, foundrsa = ISC_FALSE, foundmd5 = ISC_FALSE;	const char *algorithm;	result = dns_db_findnode(db, &zone->origin, ISC_FALSE, &node);	if (result != ISC_R_SUCCESS)		goto cleanup;	dns_db_currentversion(db, &version);	dns_rdataset_init(&rdataset);	result = dns_db_findrdataset(db, node, version, dns_rdatatype_dnskey,				     dns_rdatatype_none, 0, &rdataset, NULL);	if (result != ISC_R_SUCCESS)		goto cleanup;	for (result = dns_rdataset_first(&rdataset);	     result == ISC_R_SUCCESS;	     result = dns_rdataset_next(&rdataset)) 	{		dns_rdataset_current(&rdataset, &rdata);		result = dns_rdata_tostruct(&rdata, &dnskey, NULL);		INSIST(result == ISC_R_SUCCESS);				if ((dnskey.algorithm == DST_ALG_RSASHA1 ||		     dnskey.algorithm == DST_ALG_RSAMD5) &&		     dnskey.datalen > 1 && dnskey.data[0] == 1 &&		     dnskey.data[1] == 3)		{			if (dnskey.algorithm == DST_ALG_RSASHA1) {				logit = !foundrsa;				foundrsa = ISC_TRUE;				algorithm = "RSASHA1";			} else {				logit = !foundmd5;				foundmd5 = ISC_TRUE;				algorithm = "RSAMD5";			}			if (logit)				dns_zone_log(zone, ISC_LOG_WARNING,					     "weak %s (%u) key found "					     "(exponent=3)", algorithm,					     dnskey.algorithm);			if (foundrsa && foundmd5)				break;		}		dns_rdata_reset(&rdata);	}	dns_rdataset_disassociate(&rdataset); cleanup:	if (node != NULL)		dns_db_detachnode(db, &node);	if (version != NULL)		dns_db_closeversion(db, &version, ISC_FALSE);	}static isc_result_tzone_postload(dns_zone_t *zone, dns_db_t *db, isc_time_t loadtime,	      isc_result_t result){	unsigned int soacount = 0;	unsigned int nscount = 0;	unsigned int errors = 0;	isc_uint32_t serial, refresh, retry, expire, minimum;	isc_time_t now;	isc_boolean_t needdump = ISC_FALSE;	isc_boolean_t hasinclude = DNS_ZONE_FLAG(zone, DNS_ZONEFLG_HASINCLUDE);	TIME_NOW(&now);	/*	 * Initiate zone transfer?  We may need a error code that	 * indicates that the "permanent" form does not exist.	 * XXX better error feedback to log.	 */	if (result != ISC_R_SUCCESS && result != DNS_R_SEENINCLUDE) {		if (zone->type == dns_zone_slave ||		    zone->type == dns_zone_stub) {			if (result == ISC_R_FILENOTFOUND)				dns_zone_log(zone, ISC_LOG_DEBUG(1),					     "no master file");

⌨️ 快捷键说明

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