In some use cases we don't want the virtual network's DNS to only listen to the vnet interface. Adding a publiclyAccessible attribute to the dns element in the configuration allows the DNS to listen to all interfaces. It simply disables the bind-dynamic option of dnsmasq for the network. --- docs/formatnetwork.html.in | 11 +++++++++++ docs/schemas/network.rng | 15 ++++++++++----- src/conf/network_conf.c | 6 ++++++ src/conf/network_conf.h | 1 + src/network/bridge_driver.c | 4 +++- tests/networkxml2confdata/nat-network-dns-hosts.conf | 1 - tests/networkxml2confdata/nat-network-dns-hosts.xml | 2 +- 7 files changed, 32 insertions(+), 8 deletions(-) diff --git a/docs/formatnetwork.html.in b/docs/formatnetwork.html.in index 6abed8f..8e43658 100644 --- a/docs/formatnetwork.html.in +++ b/docs/formatnetwork.html.in @@ -851,6 +851,17 @@ DNS server. </p> + <p> + The dns element + can have an optional <code>publiclyAccessible</code> + attribute <span class="since">Since 1.2.17</span>. + If <code>publiclyAccessible</code> is "yes", then the DNS server + will handle requests for all interfaces. + If <code>publiclyAccessible</code> is not set or "no", the DNS + server will only handle requests for the interface of the virtual + network. + </p> + Currently supported sub-elements of <code><dns></code> are: <dl> <dt><code>forwarder</code></dt> diff --git a/docs/schemas/network.rng b/docs/schemas/network.rng index 4edb6eb..f989625 100644 --- a/docs/schemas/network.rng +++ b/docs/schemas/network.rng @@ -244,12 +244,17 @@ and other features in the <dns> element --> <optional> <element name="dns"> - <optional> - <attribute name="forwardPlainNames"> - <ref name="virYesNo"/> - </attribute> - </optional> <interleave> + <optional> + <attribute name="forwardPlainNames"> + <ref name="virYesNo"/> + </attribute> + </optional> + <optional> + <attribute name="publiclyAccessible"> + <ref name="virYesNo"/> + </attribute> + </optional> <zeroOrMore> <element name="forwarder"> <attribute name="addr"><ref name="ipAddr"/></attribute> diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c index f4a9df0..99bac6d 100644 --- a/src/conf/network_conf.c +++ b/src/conf/network_conf.c @@ -1309,9 +1309,14 @@ virNetworkDNSDefParseXML(const char *networkName, size_t i; int ret = -1; xmlNodePtr save = ctxt->node; + char *publiclyAccessible = NULL; ctxt->node = node; + publiclyAccessible = virXPathString("string(./@publiclyAccessible)", ctxt); + if (publiclyAccessible) + def->publiclyAccessible = virTristateBoolTypeFromString(publiclyAccessible); + forwardPlainNames = virXPathString("string(./@forwardPlainNames)", ctxt); if (forwardPlainNames) { def->forwardPlainNames = virTristateBoolTypeFromString(forwardPlainNames); @@ -1410,6 +1415,7 @@ virNetworkDNSDefParseXML(const char *networkName, ret = 0; cleanup: + VIR_FREE(publiclyAccessible); VIR_FREE(forwardPlainNames); VIR_FREE(fwdNodes); VIR_FREE(hostNodes); diff --git a/src/conf/network_conf.h b/src/conf/network_conf.h index f69d999..f555b6b 100644 --- a/src/conf/network_conf.h +++ b/src/conf/network_conf.h @@ -136,6 +136,7 @@ struct _virNetworkDNSDef { virNetworkDNSSrvDefPtr srvs; size_t nfwds; char **forwarders; + int publiclyAccessible; /* enum virTristateBool */ }; typedef struct _virNetworkIpDef virNetworkIpDef; diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c index d195085..c39b1a5 100644 --- a/src/network/bridge_driver.c +++ b/src/network/bridge_driver.c @@ -996,8 +996,10 @@ networkDnsmasqConfContents(virNetworkObjPtr network, * other than one of the virtual guests connected directly to * this network). This was added in response to CVE 2012-3411. */ + if (network->def->dns.publiclyAccessible != VIR_TRISTATE_BOOL_YES) + virBufferAddLit(&configbuf, + "bind-dynamic\n"); virBufferAsprintf(&configbuf, - "bind-dynamic\n" "interface=%s\n", network->def->bridge); } else { diff --git a/tests/networkxml2confdata/nat-network-dns-hosts.conf b/tests/networkxml2confdata/nat-network-dns-hosts.conf index 021316f..759a9e9 100644 --- a/tests/networkxml2confdata/nat-network-dns-hosts.conf +++ b/tests/networkxml2confdata/nat-network-dns-hosts.conf @@ -10,6 +10,5 @@ expand-hosts domain-needed local=// except-interface=lo -bind-dynamic interface=virbr0 addn-hosts=/var/lib/libvirt/dnsmasq/default.addnhosts diff --git a/tests/networkxml2confdata/nat-network-dns-hosts.xml b/tests/networkxml2confdata/nat-network-dns-hosts.xml index 9add456..969dfa5 100644 --- a/tests/networkxml2confdata/nat-network-dns-hosts.xml +++ b/tests/networkxml2confdata/nat-network-dns-hosts.xml @@ -4,7 +4,7 @@ <forward dev='eth0' mode='nat'/> <bridge name='virbr0' stp='on' delay='0'/> <domain name="example.com"/> - <dns forwardPlainNames='no'> + <dns forwardPlainNames='no' publiclyAccessible='yes'> <host ip='192.168.122.1'> <hostname>host</hostname> <hostname>gateway</hostname> -- 2.1.4 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list