You can use views to create client-specific zone resolution in BIND.
The view statement is a powerful feature of BIND 9 that lets a name
server answer a DNS query differently depending on who is asking. It
is particularly useful for implementing split DNS setups without
having to run multiple servers.
Each view statement defines a view of the DNS namespace that will be
seen by a subset of clients. A client matches a view if its source IP
address matches the address_match_list of the view's match-clients
clause and its destination IP address matches the address_match_list
of the view's match-destinations clause. If not specified, both
match-clients and match-destinations default to matching all
addresses. In addition to checking IP addresses match-clients and
match-destinations can also take keys which provide an mechanism for
the client to select the view. A view can also be specified as
match-recursive-only, which means that only recursive requests from
matching clients will match that view. The order of the view
statements is significant — a client request will be resolved in the
context of the first view that it matches.
Zones defined within a view statement will only be accessible to
clients that match the view. By defining a zone of the same name in
multiple views, different zone data can be given to different clients,
for example, "internal" and "external" clients in a split DNS setup.
Many of the options given in the options statement can also be used
within a view statement, and then apply only when resolving queries
with that view. When no view-specific value is given, the value in the
options statement is used as a default. Also, zone options can have
default values specified in the view statement; these view-specific
defaults take precedence over those in the options statement.
Views are class specific. If no class is given, class IN is assumed.
Note that all non-IN views must contain a hint zone, since only the IN
class has compiled-in default hints.
If there are no view statements in the config file, a default view
that matches any client is automatically created in class IN. Any zone
statements specified on the top level of the configuration file are
considered to be part of this default view, and the options statement
will apply to the default view. If any explicit view statements are
present, all zone statements must occur inside view statements.