🖧 Как настроить базовый DHCP-сервер

Установка сервера DHCP на Linux

by itisgood

Настроим базовый DHCP-сервер с помощью DHCP-сервера Internet Software Consortium.

Обновим индекс пакетов.

$ apt update

Обновление пакетов.

$ apt upgrade

📦 Команды Apt Update и Upgrade – в чем разница? – IT is good

Убедитесь, что сервер будет использовать статический IP.

$ cat /etc/dhcpcd.conf
[...]

interface eth0
static ip_address=172.16.151.254/21
static routers=172.16.144.1
static domain_name_servers=1.1.1.1

[...]

Для применения изменений перезапустите службу DHCP-клиента.

$ sudo systemctl restart dhcpcd.service

Определите имя хоста и обновите статическую таблицу поиска.

$ sudo hostnamectl set-hostname --static scylla.octocat.cloud
$ echo "172.16.151.254 scylla scylla.octocat.cloud" | tee -a /etc/hosts

Проверка IP-адреса.

$ ip -br a   
lo               UNKNOWN        127.0.0.1/8 
eth0             UP             172.16.151.254/21

Установим firewalld

$ sudo apt install firewalld

Проверим начальные настройки для public зоны.

$ sudo firewall-cmd --list-all --zone public
public
  target: default
  icmp-block-inversion: no
  interfaces: 
  sources: 
  services: dhcpv6-client ssh
  ports: 
  protocols: 
  forward: no
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules:

Добавьте интерфейс ethernet в зону public.

$ sudo firewall-cmd --add-interface eth0 --zone public

Удалим службу DHCP-клиента и откройте порт сервера.

$ sudo firewall-cmd --remove-service=dhcpv6-client --zone public
success
$ sudo firewall-cmd --add-service dhcp --zone public
success

Проверим

$ sudo firewall-cmd --list-all --zone public
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources: 
  services: dhcp ssh
  ports: 
  protocols: 
  forward: no
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules:

Убедитесь, что изменения носят постоянный характер.

$ sudo firewall-cmd --runtime-to-permanent
success

Получим сведения о пакете DHCP-сервера ISC.

$ apt info isc-dhcp-server
Package: isc-dhcp-server
Version: 4.4.1-2.3
Priority: optional
Section: net
Source: isc-dhcp
Maintainer: Debian ISC DHCP Maintainers <isc-dhcp@packages.debian.org>
Installed-Size: 1482 kB
Depends: debconf (>= 0.5) | debconf-2.0, libc6 (>= 2.17), libdns-export1110, libirs-export161, libisc-export1105, debianutils (>= 2.8.2), lsb-base
Recommends: isc-dhcp-common, policycoreutils
Suggests: policykit-1, isc-dhcp-server-ldap
Breaks: isc-dhcp-common (<= 4.3.3-1), logcheck-database (<= 1.3.17~)
Replaces: isc-dhcp-common (<= 4.3.3-1)
Homepage: http://www.isc.org
Tag: interface::daemon, network::configuration, network::server,
 protocol::dhcp, protocol::ip, protocol::ipv6, role::program
Download-Size: 524 kB
APT-Sources: http://deb.debian.org/debian bullseye/main arm64 Packages
Description: ISC DHCP server for automatic IP address assignment
 This is the Internet Software Consortium's DHCP server.
 .
 Dynamic Host Configuration Protocol (DHCP) is a protocol like BOOTP
 (actually dhcpd includes much of the functionality of bootpd). It
 gives client machines "leases" for IP addresses and can
 automatically set their network configuration.
 .
 This server can handle multiple ethernet interfaces.

Установим пакет ISC DHCP-сервера.

$ sudo apt install isc-dhcp-server

Проверим настройки DHCP-сервера по умолчанию.

$ cat /etc/default/isc-dhcp-server 
# Defaults for isc-dhcp-server (sourced by /etc/init.d/isc-dhcp-server)

# Path to dhcpd's config file (default: /etc/dhcp/dhcpd.conf).
#DHCPDv4_CONF=/etc/dhcp/dhcpd.conf
#DHCPDv6_CONF=/etc/dhcp/dhcpd6.conf

# Path to dhcpd's PID file (default: /var/run/dhcpd.pid).
#DHCPDv4_PID=/var/run/dhcpd.pid
#DHCPDv6_PID=/var/run/dhcpd6.pid

# Additional options to start dhcpd with.
#	Don't use options -cf or -pf here; use DHCPD_CONF/ DHCPD_PID instead
#OPTIONS=""

# On what interfaces should the DHCP server (dhcpd) serve DHCP requests?
#	Separate multiple interfaces with spaces, e.g. "eth0 eth1".
INTERFACESv4=""
INTERFACESv6=""

Убедитесь, что интерфейс ethernet определен.

$ sudo tee /etc/default/isc-dhcp-server << EOF
# Defaults for isc-dhcp-server (sourced by /etc/init.d/isc-dhcp-server)

# Path to dhcpd's config file (default: /etc/dhcp/dhcpd.conf).
#DHCPDv4_CONF=/etc/dhcp/dhcpd.conf
#DHCPDv6_CONF=/etc/dhcp/dhcpd6.conf

# Path to dhcpd's PID file (default: /var/run/dhcpd.pid).
#DHCPDv4_PID=/var/run/dhcpd.pid
#DHCPDv6_PID=/var/run/dhcpd6.pid

# Additional options to start dhcpd with.
#	Don't use options -cf or -pf here; use DHCPD_CONF/ DHCPD_PID instead
#OPTIONS=""

# On what interfaces should the DHCP server (dhcpd) serve DHCP requests?
#	Separate multiple interfaces with spaces, e.g. "eth0 eth1".
INTERFACESv4="eth0"
INTERFACESv6=""
EOF
# Defaults for isc-dhcp-server (sourced by /etc/init.d/isc-dhcp-server)

# Path to dhcpd's config file (default: /etc/dhcp/dhcpd.conf).
#DHCPDv4_CONF=/etc/dhcp/dhcpd.conf
#DHCPDv6_CONF=/etc/dhcp/dhcpd6.conf

# Path to dhcpd's PID file (default: /var/run/dhcpd.pid).
#DHCPDv4_PID=/var/run/dhcpd.pid
#DHCPDv6_PID=/var/run/dhcpd6.pid

# Additional options to start dhcpd with.
#	Don't use options -cf or -pf here; use DHCPD_CONF/ DHCPD_PID instead
#OPTIONS=""

# On what interfaces should the DHCP server (dhcpd) serve DHCP requests?
#	Separate multiple interfaces with spaces, e.g. "eth0 eth1".
INTERFACESv4="eth0"
INTERFACESv6=""

Просмотрим файл конфигурации по умолчанию.

# dhcpd.conf
#
# Sample configuration file for ISC dhcpd
#

# option definitions common to all supported networks...
option domain-name "example.org";
option domain-name-servers ns1.example.org, ns2.example.org;

default-lease-time 600;
max-lease-time 7200;

# The ddns-updates-style parameter controls whether or not the server will
# attempt to do a DNS update when a lease is confirmed. We default to the
# behavior of the version 2 packages ('none', since DHCP v2 didn't
# have support for DDNS.)
ddns-update-style none;

# If this DHCP server is the official DHCP server for the local
# network, the authoritative directive should be uncommented.
#authoritative;

# Use this to send dhcp log messages to a different log file (you also
# have to hack syslog.conf to complete the redirection).
#log-facility local7;

# No service will be given on this subnet, but declaring it helps the 
# DHCP server to understand the network topology.

#subnet 10.152.187.0 netmask 255.255.255.0 {
#}

# This is a very basic subnet declaration.

#subnet 10.254.239.0 netmask 255.255.255.224 {
#  range 10.254.239.10 10.254.239.20;
#  option routers rtr-239-0-1.example.org, rtr-239-0-2.example.org;
#}

# This declaration allows BOOTP clients to get dynamic addresses,
# which we don't really recommend.

#subnet 10.254.239.32 netmask 255.255.255.224 {
#  range dynamic-bootp 10.254.239.40 10.254.239.60;
#  option broadcast-address 10.254.239.31;
#  option routers rtr-239-32-1.example.org;
#}

# A slightly different configuration for an internal subnet.
#subnet 10.5.5.0 netmask 255.255.255.224 {
#  range 10.5.5.26 10.5.5.30;
#  option domain-name-servers ns1.internal.example.org;
#  option domain-name "internal.example.org";
#  option routers 10.5.5.1;
#  option broadcast-address 10.5.5.31;
#  default-lease-time 600;
#  max-lease-time 7200;
#}

# Hosts which require special configuration options can be listed in
# host statements.   If no address is specified, the address will be
# allocated dynamically (if possible), but the host-specific information
# will still come from the host declaration.

#host passacaglia {
#  hardware ethernet 0:0:c0:5d:bd:95;
#  filename "vmunix.passacaglia";
#  server-name "toccata.example.com";
#}

# Fixed IP addresses can also be specified for hosts.   These addresses
# should not also be listed as being available for dynamic assignment.
# Hosts for which fixed IP addresses have been specified can boot using
# BOOTP or DHCP.   Hosts for which no fixed address is specified can only
# be booted with DHCP, unless there is an address range on the subnet
# to which a BOOTP client is connected which has the dynamic-bootp flag
# set.
#host fantasia {
#  hardware ethernet 08:00:07:26:c0:a5;
#  fixed-address fantasia.example.com;
#}

# You can declare a class of clients and then do address allocation
# based on that.   The example below shows a case where all clients
# in a certain class get addresses on the 10.17.224/24 subnet, and all
# other clients get addresses on the 10.0.29/24 subnet.

#class "foo" {
#  match if substring (option vendor-class-identifier, 0, 4) = "SUNW";
#}

#shared-network 224-29 {
#  subnet 10.17.224.0 netmask 255.255.255.0 {
#    option routers rtr-224.example.org;
#  }
#  subnet 10.0.29.0 netmask 255.255.255.0 {
#    option routers rtr-29.example.org;
#  }
#  pool {
#    allow members of "foo";
#    range 10.17.224.10 10.17.224.250;
#  }
#  pool {
#    deny members of "foo";
#    range 10.0.29.10 10.0.29.230;
#  }
#}

Создание базовой конфигурации DHCP-сервера.

$ sudo tee /etc/dhcp/dhcpd.conf << EOF
# dhcpd.conf
#
# Local network configuration file for ISC dhcpd
#

# This DHCP server is the official DHCP server for the local network
authoritative;

# Common network settings
option routers 172.16.144.1;
option domain-name-servers 1.1.1.1;
option domain-name "octocat.cloud";
default-lease-time 86400;
max-lease-time 604800;


# Configuration for an internal subnet
subnet 172.16.144.0 netmask 255.255.248.0 {
  range 172.16.151.110 172.16.151.120;
}

# Hosts configuration options
host desktop {
  hardware ethernet 1c:69:7a:b7:e5:2c;
  fixed-address 172.16.151.200;
}
EOF
$ sudo tee /etc/dhcp/dhcpd.conf << EOF
# dhcpd.conf
#
# Local network configuration file for ISC dhcpd
#

# This DHCP server is the official DHCP server for the local network
authoritative;

# Common network settings
option routers 172.16.144.1;
option domain-name-servers 1.1.1.1;
option domain-name "octocat.cloud";
default-lease-time 86400;
max-lease-time 604800;


# Configuration for an internal subnet
subnet 172.16.144.0 netmask 255.255.248.0 {
  range 172.16.151.110 172.16.151.120;
}

# Hosts configuration options
host desktop {
  hardware ethernet 1c:69:7a:b7:e5:2c;
  fixed-address 172.16.151.200;
}
EOF

Файл тестовой конфигурации.

$ dhcpd -t -4 -cf /etc/dhcp/dhcpd.conf 
Internet Systems Consortium DHCP Server 4.4.1
Copyright 2004-2018 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/
Config file: /etc/dhcp/dhcpd.conf
Database file: /var/lib/dhcp/dhcpd.leases
PID file: /var/run/dhcpd.pid

Перезапустим DHCP-сервер

$ sudo systemctl restart isc-dhcp-server.service

Проверим, включен ли сервис.

$ sudo systemctl is-enabled isc-dhcp-server.service 
isc-dhcp-server.service is not a native service, redirecting to systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install is-enabled isc-dhcp-server
enabled

Проверим статус сервиса

$ sudo systemctl status isc-dhcp-server.service 
* isc-dhcp-server.service - LSB: DHCP server
     Loaded: loaded (/etc/init.d/isc-dhcp-server; generated)
     Active: active (running) since Sun 2022-05-08 12:38:57 CEST; 46s ago
       Docs: man:systemd-sysv-generator(8)
    Process: 3424 ExecStart=/etc/init.d/isc-dhcp-server start (code=exited, status=0/SUCCESS)
      Tasks: 4 (limit: 780)
        CPU: 154ms
     CGroup: /system.slice/isc-dhcp-server.service
             `-3439 /usr/sbin/dhcpd -4 -q -cf /etc/dhcp/dhcpd.conf eth0

May 08 12:38:54 scylla.octocat.cloud systemd[1]: Starting LSB: DHCP server...
May 08 12:38:54 scylla.octocat.cloud isc-dhcp-server[3424]: Launching IPv4 server only.
May 08 12:38:55 scylla.octocat.cloud dhcpd[3439]: Wrote 0 deleted host decls to leases file.
May 08 12:38:55 scylla.octocat.cloud dhcpd[3439]: Wrote 0 new dynamic host decls to leases file.
May 08 12:38:55 scylla.octocat.cloud dhcpd[3439]: Wrote 0 leases to leases file.
May 08 12:38:55 scylla.octocat.cloud dhcpd[3439]: Server starting service.
May 08 12:38:57 scylla.octocat.cloud isc-dhcp-server[3424]: Starting ISC DHCPv4 server: dhcpd.
May 08 12:38:57 scylla.octocat.cloud systemd[1]: Started LSB: DHCP server.

Обновим конфигурацию rsyslog для использования выделенного файла журнала.

$ cat << 'EOF' | sudo tee /etc/rsyslog.d/dhcpd.conf
# Log messages generated by dhcpd application 
if $programname == 'dhcpd' then /var/log/dhcpd.log
# stop processing it further
& stop
EOF
# Log messages generated by dhcpd application 
if $programname == 'dhcpd' then /var/log/dhcpd.log
# stop processing it further
& stop

Перезапустим службу rsyslog.

$ sudo systemctl restart rsyslog

Просмотрим файл журнала DHCP-сервера.

$ sudo tail -f /var/log/dhcpd.log
May  8 12:29:52 raspberrypi dhcpd[3065]: DHCPREQUEST for 172.16.151.200 from 1c:69:7a:b7:e5:2c via eth0
May  8 12:29:52 raspberrypi dhcpd[3065]: DHCPACK on 172.16.151.200 to 1c:69:7a:b7:e5:2c via eth0
May  8 12:34:52 raspberrypi dhcpd[3065]: DHCPREQUEST for 172.16.151.200 from 1c:69:7a:b7:e5:2c via eth0
May  8 12:34:52 raspberrypi dhcpd[3065]: DHCPACK on 172.16.151.200 to 1c:69:7a:b7:e5:2c via eth0
May  8 12:38:55 raspberrypi dhcpd[3439]: Wrote 0 deleted host decls to leases file.
May  8 12:38:55 raspberrypi dhcpd[3439]: Wrote 0 new dynamic host decls to leases file.
May  8 12:38:55 raspberrypi dhcpd[3439]: Wrote 0 leases to leases file.
May  8 12:38:55 raspberrypi dhcpd[3439]: Server starting service.
May  8 12:39:52 raspberrypi dhcpd[3439]: DHCPREQUEST for 172.16.151.200 from 1c:69:7a:b7:e5:2c via eth0
May  8 12:39:52 raspberrypi dhcpd[3439]: DHCPACK on 172.16.151.200 to 1c:69:7a:b7:e5:2c via eth0

Обеспечим ротацию этих журналов.

$ tee /etc/logrotate.d/dhcpd << EOF
/var/log/dhcpd.log {
  daily
  rotate 7
  missingok
  create 0640 root adm
  postrotate
    /usr/lib/rsyslog/rsyslog-rotate
  endscript
}
EOF
/var/log/dhcpd.log {
  hourly
  rotate 7
  missingok
  create 0640 root adm
  postrotate
    /usr/lib/rsyslog/rsyslog-rotate
  endscript
}

см. также:

 

You may also like

Leave a Comment