named

最後更新: 2021-02-09

介紹

BIND (Berkeley Internet Name Daemon) also known as NAMED

 

目錄

 


Install

Centos6:

yum install bind-utils bind

OR

yum install bind-utils bind bind-chroot

# bind-chroot: A chroot runtime environment for the ISC BIND DNS server

/var/named/chroot
/var/named/chroot/dev
/var/named/chroot/dev/null
/var/named/chroot/dev/random
/var/named/chroot/dev/zero
/var/named/chroot/etc
/var/named/chroot/etc/localtime
/var/named/chroot/etc/named
/var/named/chroot/etc/named.conf
/var/named/chroot/etc/pki
/var/named/chroot/etc/pki/dnssec-keys
/var/named/chroot/usr
/var/named/chroot/usr/lib
/var/named/chroot/usr/lib/bind
/var/named/chroot/var
/var/named/chroot/var/log
/var/named/chroot/var/named
/var/named/chroot/var/run
/var/named/chroot/var/run/named
/var/named/chroot/var/tmp

Those files are mounted

/etc/named.conf
/etc/rndc.conf
/etc/rndc.key
/etc/named.rfc1912.zones
/etc/named.dnssec.keys
/etc/named.iscdlv.key

 


Check Version

 

named -v

BIND 9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6_4.4

 


Run it by command

 

/usr/local/bind/sbin/named -c /usr/local/bind/etc/named.conf

  • -4                         IPv4 only
  • -c config-file          Default: /etc/named.conf
  • -f                          foreground
  • -u user
  • -v                         version number
  • -V                         version number and build options

Disable the IPv6 listen

named.conf

listen-on port 53 { any; };
listen-on-v6 port 53 { none; };

 

Disable the IPv6 lookups

"/etc/sysconfig/named"

OPTIONS="-4"

-4           # Use IPv4 only even if the host machine is capable of IPv6.

Checking

ps aux | grep named

filter-aaaa-on-v4 Setting

filter-aaaa-on-v4 break-dnssec;

BIND 9 must be compiled with a special build-time option (./configure --enable-filter-aaaa)

filter-aaaa-on-v4 yes;

If AAAA filtering is active for a given transport, and a query for type AAAA or ANY is received via that transport, then AAAA records will be omitted from the response, UNLESS the response is DNSSEC-signed.

filter-aaaa-on-v4 break-dnssec;

AAAA records will be omitted even if they are signed.

RRSIG records covering type AAAA will be omitted as well.

 


Chroot 設定

 

Chroot Environment initialization script will mount the configuration files using the mount –bind command,

There is no need to copy anything into the /var/named/chroot/ directory

Setting

/etc/sysconfig/named

ROOTDIR=/var/named/chroot

Config Service

systemctl disable named

systemctl enable named-chroot

systemctl start named-chroot

# start service 後, 會有特別的 mount point

mount | grep chroot

Those directories are automatically mounted to chroot

/var/named/chroot/etc/named
/var/named/chroot/etc/named.root.key
/var/named/chroot/etc/named.conf
/var/named/chroot/etc/named.rfc1912.zones
/var/named/chroot/etc/rndc.key
/var/named/chroot/usr/lib64/bind
/var/named/chroot/etc/named.iscdlv.key
/var/named/chroot/etc/localtime
/var/named/chroot/run/named
/var/named/chroot/var/named

Package: bind-chroot

This package contains a tree of files which can be used as a chroot(2) jail for the named(8) program from the BIND package.

  • /usr/lib/systemd/system/named-chroot-setup.service
  • /var/named/chroot/*
  • ...

 


Comment

name.conf

//


 


Listen setting

 

# 設定 listen 什麼 port

port 53;

listen-on

# 選擇 listen 那個 interface.

# Multiple listen-on statements are allowed.

listen-on [ port ip_port ] { address_match_list };

原本是

listen-on port 53 { 127.0.0.1; };

我的設定

# x.x.x.x 係 WAN Interface 的 IP

listen-on port 53 { 127.0.0.1; x.x.x.x; };

OR

listen-on port 53 { any;};

listen-on-v6

# turns on BIND to listen for IPv6 queries.
# Multiple listen-on-v6 statements are allowed.

i.e.

listen-on-v6 {any;};
listen-on-v6 {none;};

 


Reload(signal)

 

SIGHUP(1)                    # Force a reload of the server.
    
SIGINT, SIGTERM(15)    # Shut down the server.

ps aux

root     26436  0.0  2.0  13928 10352 ?   Ss   Oct22   0:00 /usr/local/bind/sbin/named 
                                                              -c /usr/local/bind/etc/named.conf
root     26444  0.0  2.0  13912 10340 ?   Ss   Oct22   0:08 /usr/local/bind/sbin/named

要兩個 process 都要 kill -1 一次才 reload 到 !!

 


Log settings

 

log 一共要設定兩樣東西, 分別是

  • channel           # 設定 log 到那裡去 (file | rsyslog)
  • category         # log 什麼. 當沒有設定時, default log 到 /var/log/messages

channel

channel_name:

channel channel_name ; [ channel_name ; ... ]

Standard (pre-defined) values:

  • "default_debug"
  • "default_stderr"      output to stderr (normally the console)
  • "default_syslog"      log everything to syslog (default logging destination)
  • "null"                      discard all log entries

channel 的設定:

severity:

# lower levels will not be logged

ritical         # only critical errors.
error         # error and above.
warning     # warning and above.
notice        # notice and above.
info           # info and above - log starting to get chatty.
debug        # debug and above. Various debug levels can be defined with 'debug 0' meaning no debugging.
dynamic     # debug and above.

syslog:

syslog syslog_facility     

'syslog' indicates that this channel will use syslogd logging features

null:

# From the grammar above 'file', 'syslog', 'stderr' and 'null' are mutually exclusive for a 'channel'.

'null' writes to /dev/null

print-X:

# The default is 'no'.

print-time yes;
print-severity yes;
print-category yes;

log file 的 size 與 versions:

# limit to the file size to 128M

# Version files are created by BIND by appending .0, .1 etc
# .0 will always contain the last log information

 

file "data/named.log" versions 4 size 128m;

 

Log Rolling 策略

  • size AND versions => rolled
  • NO size AND a versions =>  rolled (BIND is restarted)
  • size AND NO versions => size limit is reached BIND will stop logging

Category

有 default, general, queries, update, resolver, security, xfer-in, xfer-out ...

queries

Logs all query transactions.

default

Logs all values which are not explicitly defined in category statements

general

Anything that is not classified as any other item in this list defaults to this category.

general: zone xxx.org/IN: expired
connect(fe80::#53) 22/Invalid argument
socket.c:5268: unexpected error:

network

Logs all network operations.

client

Processing of client requests.

update

notify                     # Logs all NOTIFY operations.

update                   # Logging of all dynamic update (DDNS) transactions

update-security     # Approval and denial of update requests used with DDNS.

security

Approval and denial of requests.

security: client x.x.x.x#59586: query (cache) 'xxx.org/A/IN' denied

zone transfers

xfer-in

xfer-out

lame-servers

Lame servers. Mis-configuration in the delegation of domains discovered by BIND 9 when trying to authoritative answers.

If the volume of these messages is high many users elect to send them to the null channel

e.g. category lame-servers {null;};

rate-limit

unmatched

No matching view clause or unrecognized class value. (default: null )

...........

Default Setting:

logging {
     category default { default_syslog; default_debug; };
     category unmatched { null; };
};

設定 Example:

options {
    .............
}

logging {
        channel my_default_log {
                print-time yes;
                print-category yes;
                file "data/named.log" versions 4 size 256m;
                severity info;
        };
        channel my_security_log {
                print-time yes;
                file "data/security.log" versions 4 size 128m;
                severity info;
        };
        /* category */
        category default{ my_default_log; };
        category security{ my_security_log;};
        category lame-servers {null;};
        category queries{null;};
};

P.S.

BIND uses syslogd before a valid logging clause is available

( named.conf parse errors => /var/log/messages )

Debug Log

channel default_debug {
    file "data/debug.log" versions 4 size 10m;
    print-time yes;
    print-category yes;
    print-severity yes;
    severity dynamic;
};

category default { default_debug; };

rndc flush; > debug.log; rndc trace 9; dig datahunter.org; rndc notrace

rndc flush; dig datahunter.org

 

 


Recursion

 

只為 Local Lan 做 resolver

options {
    recursion yes;
    allow-recursion { 127.0.0.1; 192.168.1.0/24; };
};

Other Setting

recursive-clients <integer>;              # The default is 1000

This sets the maximum number (a “hard quota”) of simultaneous recursive lookups the server performs on behalf of clients.

each recursing client uses a fair bit of memory (on the order of 20 kilobytes)

“soft quota” 90% of recursive-clients

When this lower quota is exceeded, incoming requests are accepted, but for each one, a pending request is dropped.

max-recursion-depth <integer>;         # The default is 7.

If the number of recursions exceeds this value, the recursive query is terminated and returns SERVFAIL.

max-recursion-queries <integer>;       # The default is 100.

This sets the maximum number of iterative queries that may be sent while servicing a recursive query.

resolver-query-timeout <integer>;      # 10000 (Default) ~ 30000, Unit: milliseconds

The resolver spends attempting to resolve a recursive query before failing.

 


Zone

 

以下設定將 每個 zone 的 設定放在 "/etc/named/named.zones" 裡

在 /etc/named.conf 內加入

include "/etc/named/named.zones";

# 每個 zone 的設定

/etc/named.zones 的內容:

zone "xxx.net" IN { type master; file "zones/db.xxx.net"; allow-update { none; };};

# zone 的 records ( NS, MX, A, CNAME ... )

/var/named/zones/db.xxx.net

 


被攻擊的 DNS 可能

 

  • Open DNS: is a DNS that will accept recursive queries from external locations.
  • Closed DNS: is a DNS that will accept recursive queries only from an identified (and hopefully trusted) set of clients.
  • DoS attacks: by sending random domain queries
  • DoS amplification attacks: by sending domain specific queries the bad guys can cause your DNS to become part of (amplify the effect of) a wider DoS attack on a particular site.
  • Cache Poisoning: by sending specific queries the bad guys can dictate or control the traffic that leaves your site and thus attempt to spoof responses with nasty and pernicious stuff.

DoS amplification attacks

Feb  5 19:01:27 ns1 named[4819]: error (network unreachable)
 resolving 'ox.www.167uc.com/A/IN': 2400:cb00:2049:1::adf5:3b93#53
Feb  5 19:01:28 ns1 named[4819]: error (network unreachable)
 resolving 'wjilmp.www.167uc.com/A/IN': 2400:cb00:2049:1::adf5:3b93#53
Feb  5 19:01:28 ns1 named[4819]: error (network unreachable)
 resolving 'oncbofuxchwt.www.167uc.com/A/IN': 2400:cb00:2049:1::adf5:3b93#53
Feb  5 19:01:28 ns1 named[4819]: error (network unreachable)
 resolving 'chwxol.www.167uc.com/A/IN': 2400:cb00:2049:1::adf5:3b93#53
Feb  5 19:01:28 ns1 named[4819]: error (network unreachable)
 resolving 'ybytcngbenqt.www.167uc.com/A/IN': 2400:cb00:2049:1::adf5:3b93#53
Feb  5 19:01:28 ns1 named[4819]: error (network unreachable)
 resolving 'wz.www.167uc.com/A/IN': 2400:cb00:2049:1::adf5:3b93#53

解決:

解方法一共有兩個

1. 用 iptable 去限制 responses

2. 用 "credit" or "token bucket" 去限制 UDP responses (TCP 可以照用)
    (Short truncated (TC=1) responses can be sent to provide rate-limited responses to legitimate clients within a range of forged)
    (Legitimate clients react to dropped or truncated response by retrying with UDP or with TCP respectively.)

<1:>

iptables -A INPUT -p udp -m udp --dport 53 -m recent --set --name dnslimit --rsource
iptables -A INPUT -p udp -m udp --dport 53 -m recent --name dnslimit --update --seconds 60 --hitcount 11 -j DROP

<2:>

options {
    ......
    rate-limit {
        responses-per-second 5;                  # 0: no limits
        # nodata-per-second N;
        # nxdomain-per-second N;
        # all-per-second N;                      # simply counts all the responses sent to a particular client IP
        window 5;                                # Defaykt: 15s
        ipv4-prefix-length 24;                   # Default is 24
        log-only no;                             # yes: For testing; Default is no
        exempt-clients {address_match_list} ;
    };
}

Over 了 limit 會有如下的 log

Server log:

limit responses to x.x.x.0/24 for hk.yahoo.com IN A  (001208c4)

Client dig:

;; connection timed out; no servers could be reached

window

The window adds a longer-term dimension to rate limiting.

 * Responses are tracked within a rolling window of time which defaults to 15 seconds

    responses-per-second=5 AND window=5

    => no more that 25 ( 5 x 5 ) responses within any 5 second window period AND responses/second

 * Rate limiting of individual requests is logged in the query-errors category.

 * All responses to an address block are counted as if to a single client. (Default 24)

 * max-table-size: The maximum size of the table used to track requests and rate limit responses
                               (Each entry in the table is between 40 and 80 bytes), The default is 20,000

 * Use log-only yes to test rate limiting parameters without actually dropping any requests.

 


Record Format

 

內容

  • NS, TXT, MX, A, CNAME
  • SOA
  • Subdomain Settings
  • CNAME

e.g.

# NS, TXT, MX, A, CNAME

@               IN NS           Domain.
@               IN TXT          "testing"
@               IN MX 10        mail
@               IN A            IP
mail            IN A            IP
mail        300 IN A            IP2
ftp             IN CNAME        another.domain.

 

SOA(Start Of Authority)

作用: 給 Slave Server 在做備份這個 zone 時用到的一些參數

e.g.

$TTL 3600;                           ; SOA record 的 TTL
@    IN      SOA     ns0.datahunter.org.  root.datahunter.org.  (
                     2024070200      ; Serial
                     600             ; Refresh
                     300             ; Retry        
                     604800          ; Expire
                     300 )           ; NX

ns0.datahunter.org         <- primary name server

respond authoritatively for the domain

[email protected]      <- admin e-mail. 第一個 "." 代替 "@"

2024070200                  <- 同步時使用到的 Serial, Format 多數是日期來.

600                              <- Slave 每隔幾耐 check 一次 master 的 Serial 有沒有更新.

300                              <- 當 refresh 時 contact 唔到 master 時, 隔多少秒再試.

604800                         <- zone is considered no longer authoritative: 7 天
                                        slaves stop responding to queries for the zone

300                              <- NX(negative caching time)
                                        The time a NAME ERROR (NXDOMAIN) result may be cached by any resolver.

Remark:

  • Only one SOA record allowed in a zone file

Subdomain Settings

用了 $ORIGIN 後, 下文的 "@" 及相對的 domain 將會是 sub-domain

; sub-domain definitions
$ORIGIN  sub.your.domain
@               IN A            ?.?.?.?
@               IN MX 10        domain.

CNAME (Canonical name)  <-- nickname

  • CNAME RRs cannot have any other RRs with the same name,
    for example, a TXT !!
    [theoretically not permitted (RFC 1034 section 3.6.2)]
  • CNAME 不能在 root domain
    [theoretically]

 


Record TTL

 

domain.             3600    IN      TXT     "string"

 


ACL

acl "trusted" {
        127.0.0.1;
};

 


Blackhole

blackhole defines a address_match_list of hosts that the server will NOT respond to, or answer queries for.

blackhole { address_match_list };

 


Query

 

allow-query

allow-query      { localhost; };  // defaults to allow-query {any;};
                                  // i.e. allow-query {10.0/16;};
recursion no;

If recursion no; present, defaults to allow-query-cache {none;};

If recursion yes; (default) then, if allow-recursion is NOT present,

 => defaults to allow-query-cache {localnets; localhost;};

options {
    allow-recursion { trusted; };
};

acl "trusted" {
        127.0.0.1;
};

recursive-clients 25;

Defines the number of simultaneous recursive lookups the server will perform on behalf of its clients.

allow-query-on

// defines the server interface(s) from which queries are accepted

Defaults: allow-query-on {any;};

allow-query-cache

* BIND 9.4 後才有的功能

This was done to limit the number of, possibly inadvertant, OPEN DNS resolvers.

設定:

allow-query-cache { address_match_list };
allow-query-cache { 10/8; };

 


Returned order

 

Defines that all equal records for all domains will be returned in random order.

rrset-order {order random;};
  • fixed - records are returned in the order they are defined in the zone file
  • random - records are returned in a random order
  • cyclic - records are returned in a round-robin fashion

 


Performance

 

minimal-responses yes ;      <--- BIND default is no

(server will only add records to the authority and additional data sections when they are required)

 


Forwarder

 

forward ( only | first );     <--  "first"(default)  if forwarders not answered will attempt to answer the query.
forwarders { 10.2.3.4; 192.168.2.5; };

 

 


allow-update - update by key

# DDNS

allow-update { address_match_list };

* hosts that are allowed to submit dynamic updates for master zones
* The default in BIND 9 is to disallow updates from all hosts

# 設定一條 update key
key "YOUR_KEYNAME" {
   algorithm HMAC-MD5;
   secret "YOUR_BASE64_KEY";
};

# disables DDNS explicitly
zone "YOUR_DOMAIN" in{
    type master;
    file "data/YOUR_DOMAIN";
    allow-update {none;}; // no DDNS by default
    ....
};

// DDNS by key
zone "YOUR_DOMAIN" IN {
    type master;
    file "data/YOUR_DOMAIN";
    allow-update {
        key "YOUR_KEYNAME";
    };
};

// DDNS this host only
zone "example.com" in{
....type master;
    allow-update {10.0.1.2;}; 
    ....
};

key setting:

    update-policy {
        grant "USER-KEY" subdomain DOMAIN   A;
        // grant [key_name] <name> [hostname]
    };

 


notify (DNS BIND Zone Transfers and Updates)

 

notify

# Applicable to both master zones (with 'type master;') and slave zones ('type slave;')(亦可以設定在 global 的 // all zones)
# "NOTIFY" messages are sent to the name servers defined in the NS records for the zone

# 'no': NOTIFY messages are not sent.

# 'yes'(default): when a zone is loaded or changed, NOTIFY messages are sent to the name servers defined in the NS records for the zone

# If set to 'explicit' NOTIFY is only sent to those IP(s) listed in an also-notify statement.

# The receiver of the NOTIFY message should query the zone SOA directly from the IP(s) defined in the zone's masters statement.

notify yes(default) | no | explicit;

options {
....
    also-notify {10.1.0.15; 172.28.32.7;}; // for all zones
....
};
....
zone "example.com in{
....
    // NS RRs and global also-notify
    notify yes;
....
};

!!! By default, after a slave has transferred a zone it will also send out NOTIFY messages to all the zone's NS RRs (except itself obviously).

    This behavior can be inhibited by using a 'notify no;' statement in the slave's zone clause.

Dec  5 21:07:07 localhost named[1833]: zone x.x.x.x/IN: sending notifies (serial 117)

!!! NOTIFY does not indicate that the zone data has changed, but rather that the zone data may have changed.

    The receiver of the NOTIFY message should query the zone SOA directly from the IP(s) defined in the zone's masters statement.

 

allow-notify

# Applies to slave zones only

# IP address(es) that are allowed to NOTIFY this server

# The default behaviour is to allow zone updates only from the masters IP(s).

allow-notify { address_match_list };

# allows notify from the defined IPs

allow-notify {192.168.0.15; 192.168.0.16; 10.0.0.1;};

# allows no notifies

allow-notify {none;};

 

also-notify

# 在 master server 設定的

# sent a NOTIFY when the master zone file is reloaded

# servers that will be sent a NOTIFY when the master zone file is reloaded.

# By default BIND9 will send NOTIFY messages to all the target names (right-hand names) that appear in NS RRs for the zone

also-notify { ip_addr [port ip_port] ; [... ;  ] };

總結

master: also-notify   ->> slave: allow-notify

 

在收到 notity 時

Dec  5 21:22:51 localhost named[2586]: client 192.168.3.99#59915: received notify for zone 'mplogistics.com'
Dec  5 21:22:51 localhost named[2586]: zone your.domain/IN: Transfer started.
Dec  5 21:22:51 localhost named[2586]: transfer of 'your.domain/IN' from 192.168.3.99#53:
                                       connected using 192.168.3.111#59563
Dec  5 21:22:51 localhost named[2586]: zone your.domain/IN: transferred serial 191
Dec  5 21:22:51 localhost named[2586]: transfer of 'your.domain/IN' from 192.168.3.99#53: 
 Transfer completed: 1 messages, 5 records, 225 bytes, 0.198 secs (1136 bytes/sec)
Dec  5 21:22:51 localhost named[2586]: zone your.domain/IN: sending notifies (serial 191)

 


slave zone

 

/etc/named.conf

...
# Slave Zones 的設定放在另外一個設定檔
include "/etc/named/slavezones.conf";

/etc/named/slavezones.conf

zone "datahunter.org" IN {
    type slave;
    allow-transfer { none; };
    allow-query { any; };
    notify no;
    masters { ip.address.of.master; };
    file "slaves/datahunter.org.zone";
};

* data folder = /var/named/data

* master => only with slave zones  | defines one or more IP addresses | optional port

masters port 1127 {192.168.2.7; 10.2.3.15 key zt-key;};

key-name field defines the key to be used to authenticate the zone transfers when using TSIG and references the name of a key clause;

a corresponding key clause with the same key-name must be present in the master server(s)

zone transfer log ( /var/log/messages )

# master: x.x.x.x
# slave: y.y.y.y (local ip)

Sep  5 16:51:27 ns2 named[11420]: zone datahunter.org/IN: Transfer started.
Sep  5 16:51:27 ns2 named[11420]: transfer of 'datahunter.org/IN' from x.x.x.x#53: connected using y.y.y.y#52562
Sep  5 16:51:27 ns2 named[11420]: zone datahunter.org/IN: transferred serial 2
Sep  5 16:51:27 ns2 named[11420]: transfer of 'datahunter.org/IN' from x.x.x.x#53: Transfer completed: 1 messages,
                13 records, 332 bytes, 0.049 secs (6775 bytes/sec)

 


Compile bind9

 

Download:

[1] 到 http://www.isc.org/downloads/bind/ 找最新的下載檔

wget http://www.isc.org/downloads/file/bind-9-10-0b1-2/?version=tar.gz -O bind-9-10-0b1-2.tar.gz

[2] Install Tools

yum groupinstall "Development tools"

yum install GeoIP GeoIP-devel <-- epel

GeoIP header

GeoIP Package
    /etc/GeoIP.conf
    /usr/bin/geoiplookup
    /usr/bin/geoipupdate
    /usr/share/GeoIP/GeoIP.dat
    /usr/share/GeoIP/..........

GeoIP-devel
    /usr/include/GeoIP.h
    /usr/include/GeoIPCity.h
    /usr/include/GeoIPUpdate.h
    /usr/lib/libGeoIP.so
    /usr/lib/libGeoIPUpdate.so
    /usr/lib/pkgconfig/geoip.pc

[3] Compile

tar -zxf bind-9-10-0b1-2.tar.gz

cd bind-9.10.0-P2/

--with-geoip

--enable-threads    # enable multithreading

./configure --enable-threads  --with-geoip

............................

Configuration summary:
------------------------------------------------------------------------
Optional features enabled:
    Multiprocessing support (--enable-threads)
    GeoIP access control (--with-geoip)
    GSS-API (--with-gssapi)
    ECDSA algorithm support (--with-ecdsa)
    Print backtrace on crash (--enable-backtrace)
    Use symbol table for backtrace, named only (--enable-symtable)
    Dynamically loadable zone (DLZ) drivers:
        None

設定

/etc/resolv.conf

nameserver 127.0.0.1

groupadd -g 20 named

useradd -u 20 -g named -s /bin/false named

 


geoip

 

# BIND 9.10 built-in

# load geoip

options {
    # "geoip-directory" option
    geoip-directory "/path/to/geoip/database";
};

# geoip ACLs

acl "example" {
  geoip country US;
  geoip region CA;
  geoip city "Redwood City";
};

match-clients

# Any IP which matches will use the defined view clause
# for the source IP address, default to any
# match-clients { address_match_element; ... };
# match-clients { 10.2.3.0/8;172.16.30.0/16;!192.168.0.0/16; };

view "example" {
  match-clients { example; };
  zone "xxx.xxx" {
    type master;
    file "locals/xxx.xxx.zone";
  };
};
view "default" {
  zone "xxx.xxx" {
    type master;
    file "nonlocals/xxx.xxx.zone";
  };
};

file 與 type

  • file                         # Defines the file used by the zone in quoted string format
  • type zone_type

zone_type:

  • master
  • slave
  • in-view
  • hint:              # The initial set of root-servers
                         # When the server starts up it uses the hints zone file to find a root name server and
                         # get the most recent list of root name servers.
  • redirect
  • delegation-only
  • forward          # forwarding on a per-domain or per zone basis.
  • stub:             # similar to a slave zone except that it replicates only the NS records
  • static-stub:

View 'split' DNS using views (internal | external)

view "internal-view" {
  match-clients { internal; };
  zone "." IN {
    type hint;
    file "db.cache";
  };
  zone "internal.nixcraft.com " IN {
    type master;
    file "zones/lan.master.nixcraft.com";
    allow-transfer { key TRANSFER; };
  };
};

view "external-view" {
  match-clients { any; };
  recursion no;
  zone "nixcraft.com " IN {
    type master;
    file "zones/internet.master.nixcraft.com";
    allow-transfer { key TRANSFER; };
  };
};

 


dnssec

 

dnssec-enable

indicates that a secure DNS service is being used which may be one, or more, of TSIG (for securing zone transfers or DDNS updates), SIG(0) (for securing DDNS updates) or DNSSEC. Since BIND9.5 the default value is dnssec-enable yes;. This statement may be used in a view or global options clause.

dnssec-validation

indicates that a resolver (a caching or caching-only name server) will attempt to validate replies from DNSSEC enabled (signed) zones. To perform this task the server also needs either a valid trusted-keys clause (containing one or more trusted-anchors or a managed-keys clause. Since 9.5 the default value is dnssec-validation yes;. This statement may be used in a view or global options clause.

 


rndc

 

rndc - name server control utility

          communicates with the name server over a TCP connection, sending commands authenticated with digital signatures

Port:

953/TCP

bind9 reload zone file:

rndc reload

Disable rndc

# These control channels are used by the rndc utility to send commands to and
# retrieve non-DNS results from a name server.

controls { };

CLI Usage

rndc <options> <command> <command-options>

options

    -s <server> — Specifies a server other than the default-server listed in /etc/rndc.conf.

/etc/rndc.conf

options {
    default-server  localhost;
    default-key     "<key-name>";
};

    -y <key-name> — Specifies a key other than the default-key option in the /etc/rndc.conf file.

    -p <port-number> — Specifies a port number to use for the rndc connection other than port 953, the default.

commands

    halt — Stops the named service immediately.

    stop — Stops the server gracefully

應用: update zone records without restart named

    reconfig  - will load any new zones that you've added (and remove any that you no longer have defined),
                    but it won't detect any changes that you've made to zones that are already loaded.

    reload - Reloads the zone files but keeps all other previously cached responses.
                If changes only affected a specific zone, reload only that specific zone.

i.e.

rndc reload your.domain

注意

... general: error: zone your.domain/IN: zone serial (2024020204) unchanged.
    zone may fail to transfer to slaves.

應用: Toggle query logging

# toggle query logging.

# querylog [ on | off ]

rndc querylog

應用: zone transfer immediately

refresh — Refreshes the nameserver's database (On slave)

You want a slave name server to initiate a zone transfer immediately.

It will cause a zone transfer if the master name server has an equal or higher serial number for the zone

rndc refresh your.domain

retransfer - Force zone update (On slave)

# Retransfer a single zone without checking the serial number

rndc retransfer your.domain

notify(On master)

Resend NOTIFY messages for the zone.

rndc notify your.domain

Get status

status - print status

stats - Dumps the current named statistics to the "/var/named/named.stats" file.

i.e.

rndc status

boot time: Mon, 19 Feb 2024 07:30:10 GMT
last configured: Mon, 19 Feb 2024 07:30:10 GMT
configuration file: /etc/named.conf
CPUs found: 2
CPUs found: 2
worker threads: 2
UDP listeners per interface: 1
number of zones: 113 (97 automatic)
debug level: 0
xfers running: 0
xfers deferred: 0
soa queries in progress: 0
query logging is OFF
recursive clients: 0/1900/2000
tcp clients: 2/150
TCP high-water: 2
server is up and running

/var/named/named.stats

+++ Statistics Dump +++ (1708328770)
++ Incoming Requests ++
                   7 QUERY
++ Incoming Queries ++
                   4 A
                   2 AAAA
                   1 ANY
++ Outgoing Rcodes ++
                   5 NOERROR
                   1 SERVFAIL
                   1 REFUSED
++ Outgoing Queries ++
[View: default]
                 137 A
                  32 NS
                 103 AAAA
                  26 DNSKEY
[View: _bind]
++ Name Server Statistics ++
                   7 IPv4 requests received

Debug with log

Enable Log

# To view what the server is doing live, if you have rndc configured run

# where x is the debugging level you want to view

rndc trace x

Disable log

# notrace = Sets the server's debugging level to 0

rndc notrace

Flush cache

# All entries

rndc flush

# All entries for microsoft.com (supported from bind 9.3)

rndc flushname microsoft.com

Centos 的 rndc 設定

rndc-confgen > /etc/rndc.key

chown root:named rndc.key

chmod 640 rndc.key

rndc.key format

key "<key-name>" {
  algorithm hmac-md5;
  secret "<key-value>";
};

預設 keyname 是 rndc-key

named.conf

 * 因為 /etc/named.conf 係 world-readable, 所以 key file 放在另一個 file

// rndc settings
include "/etc/rndc.key";

controls {
    # default TCP port 953 of the loopback address
    inet 127.0.0.1 port 953
    allow {127.0.0.1;} keys { <key-name>; };
};

 


Error

 

FORMERR

Dec  5 11:55:37 mail named[22289]: error (FORMERR) resolving 'ns-cmn1.qq.com/AAAA/IN': 183.61.47.15#53

When acting as a recursive resolver, BIND 9 follows the chain of
delegation from the root, contacting name servers identified for each
domain on the way.

In this case, one of those name servers returned a packet that BIND 9
did not like for some reason - a FORMat ERRor. The offending server is
marked as "lame" since it cannot answer queries for the domain in
question.

 


block-dns-ddos script

 

log

logging {
    channel security_file {
        file "data/security.log" versions 3 size 30m;
    };
    category queries {
        security_file;
    };
};

iptables

-N Block53
-A INPUT -p udp --dport 53 -m state --state NEW -j Block53
-A INPUT -p tcp --dport 53 -m state --state NEW -j Block53
-A Block53 -j ACCEPT

lookup-domain.sh

#!/bin/bash

grep $1 /var/named/data/security.log | cut -d' ' -f 2 | cut -d'#' -f 1 | sort | uniq >> /tmp/ip.tmp

sort -u /tmp/ip.tmp > /tmp/ip.txt

wc -l /tmp/ip.txt

block-dns-ddos.sh

#!/bin/bash

iptables -F Block53

while read ip
do
        echo $ip
        iptables -I Block53 -s $ip -j DROP
done < "/tmp/ip.txt"

echo "Done"

 


multiple ptr records same ip

 

It all comes down to unpredictable behavior since the RFC does not impose a limit or a way to handle these PTR records.

Most implementations will choose round-robin and you will not achieve your desired result

(perfect matching between many names to a single IP).

 


 

Creative Commons license icon Creative Commons license icon