DHCP

Обновлено 10 августа 2020

DHCP

DHCP - сетевой протокол, позволяющий компьютерам автоматически получать IP-адрес и другие параметры, необходимые для работы в сети TCP/IP.

Настройка DHCP

Выполните настройку сети:

cl-setup-network --iface eth0:192.168.50.3:24 --route default:192.168.50.1 --dns 8.8.8.8

/etc/conf.d/net

config_eth0="192.168.50.3/24"
routes_eth0="default via 192.168.50.1/24"
dns_servers="8.8.8.8"

Установите пакеты DHCP и DNS:

emerge dhcp bind

Настройте DHCP-сервер:

  • используемая сеть 192.168.50.0/24, маска 255.255.255.0
  • выдаваемые адреса в диапазоне 192.168.50.100-192.168.50.200
  • передаваемый адрес DNS сервера 192.168.50.3
  • передаваемый адрес шлюза по умолчанию 192.168.50.1
  • широковещательный адрес 192.168.50.255
  • домен example.org
  • время аренды адреса - неделя

/etc/dhcp/dhcpd.conf

shared-network mylan {
    subnet 192.168.50.0 netmask 255.255.255.0 {
        range 192.168.50.100 192.168.50.200;
        option domain-name-servers 192.168.50.3;
        option domain-name "example.org";
        option routers 192.168.50.1;
        option broadcast-address 192.168.50.255;
        default-lease-time 604800;
        max-lease-time 604800;
    }
}

Добавьте DHCP в автозагрузку и запустите его:

rc-update add dhcpd

rc-service dhcpd start

Настройка DNS

Пересоздайте ключ для обновления записей DNS:

tsig-keygen rndc-key >/etc/bind/rndc.key

Настройте права доступа к ключу:

chmod 640 /etc/bind/rndc.key

chown root:named /etc/bind/rndc.key

Создайте из примера настроек конфигурационный файл:

cp -a /etc/bind/named.conf.origin /etc/bind/named.conf

Выполните настройки DNS:

/etc/bind/named.conf
/*
 * Refer to the named.conf(5) and named(8) man pages, and the documentation
 * in /usr/share/doc/bind-* for more details.
 * Online versions of the documentation can be found here:
 * https://kb.isc.org/article/AA-01031
 *
 * If you are going to set up an authoritative server, make sure you
 * understand the hairy details of how DNS works. Even with simple mistakes,
 * you can break connectivity for affected parties, or cause huge amounts of
 * useless Internet traffic.
 */

acl "xfer" {
    /* Deny transfers by default except for the listed hosts.
     * If we have other name servers, place them here.
     */
    127.0.0.1;
};

/*
 * You might put in here some ips which are allowed to use the cache or
 * recursive queries
 */
acl "trusted" {
    127.0.0.0/8;
    192.168.50.0/24;
    ::1/128;
};

options {
    directory "/var/bind";
    pid-file "/run/named/named.pid";

    /* https://www.isc.org/solutions/dlv >=bind-9.7.x only */
    //bindkeys-file "/etc/bind/bind.keys";

    listen-on-v6 { ::1; };
    listen-on {
        127.0.0.1;
        192.168.50.0/24;
    };

    allow-query {
        /*
         * Accept queries from our "trusted" ACL.  We will
         * allow anyone to query our master zones below.
         * This prevents us from becoming a free DNS server
         * to the masses.
         */
        trusted;
    };

    allow-query-cache {
        /* Use the cache for the "trusted" ACL. */
        trusted;
    };

    allow-recursion {
        /* Only trusted addresses are allowed to use recursion. */
        trusted;
    };

    allow-transfer {
        /* Zone tranfers are denied by default. */
        xfer;
    };

    allow-update {
        /* Don't allow updates, e.g. via nsupdate. */
        none;
    };

    /*
    * If you've got a DNS server around at your upstream provider, enter its
    * IP address here, and enable the line below. This will make you benefit
    * from its cache, thus reduce overall DNS traffic in the Internet.
    *
    * Uncomment the following lines to turn on DNS forwarding, and change
    *  and/or update the forwarding ip address(es):
    */
    forward first;
    forwarders {
    //  123.123.123.123;    // Your ISP NS
    //  124.124.124.124;    // Your ISP NS
    //  4.2.2.1;        // Level3 Public DNS
    //  4.2.2.2;        // Level3 Public DNS
        8.8.8.8;        // Google Open DNS
        8.8.4.4;        // Google Open DNS
    };

    dnssec-enable yes;
    //dnssec-validation yes;

    /*
     * As of bind 9.8.0:
     * "If the root key provided has expired,
     * named will log the expiration and validation will not work."
     */
    dnssec-validation auto;

    /* if you have problems and are behind a firewall: */
    //query-source address * port 53;
};

/*
logging {
    channel default_log {
        file "/var/log/named/named.log" versions 5 size 50M;
        print-time yes;
        print-severity yes;
        print-category yes;
    };

    category default { default_log; };
    category general { default_log; };
};
*/

include "/etc/bind/rndc.key";
controls {
    inet 127.0.0.1 port 953 allow { 127.0.0.1/32; ::1/128; } keys { "rndc-key"; };
};

zone "." in {
    type hint;
    file "/var/bind/named.cache";
};

zone "localhost" IN {
    type master;
    file "pri/localhost.zone";
    notify no;
};

/*
 * Briefly, a zone which has been declared delegation-only will be effectively
 * limited to containing NS RRs for subdomains, but no actual data beyond its
 * own apex (for example, its SOA RR and apex NS RRset). This can be used to
 * filter out "wildcard" or "synthesized" data from NAT boxes or from
 * authoritative name servers whose undelegated (in-zone) data is of no
 * interest.
 * See http://www.isc.org/software/bind/delegation-only for more info
 */

//zone "COM" { type delegation-only; };
//zone "NET" { type delegation-only; };

//zone "YOUR-DOMAIN.TLD" {
//  type master;
//  file "/var/bind/pri/YOUR-DOMAIN.TLD.zone";
//  allow-query { any; };
//  allow-transfer { xfer; };
//};

//zone "YOUR-SLAVE.TLD" {
//  type slave;
//  file "/var/bind/sec/YOUR-SLAVE.TLD.zone";
//  masters { <MASTER>; };

    /* Anybody is allowed to query but transfer should be controlled by the master. */
//  allow-query { any; };
//  allow-transfer { none; };

    /* The master should be the only one who notifies the slaves, shouldn't it? */
//  allow-notify { <MASTER>; };
//  notify no;
//};

zone "example.org" {
        type master;
        file "/var/bind/dyn/example.org.zone";
        allow-update { key rndc-key; };
};

zone "50.168.192.in-addr.arpa" {
        type master;
        file "/var/bind/dyn/example.org.rev.zone";
        allow-update { key rndc-key; };
};
  • добавьте сеть 192.168.50.0/24 в доверенные зоны (trusted)
  • укажите, на какие DNS сервера обращаться (8.8.8.8), если текущий не сможет определить имя или IP-адрес запроса
  • добавьте прямую зону example.org и обратную 50.168.192.in-addr.arpa
  • укажите адреса обслуживания 192.168.50.0/24 (listen-on)
  • добавьте возможность получать содержимое зоны (transfer) на текущей машине

Создайте файлы для объявленной прямой и обратной зоны:

/var/bind/dyn/example.org.zone

$ORIGIN example.org.
$TTL 86400   ; 1 day
@ IN SOA ns1.example.org. root.example.org. (
    2018031401 ; Serial
    10800      ; Refresh (3 hours)
    3600       ; Retry (1 hour)
    604800     ; Expire (1 week)
    86400      ; Minimum (1 day)
)

               IN      NS  ns1.example.org.
@              IN      A   192.168.50.3
ns1            IN      A   192.168.50.3
gw             IN      A   192.168.50.1
localhost      IN      A   127.0.0.1
dns            IN      A   192.168.50.3

/var/bind/dyn/example.org.rev.zone

$ORIGIN 50.168.192.in-addr.arpa.
$TTL 86400   ; 1 day
@ IN SOA ns1.example.org. root.example.org. (
    2018031401 ; Serial
    10800      ; Refresh (3 hours)
    3600       ; Retry (1 hour)
    604800     ; Expire (1 week)
    86400      ; Minimum (1 day)
)

           IN      NS  ns1.example.org.
1          IN      PTR  gw.example.org.
3          IN      PTR  ns1.example.org.

Настройте права доступа к данным зонам:

chgrp -R named /var/bind/dyn

chmod 660 /var/bind/dyn/*

chmod 770 /var/bind/dyn

Добавьте в DHCP настройки для обновления записей при выдаче IP перед описанием сети:

/etc/dhcp/dhcpd.conf

ddns-update-style interim;
# обновлять статические ip, прописанные в dhcp
update-static-leases on;

# использовать ключ из bind
include "/etc/bind/rndc.key";

zone example.org. {
    primary 127.0.0.1;
    key rndc-key;
}

zone 50.168.192.in-addr.arpa. {
    primary 127.0.0.1;
    key rndc-key;
}

Добавьте DNS в автозагрузку, запустите его и перезапустите DHCP:

rc-update named dhcpd

rc-service named start

rc-service dhcpd restart

Теперь при выдаче IP-адреса машине будет добавлена соответствующая запись в файлы описания зон (/var/bind/example.org.zone и /var/bind/example.org.rev.zone).

Обзор

rndc sync

cat /var/bind/dyn/example.org.zone

$ORIGIN .
$TTL 86400  ; 1 day
example.org     IN SOA  ns1.example.org. root.example.org. (
                2018031406 ; serial
                10800      ; refresh (3 hours)
                3600       ; retry (1 hour)
                604800     ; expire (1 week)
                86400      ; minimum (1 day)
                )
            NS  ns1.example.org.
$ORIGIN example.org.
$TTL 3600   ; 1 hour
client          A   192.168.50.101
            TXT "317e714be5304884a0829b791e1d79b481"
$TTL 86400  ; 1 day
dns         A   192.168.50.3
gw          A   192.168.50.1
localhost       A   127.0.0.1
ns1         A   192.168.50.3
$ORIGIN .

cat /var/bind/dyn/example.org.rev.zone

$TTL 86400  ; 1 day
50.168.192.in-addr.arpa IN SOA  ns1.example.org. root.example.org. (
                2018031402 ; serial
                10800      ; refresh (3 hours)
                3600       ; retry (1 hour)
                604800     ; expire (1 week)
                86400      ; minimum (1 day)
                )
            NS  ns1.example.org.
$ORIGIN 50.168.192.in-addr.arpa.
1           PTR gw.example.org.
$TTL 3600   ; 1 hour
100         PTR client.example.org.
$TTL 86400  ; 1 day
3           PTR ns1.example.org.

Модификация записей зоны

Зоны, которые обновляются динамически, можно модифицировать как при помощи специальных утилит, так и редактированием файлов, находящихся в /var/bind.

Обновление динамических зон при помощи nsupdate

Утилита nsupdate входит в пакет net-dns/bind-tools. Также в этом же пакете присутствует утилита dig, позволяющая получить выгрузку определённой зоны.

Установите пакет, выполнив:

emerge bind-tools

Чтобы получить содержимое зоны example.org, выполните:

dig -t axfr example.org.
; <<>> DiG 9.11.2-P1 <<>> -t axfr example.org.
;; global options: +cmd
example.org.        86400   IN  SOA ns1.example.org. root.example.org. 2018031402 10800 3600 604800 86400
example.org.        86400   IN  NS  ns1.example.org.
client.example.org. 3600    IN  A   192.168.50.100
client.example.org. 3600    IN  TXT "3173d9bec89af77517b8cff6e3c19edb9f"
dns.example.org.    86400   IN  A   192.168.50.3
gw.example.org.     86400   IN  A   192.168.50.1
localhost.example.org.  86400   IN  A   127.0.0.1
ns1.example.org.    86400   IN  A   192.168.50.3
example.org.        86400   IN  SOA ns1.example.org. root.example.org. 2018031402 10800 3600 604800 86400
;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Чт мар 15 15:12:23 MSK 2018
;; XFR size: 9 records (messages 1, bytes 314)

Для получения содержимого обратной зоны выполните:

dig -t axfr 50.168.192.in-addr.arpa
; <<>> DiG 9.11.2-P1 <<>> -t axfr 50.168.192.in-addr.arpa
;; global options: +cmd
50.168.192.in-addr.arpa. 86400  IN  SOA ns1.example.org. root.example.org. 2018031402 10800 3600 604800 86400
50.168.192.in-addr.arpa. 86400  IN  NS  ns1.example.org.
1.50.168.192.in-addr.arpa. 86400 IN PTR gw.example.org.
100.50.168.192.in-addr.arpa. 3600 IN    PTR client.example.org.
3.50.168.192.in-addr.arpa. 86400 IN PTR ns1.example.org.
50.168.192.in-addr.arpa. 86400  IN  SOA ns1.example.org. root.example.org. 2018031402 10800 3600 604800 86400
;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Чт мар 15 15:12:04 MSK 2018
;; XFR size: 6 records (messages 1, bytes 246)

Так как обновление зон настроено по ключу /etc/bind/rndc.key, то его необходимо указать утилите:

nsupdate -k /etc/bind/rndc.key

Выполнение команды запустит консоль для взаимодействия с DNS. Для получения полного перечня команд воспользуйтесь командой help, для выхода - quit.

Для удаления записи client.example.org из зоны используйте следующую команду

nsupdate -k /etc/bind/rndc.key

del client.example.org
send
quit

Для добавления записи client.example.org в зону example.org используйте следующую команду:

nsupdate -k /etc/bind/rndc.key

nxdomain client.example.org
add client.example.org 3600 A 192.168.1.100
send
quit

Команда nxdomain служит для проверки отсутствия записи client.example.org в DNS. Команда add добавляет A-запись client.example.org соответствующую 192.168.1.100 с TTL 1 час (3600).

Вместо А-записи (соответствие доменного имени IP адресу) можно использовать CNAME для назначения псевдонима для зоны. Добавьте CNAME запись comp1.example.org на client.example.org:

nsupdate -k /etc/bind/rndc.key

nxdomain comp1.example.org
add comp1.example.org 3600 CNAME client.example.org
send
quit

Для удаления записи 192.168.50.100 из обратной зоны используйте следующую команду:

nsupdate -k /etc/bind/rndc.key

del 100.50.168.192.in-addr.arpa. 
send
quit

Для добавление обратной записи 192.168.50.100 на client.example.org в обратную зону используйте следующую команду:

nsupdate -k /etc/bind/rndc.key

nxdomain 100.50.168.192.in-addr.arpa 
add 100.50.168.192.in-addr.arpa. 3600 PTR client.example.org.
send
quit

Редактирование файлов, описывающих зоны

При редактировании файлов зон вручную необходимо сначала приостановить возможность динамического изменения и только после этого редактировать. После изменения файлов необходимо восстановить динамические изменения:

rndc sync

rndc freeze example.org

/var/bind/dyn/example.org.zone

rndc reload example.org

rndc thaw example.org

Где:

  • rndc sync - перенесёт временные изменения из журнала в файл описания зоны;
  • rndc freeze - приостановит динамическое изменение;
  • rndc reload - перечитает содержимое из файла описания;
  • rndc thaw - восстановит возможность динамического изменения.

При каждом редактировании зоны необходимо увеличивать серийный номер.

Пример
$ORIGIN .
$TTL 86400  ; 1 day
example.org     IN SOA  ns1.example.org. root.example.org. (
                2018031406 ; serial
                10800      ; refresh (3 hours)
                3600       ; retry (1 hour)
                604800     ; expire (1 week)
                86400      ; minimum (1 day)
                )
            NS  ns1.example.org.
$ORIGIN example.org.
$TTL 3600   ; 1 hour
client          A   192.168.50.101
            TXT "317e714be5304884a0829b791e1d79b481"
$TTL 86400  ; 1 day
dns         A   192.168.50.3
gw          A   192.168.50.1
localhost       A   127.0.0.1
ns1         A   192.168.50.3

Обновление MAC-адреса для хоста

DNS-запись не будет обновляться, если в зону уже добавлен узел с таким же именем хоста, но другим MAC-адресом. Такое может произойти, если на компьютере поменяли сетевую карту. В системном журнале это можно определить по характерным записям:

/var/log/message

Mar 14 17:17:22 dns named[2760]: client @0x7fd25c042070 127.0.0.1#21937/key rndc-key: updating zone 'example.org/IN': update unsuccessful: client.example.org: 'name not in use' prerequisite not satisfied (YXDOMAIN)
Mar 14 17:17:22 dns named[2760]: client @0x7fd25c0389f0 127.0.0.1#21937/key rndc-key: updating zone 'example.org/IN': update unsuccessful: client.example.org/TXT: 'RRset exists (value dependent)' prerequisite not satisfied (NXRRSET)
Mar 14 17:17:22 dns dhcpd[2629]: Forward map from client.example.org to 192.168.50.101 FAILED: Has an address record but no DHCID, not mine.

Для того, чтобы данная запись продолжила обновлялась с нового MAC-адреса, необходимо вручную удалить существующую запись из зоны любым из описанных выше способом.