[libvirt] [PATCH v2] network: Let domains be restricted to local DNS
Laine Stump
laine at laine.org
Tue Jan 20 06:18:56 UTC 2015
I had forgotten about this patch during the holidays until John Ferlan
reminded me a few days ago.
On 12/03/2014 07:01 PM, Josh Stone wrote:
> This adds a new "localOnly" attribute on the domain element of the
> network xml. With this set to "yes", DNS requests under that domain
> will only be resolved by libvirt's dnsmasq, never forwarded upstream.
>
> This was how it worked before commit f69a6b987d616, and I found that
> functionality useful. For example, I have my host's NetworkManager
> dnsmasq configured to forward that domain to libvirt's dnsmasq, so I can
> easily resolve guest names from outside. But if libvirt's dnsmasq
> doesn't know a name and forwards it to the host, I'd get an endless
> forwarding loop. Now I can set localOnly="yes" to prevent the loop.
>
> Signed-off-by: Josh Stone <jistone at redhat.com>
> Cc: Laine Stump <laine at laine.org>
> ---
> docs/formatnetwork.html.in | 12 +++++++-
> docs/schemas/network.rng | 3 ++
> src/conf/network_conf.c | 32 ++++++++++++++++++++--
> src/conf/network_conf.h | 1 +
> src/network/bridge_driver.c | 5 ++++
> .../nat-network-dns-local-domain.conf | 14 ++++++++++
> .../nat-network-dns-local-domain.xml | 9 ++++++
> tests/networkxml2conftest.c | 1 +
> 8 files changed, 74 insertions(+), 3 deletions(-)
> create mode 100644 tests/networkxml2confdata/nat-network-dns-local-domain.conf
> create mode 100644 tests/networkxml2confdata/nat-network-dns-local-domain.xml
>
> diff --git a/docs/formatnetwork.html.in b/docs/formatnetwork.html.in
> index dc438aee8622..defcdba00930 100644
> --- a/docs/formatnetwork.html.in
> +++ b/docs/formatnetwork.html.in
> @@ -82,7 +82,7 @@
> <pre>
> ...
> <bridge name="virbr0" stp="on" delay="5"/>
> - <domain name="example.com"/>
> + <domain name="example.com" localOnly="no"/>
> <forward mode="nat" dev="eth0"/>
> ...</pre>
>
> @@ -113,6 +113,16 @@
> a <code><forward></code> mode of "nat" or "route" (or an
> isolated network with no <code><forward></code>
> element). <span class="since">Since 0.4.5</span>
> +
> + <p>
> + If the optional <code>localOnly</code> attribute on the
> + <code>domain</code> element is "yes", then DNS requests under
> + this domain will only be resolved by the virtual network's own
> + DNS server - they will not be forwarded to the host's upstream
> + DNS server. If <code>localOnly</code> is "no", and by
> + default, unresolved requests <b>will</b> be forwarded.
> + <span class="since">Since 1.2.11</span>
> + </p>
> </dd>
> <dt><code>forward</code></dt>
> <dd>Inclusion of the <code>forward</code> element indicates that
> diff --git a/docs/schemas/network.rng b/docs/schemas/network.rng
> index 4546f8037580..a1da28092375 100644
> --- a/docs/schemas/network.rng
> +++ b/docs/schemas/network.rng
> @@ -225,6 +225,9 @@
> <optional>
> <element name="domain">
> <attribute name="name"><ref name="dnsName"/></attribute>
> + <optional>
> + <attribute name="localOnly"><ref name="virYesNo"/></attribute>
> + </optional>
> </element>
> </optional>
>
> diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c
> index 97719ed536de..31b765ff2c51 100644
> --- a/src/conf/network_conf.c
> +++ b/src/conf/network_conf.c
> @@ -2083,6 +2083,18 @@ virNetworkDefParseXML(xmlXPathContextPtr ctxt)
>
> /* Parse network domain information */
> def->domain = virXPathString("string(./domain[1]/@name)", ctxt);
> + tmp = virXPathString("string(./domain[1]/@localOnly)", ctxt);
> + if (tmp) {
> + def->domain_local = virTristateBoolTypeFromString(tmp);
> + if (def->domain_local <= 0) {
> + virReportError(VIR_ERR_XML_ERROR,
> + _("Invalid domain localOnly setting '%s' "
> + "in network '%s'"),
> + tmp, def->name);
> + goto error;
> + }
> + VIR_FREE(tmp);
> + }
>
> if ((bandwidthNode = virXPathNode("./bandwidth", ctxt)) != NULL &&
> (def->bandwidth = virNetDevBandwidthParse(bandwidthNode, -1)) == NULL)
> @@ -2805,8 +2817,24 @@ virNetworkDefFormatBuf(virBufferPtr buf,
> virBufferAsprintf(buf, "<mac address='%s'/>\n", macaddr);
> }
>
> - if (def->domain)
> - virBufferAsprintf(buf, "<domain name='%s'/>\n", def->domain);
> + if (def->domain) {
> + virBufferAsprintf(buf, "<domain name='%s'", def->domain);
> +
> + /* default to "no", but don't format it in the XML */
> + if (def->domain_local) {
> + const char *local = virTristateBoolTypeToString(def->domain_local);
> +
> + if (!local) {
> + virReportError(VIR_ERR_INTERNAL_ERROR,
> + _("Unknown localOnly type %d in network"),
> + def->domain_local);
> + return -1;
> + }
> + virBufferAsprintf(buf, " localOnly='%s'", local);
> + }
> +
> + virBufferAddLit(buf, "/>\n");
> + }
>
> if (virNetworkDNSDefFormat(buf, &def->dns) < 0)
> goto error;
> diff --git a/src/conf/network_conf.h b/src/conf/network_conf.h
> index 660cd2d10cd1..bb9724fddbb8 100644
> --- a/src/conf/network_conf.h
> +++ b/src/conf/network_conf.h
> @@ -232,6 +232,7 @@ struct _virNetworkDef {
>
> char *bridge; /* Name of bridge device */
> char *domain;
> + int domain_local; /* enum virTristateBool: yes disables dns forwarding */
ACK with one small modification - I renamed domain_local to
domainLocalOnly and pushed the result.
Thanks for the contribution!
More information about the libvir-list
mailing list