DHCP
Обновлено 21 сентября 2021
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:
/* * 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 add named
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 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 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-адреса, необходимо вручную удалить существующую запись из зоны любым из описанных выше способом.