Inhaltsverzeichnis

DHCP ISC CentOS 7

DHCP ISC ist ein DHCP-Server, welcher die IP-Adressverteilung in einem Netzwerk realisieren kann. Der DHCP-Server des ISC (Internet System Consortium) ist einer der meist eingesetzten DHCP-Server weltweit.

:!: Hinweis - Die nachfolgenden Ausführungen erheben keinen Anspruch auf Vollständigkeit, sondern stellen eine „Basiskonfiguration“ eins DHCP-Servers für ein kleines privates Netzwerk dar!!!

Ab hier werden zur Ausführung nachfolgender Befehle root-Rechte benötigt. Um der Benutzer root zu werden, melden Sie sich bitte als root-Benutzer am System an, oder wechseln mit nachfolgendem Befehl zum Benutzer root:

$ su -
Password:

Überblick

Im nachfolgenden soll die Konfiguration

welche als internes, nicht nach außen agierender DHCP-Server/DHCP-Relay Konstrukt für ein privates Netzwerk mit drei Netzen durchgeführt werden. Nachfolgende Netze werden dabei verwaltet:

:!: HINWEIS - IPv6 soll NICHT genutzt werden!!!

DHCP-Server

Installation

Zur Installation eines DHCP-Servers wird nachfolgendes Paket benötigt:

installiert werden.

Mit nachfolgendem Befehl, wird das Pakete dhcp installiert:

# yum install dhcp
Loaded plugins: changelog, priorities
39 packages excluded due to repository priority protections
Resolving Dependencies
--> Running transaction check
---> Package dhcp.x86_64 12:4.2.5-27.el7.centos.2 will be installed
--> Finished Dependency Resolution

Changes in packages about to be updated:


Dependencies Resolved

================================================================================
 Package     Arch          Version                         Repository      Size
================================================================================
Installing:
 dhcp        x86_64        12:4.2.5-27.el7.centos.2        updates        507 k

Transaction Summary
================================================================================
Install  1 Package

Total download size: 507 k
Installed size: 1.4 M
Is this ok [y/d/N]: y
Downloading packages:
dhcp-4.2.5-27.el7.centos.2.x86_64.rpm                      | 507 kB   00:00     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : 12:dhcp-4.2.5-27.el7.centos.2.x86_64                         1/1 
  Verifying  : 12:dhcp-4.2.5-27.el7.centos.2.x86_64                         1/1 

Installed:
  dhcp.x86_64 12:4.2.5-27.el7.centos.2                                          

Complete!

Mit nachfolgendem Befehl kann überprüft werden, welche Inhalte mit den Paket dhcp installiert wurden.

# rpm -qil dhcp
Name        : dhcp
Epoch       : 12
Version     : 4.2.5
Release     : 27.el7.centos.2
Architecture: x86_64
Install Date: Tue 14 Oct 2014 12:05:50 PM CEST
Group       : System Environment/Daemons
Size        : 1444029
License     : ISC
Signature   : RSA/SHA256, Mon 06 Oct 2014 06:33:43 PM CEST, Key ID 24c6a8a7f4a80eb5
Source RPM  : dhcp-4.2.5-27.el7.centos.2.src.rpm
Build Date  : Mon 06 Oct 2014 03:45:35 PM CEST
Build Host  : worker1.bsys.centos.org
Relocations : (not relocatable)
Packager    : CentOS BuildSystem <http://bugs.centos.org>
Vendor      : CentOS
URL         : http://isc.org/products/DHCP/
Summary     : Dynamic host configuration protocol software
Description :
DHCP (Dynamic Host Configuration Protocol) is a protocol which allows
individual devices on an IP network to get their own network
configuration information (IP address, subnetmask, broadcast address,
etc.) from a DHCP server. The overall purpose of DHCP is to make it
easier to administer a large network.

To use DHCP on your network, install a DHCP service (or relay agent),
and on clients run a DHCP client daemon.  The dhcp package provides
the ISC DHCP service and relay agent.
/etc/NetworkManager
/etc/NetworkManager/dispatcher.d
/etc/NetworkManager/dispatcher.d/12-dhcpd
/etc/dhcp
/etc/dhcp/dhcpd.conf
/etc/dhcp/dhcpd6.conf
/etc/openldap/schema/dhcp.schema
/etc/sysconfig/dhcpd
/usr/bin/omshell
/usr/lib/systemd/system/dhcpd.service
/usr/lib/systemd/system/dhcpd6.service
/usr/lib/systemd/system/dhcrelay.service
/usr/sbin/dhcpd
/usr/sbin/dhcrelay
/usr/share/doc/dhcp-4.2.5
/usr/share/doc/dhcp-4.2.5/dhcpd.conf.example
/usr/share/doc/dhcp-4.2.5/dhcpd6.conf.example
/usr/share/doc/dhcp-4.2.5/ldap
/usr/share/doc/dhcp-4.2.5/ldap/README.ldap
/usr/share/doc/dhcp-4.2.5/ldap/dhcp.schema
/usr/share/doc/dhcp-4.2.5/ldap/dhcpd-conf-to-ldap
/usr/share/man/man1/omshell.1.gz
/usr/share/man/man5/dhcpd.conf.5.gz
/usr/share/man/man5/dhcpd.leases.5.gz
/usr/share/man/man8/dhcpd.8.gz
/usr/share/man/man8/dhcrelay.8.gz
/usr/share/systemtap/tapset/dhcpd.stp
/var/lib/dhcpd
/var/lib/dhcpd/dhcpd.leases
/var/lib/dhcpd/dhcpd6.leases

Dienst/Deamon-Start einrichten

Um einen DHCP-Server, welcher als Dienst/Deamon als Hintergrundprozess läuft, auch nach einem Neustart des Servers zur Verfügung zu haben, soll der Dienst/Daemon mit dem Server mit gestartet werden, was mit nachfolgendem Befehl realisiert werden kann:

# systemctl enable dhcpd.service
ln -s '/usr/lib/systemd/system/dhcpd.service' '/etc/systemd/system/multi-user.target.wants/dhcpd.service'

Eine Überprüfung, ob beim Neustart des Server der dhcpd-Dienst/Deamon wirklich mit gestartet wird, kann mit nachfolgendem Befehl erfolgen und sollte eine Anzeige, wie ebenfalls nachfolgend dargestellt ausgeben:

# systemctl list-unit-files --type=service | grep dhcpd.service
dhcpd.service                          enabled

bzw.

# systemctl is-enabled dhcpd.service
enabled

IPv6 deaktivieren

Grundsätzlich wird für den Einsatz von IPv6 ein zusätzlicher Dienst/Daemon benötigt, welcher den Namen dhcpd6 trägt.

:!: HINWEIS - Falls dhcpd6 nicht gestartet wird, kommt auch kein IPv6 zum Einsatz!

Jedoch lauscht auch der dhcpd standardmäßig auf IPv6, dadurch wird es nötig auf für den für den DHCP-Dienst/Daemon dhcpd IPv6 zu deaktivieren.

:!: HINWEIS - Dies wird NICHT mehr in der Konfigurationsdatei /etc/sysconfig/dhcpd durchgeführt !!!

Zuerst sollte mit nachfolgendem Befehl die Standard Start Datei von systemd für den DHCP-Dienst/Daemon dhcpd in das Verzeichnis

mit nachfolgendem Befehl kopiert werden:

# cp -a /usr/lib/systemd/system/dhcpd.service /etc/systemd/system/

:!: WICHTIG - Im Verzeichnis /etc/systemd/system befinden sich modifizierte - systemd Start Dateien !!!

Anschließend kann die kopierte systemd Start Datei

wie nachfolgend beschrieben, anpasst werden:

[Unit]
Description=DHCPv4 Server Daemon
Documentation=man:dhcpd(8) man:dhcpd.conf(5)
After=network.target
After=time-sync.target
 
[Service]
Type=notify
# Tachtler
# default: ExecStart=/usr/sbin/dhcpd -f -cf /etc/dhcp/dhcpd.conf -user dhcpd -group dhcpd --no-pid
ExecStart=/usr/sbin/dhcpd -f -cf /etc/dhcp/dhcpd.conf -user dhcpd -group dhcpd --no-pid -4
 
[Install]
WantedBy=multi-user.target

Abschließend muss die systemd Start Datei noch systemd bekannt gemacht werden, was mit nachfolgendem Befehl durchgeführt werden kann:

# systemctl --system daemon-reload

iptables Regel

Damit der DHCP-Server auch erreichbar ist und nicht die Weitergabe der IP-Address Informationen vom Paketfilter iptables blockiert wird, muss nachfolgende Regel zum iptables-Regelwerk hinzugefügt werden.

Um die aktuellen iptables-Regeln erweitern zu können, sollten diese erst einmal aufgelistet werden, was mit nachfolgendem Befehl durchgeführt werden kann:

# iptables -L -nv --line-numbers
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source       destination         
1    34716   43M ACCEPT     all  --  *      *       0.0.0.0/0    0.0.0.0/0    state RELATED,ESTABLISHED
2        0     0 ACCEPT     icmp --  *      *       0.0.0.0/0    0.0.0.0/0           
3        0     0 ACCEPT     all  --  lo     *       0.0.0.0/0    0.0.0.0/0           
4        6   360 ACCEPT     tcp  --  *      *       0.0.0.0/0    0.0.0.0/0    state NEW tcp dpt:22
6     1003  238K REJECT     all  --  *      *       0.0.0.0/0    0.0.0.0/0    reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source       destination         
1        0     0 REJECT     all  --  *      *       0.0.0.0/0    0.0.0.0/0    reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT 329 packets, 45404 bytes)
num   pkts bytes target     prot opt in     out     source       destination         

Nachfolgende Befehle, fügen folgende iptables-Regeln dem iptables-Regelwerk nach der Position 4 hinzu, ohne das der Paketfilter angehalten werden muss:

und hier die Befehle:

# iptables -I INPUT 5 -p udp --dport 67 -j ACCEPT
# iptables -I OUTPUT 1 -p udp --dport 68 -j ACCEPT

Ein erneute Abfrage des iptables-Regelwerts, sollte dann nachfolgend dargestellte Ausgabe ergeben, was mit folgendem Befehl durchgeführt werden kann:

# iptables -L -nv --line-numbers
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source       destination         
1    34716   43M ACCEPT     all  --  *      *       0.0.0.0/0    0.0.0.0/0    state RELATED,ESTABLISHED
2        0     0 ACCEPT     icmp --  *      *       0.0.0.0/0    0.0.0.0/0           
3        0     0 ACCEPT     all  --  lo     *       0.0.0.0/0    0.0.0.0/0           
4        6   360 ACCEPT     tcp  --  *      *       0.0.0.0/0    0.0.0.0/0    state NEW tcp dpt:22
5        0     0 ACCEPT     udp  --  *      *       0.0.0.0/0    0.0.0.0/0    udp dpt:67
6     1003  238K REJECT     all  --  *      *       0.0.0.0/0    0.0.0.0/0    reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source       destination         
1        0     0 REJECT     all  --  *      *       0.0.0.0/0    0.0.0.0/0    reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT 329 packets, 45404 bytes)
num   pkts bytes target     prot opt in     out     source       destination         
1        0     0 ACCEPT     udp  --  *      *       0.0.0.0/0    0.0.0.0/0    udp dpt:68

Die neuen Zeilen sind an Position 9 (INPUT) und Postition 1 (OUTPUT) zu sehen, hier nachfolgend zur Verdeutlichung noch einmal dargestellt (nur relevanter Ausschnitt):

...
5        0     0 ACCEPT     udp  --  *      *       0.0.0.0/0    0.0.0.0/0    udp dpt:67 
...
1        0     0 ACCEPT     udp  --  *      *       0.0.0.0/0    0.0.0.0/0    udp dpt:68
...

Um diese iptables-Regel dauerhaft, auch nach einem Neustart des Server, weiterhin im iptables-Regelwerk zu speichern, muss nachfolgend dargestellter Befehl abschließend noch ausgeführt werden:

# /usr/sbin/iptables-save > /etc/sysconfig/iptables 

Nachfolgender Befehl kann dazu verwendet werden, um zu überprüfen, ob das iptables-Regelwerk auch korrekt gespeichert wurde:

# cat /etc/sysconfig/iptables
# Generated by iptables-save v1.4.21 on Tue Oct 14 12:12:08 2014
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [296:41040]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p udp -m udp --dport 67 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
-A OUTPUT -p udp -m udp --dport 68 -j ACCEPT
COMMIT
# Completed on Tue Oct 14 12:12:08 2014

Nach der Installation, ist die Konfigurationsdatei des DHCP-Servers, welche im nachfolgendem Verzeichnis mit dem Namen

steht, erst einmal leer.

Basis-Konfiguration

Nach der Installation, ist die Konfigurationsdatei des DHCP-Servers, welche im nachfolgendem Verzeichnis mit dem Namen

steht, erst einmal leer.

/etc/dhcp/dhcpd.conf

Eine grundlegende Konfigurationsdatei, könnte wie die nachfolgend dargestellte aussehen (komplette Konfigurationsdatei):

#
# DHCP Server Configuration file.
#   see /usr/share/doc/dhcp*/dhcpd.conf.sample
#   see 'man 5 dhcpd.conf'
#
 
# ==============================================================================
# Globals.
# ==============================================================================
 
# Max. number of allocated leases aarived, to decrease to min-lease-time.
adaptive-lease-time-threshold 80;
 
# Accept clients, with NOT set broadcast the bit.
always-broadcast false;
 
# Accept clients, with expect RFC1048, but did NOT follow RFC1048.
always-reply-rfc1048 true;
 
# Send DHCPNAK messages, to misconfiguired clients.
authoritative;
 
# Allow clients, wich did NOT send a host declaration to get an IP-Address.
boot-unknown-clients true;
 
# Format of the timestamp in lease files, UTC (default) OR local (local).
db-time-format local;
 
# Hostname, which setting up the clients A and PTR record.
ddns-hostname "ns1";
 
# Domainname, which appended to the clients hostname for FQDN.
ddns-domainname "idmz.tachtler.net";
 
# Domainname, which appended to the clients reversed IP-Address.
ddns-rev-domainname "0.168.192.in-addr.arpa";
 
# The update-style parameter, none (default), ad-hoc or interim.
ddns-update-style none;
 
# Attempt to do a DNS-update, after a lease-file is confirmed.
ddns-updates off;
 
# Default lease time in seconds. (86400 = 24h).
default-lease-time 86400;
 
# Attempt to do a DHCP-update, on a clients A record at lease-time.
do-forward-updates false;
 
# Ending time for al assigned BOOTP clients. (Global setting).
# dynamic-bootp-lease-cutoff 0 9999/12/31 23:59:59;
 
# Lenght of lease-time for dynamic BOOTP clients. (86400 = 24h).
# dynamic-bootp-lease-length 86400;
 
# Filename of the initial boot file, which is to be loaded by the client.
# filename "";
 
# Look up for all corrosponding IP-Adresses in the lease-pool.
get-lease-hostnames false;
 
# Possibility to "resere" leases by client request with infinite (0xffffffff) lease-time.
# infinite-is-reserved false;
 
# Path and name of the lease file.
# lease-file-name /var/lib/dhcpd/dhcpd.leases
 
# Local port listen to DHCP requests.
# local-port 67;
 
# Local address listen to DHCP requests. DO NOT USE !!!
# local-address 0.0.0.0; 
 
# Log facility.
# log-facility local7
 
# Max. lease time in seconds. (604800 = 7d).
max-lease-time 604800;
 
# Clients retry, to get a new lease, in seconds. (Max. 255s).
# min-secs 0;
 
# Min. lease time in seconds. (3600 = 1h)
min-lease-time 3600;
 
# Allow only one lease per client;
one-lease-per-client true;
 
# Path and name of the PID-file.
# pid-file-name /var/run/dhcpd.pid;
 
# Check ping to a new IP-Address. If ping is possible IP-Address already in use.
ping-check true;
 
# Set wait timeout for check-ping in seconds. (default is 1).
ping-timeout 3;
 
# Remote port for DHCP response.
# remote-port 68;
 
# Specify the format of the Server DUID. If not specified, it will be generated by dhcpd.
# server-duid LLT
 
# IP-Address for the response of the DHCP-Server.
server-identifier 192.168.0.1;
 
# Server name of the server, from which the client is booting.
server-name "ns1.idmz.tachtler.net";
 
# Record the relay agent information options sent during the client's initial DHCPREQUEST message.
stash-agent-options true;
 
# Check for update-conflicts on IP-Adresses, when leases run out;
update-conflict-detection true;
 
# Heal DB inconsestencies easily. (default is true).
update-optimization true;
 
# Update leases for fixed IP-Addresses. Only useful with update-style interim.
update-static-leases false;
 
# ==============================================================================
# Host declarations.
# ==============================================================================
 
host rechner01 {
        allow duplicates;
        hardware ethernet 12:34:56:78:9a:bd;
        fixed-address 192.168.2.2;
        option host-name "rechner01";
}
 
host rechner02 {
        hardware ethernet 12:34:56:78:9a:be;
        fixed-address 192.168.2.3;
        option host-name "rechner01";
}
 
# ==============================================================================
# Class definitions
# ==============================================================================
 
class "rechner03" {
        match if ( substring ( hardware, 1, 6 ) = 12:34:56:78:9a:bc );
}
 
# ==============================================================================
# Subnet declarations.
# ==============================================================================
 
# ------------------------------------------------------------------------------
# Subnet 192.168.0.0/24
# ------------------------------------------------------------------------------
 
subnet 192.168.0.0 netmask 255.255.255.0 {
 
        #
        # Network settings 
        #
 
        option broadcast-address 192.168.0.255;
        option domain-name "idmz.tachtler.net";
        option domain-name-servers 192.168.0.1;
        option domain-search "idmz.tachtler.net", "edmz.tachtler.net",
                              "intra.tachtler.net", "tachtler.net";
        option ntp-servers 192.168.0.1;
        option routers 192.168.0.1;
        option subnet-mask 255.255.255.0;
        option time-servers 192.168.0.1;
 
 
        #
        # Static IP address definitions (pseudo)
        #
 
        pool {
                allow members of "rechner03";
                range 192.168.0.4 192.168.0.4;
        }
 
        #
        # Dynamic IP addresses
        #
 
        pool {
                range 192.168.0.5 192.168.0.254;
        }
 
}
 
# ------------------------------------------------------------------------------
# Subnet 192.168.1.0/24
# ------------------------------------------------------------------------------
 
subnet 192.168.1.0 netmask 255.255.255.0 {
 
        #
        # Network settings 
        #
 
        option broadcast-address 192.168.1.255;
        option domain-name "edmz.tachtler.net";
        option domain-name-servers 192.168.1.1;
        option domain-search "edmz.tachtler.net", "idmz.tachtler.net",
                              "intra.tachtler.net", "tachtler.net";
        option ntp-servers 192.168.1.1;
        option routers 192.168.1.1;
        option subnet-mask 255.255.255.0;
        option time-servers 192.168.1.1;
 
        #
        # Dynamic IP addresses
        #
 
        pool {
                range 192.168.1.2 192.168.1.254;
        }
 
# ------------------------------------------------------------------------------
# Subnet 192.168.2.0/24
# ------------------------------------------------------------------------------
 
subnet 192.168.2.0 netmask 255.255.255.0 {
 
        #
        # Network settings 
        #
 
        option broadcast-address 192.168.2.255;
        option domain-name "intra.tachtler.net";
        option domain-name-servers 192.168.2.1;
        option domain-search "intra.tachtler.net", "idmz.tachtler.net",
                             "edmz.tachtler.net", "tachtler.net";
        option ntp-servers 192.168.2.1;
        option routers 192.168.2.1;
        option subnet-mask 255.255.255.0;
        option time-servers 192.168.2.1;
 
        #
        # Dynamic IP addresses
        #
 
        pool {
                range 192.168.2.2 192.168.2.254;
        }
 
}

Um überprüfen zu können, ob die Konfigurationsdatei /etc/dhcp/dhcpd.conf syntaktische Fehler aufweist, kann nachfolgender Befehl ausgeführt werden, welcher den DHCP-Server nicht startet, sondern nur die Konfigurationsdatei überprüft:

# dhcpd -t -cf /etc/dhcp/dhcpd.conf
Internet Systems Consortium DHCP Server 4.2.5
Copyright 2004-2013 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/
Not searching LDAP since ldap-server, ldap-port and ldap-base-dn were not specified in the config file

:!: HINWEIS - Die Ausgabe von „LDAP“ bezogenen Meldungen, kann in diesem Beispiel ignoriert werden.

DHCP-Server starten

Falls alle voranstehenden Schritte wie beschrieben durchgeführt wurden, Installation, IPv6 deaktivieren, iptables, sollte dem ersten Start nichts im Wege stehen und dies mit nachfolgendem Befehl durchgeführt werden:

# systemctl start dhcpd.service

DHCP-Server Überprüfung

Ob der DHCP-Server, sprich der dhcpd-Dienst/Deamon auch tatsächlich als Hintergrundprozess läuft, kann mit nachfolgendem Befehl überprüft werden (Es sollte eine Ausgabe wie nachfolgend dargestellt, erfolgen - es kommt auf die zweite Zeile an!):

# ps auxwwwf | grep dhcpd
root     10007  0.0  0.0 112640   924 pts/0    S+   14:44   0:00                      \_ grep --color=auto dhcpd
dhcpd    10001  0.0  1.8 107716 18908 ?        Ss   14:40   0:00 /usr/sbin/dhcpd -f -cf /etc/dhcp/dhcpd.conf -user dhcpd -group dhcpd --no-pid

Eine weitere Überprüfung, ob der erste Start erfolgreich war, kann durch Einsicht der LOG-Dateien

durchgeführt werden.

Ausgabe der LOG-Datei /var/log/messages mit nachfolgendem Befehl, die Ausgabe sollte wie nachfolgend dargestellt aussehen:

# tail -n 16 /var/log/messages
Oct 14 14:40:57 server20 systemd: Starting DHCPv4 Server Daemon...
Oct 14 14:40:57 server20 dhcpd: Internet Systems Consortium DHCP Server 4.2.5
Oct 14 14:40:57 server20 dhcpd: Copyright 2004-2013 Internet Systems Consortium.
Oct 14 14:40:57 server20 dhcpd: All rights reserved.
Oct 14 14:40:57 server20 dhcpd: For info, please visit https://www.isc.org/software/dhcp/
Oct 14 14:40:57 server20 dhcpd: Not searching LDAP since ldap-server, ldap-port and ldap-base-dn were not specified in the config file
Oct 14 14:40:57 server20 dhcpd: Wrote 0 class decls to leases file.
Oct 14 14:40:57 server20 dhcpd: Wrote 0 deleted host decls to leases file.
Oct 14 14:40:57 server20 dhcpd: Wrote 0 new dynamic host decls to leases file.
Oct 14 14:40:57 server20 dhcpd: Wrote 0 leases to leases file.
Oct 14 14:40:57 server20 dhcpd: Listening on LPF/eth1/52:54:00:00:01:14/192.168.1.0/24
Oct 14 14:40:57 server20 dhcpd: Sending on   LPF/eth1/52:54:00:00:01:14/192.168.1.0/24
Oct 14 14:40:57 server20 dhcpd: Listening on LPF/eth0/52:54:00:00:00:14/192.168.0.0/24
Oct 14 14:40:57 server20 dhcpd: Sending on   LPF/eth0/52:54:00:00:00:14/192.168.0.0/24
Oct 14 14:40:57 server20 dhcpd: Sending on   Socket/fallback/fallback-net
Oct 14 14:40:57 server20 systemd: Started DHCPv4 Server Daemon.

Interface Überprüfung

Ob und an welchen Interface der DHCP-Server „lauscht“, bzw. DHCP-Requests beantwortet, kann mit nachfolgendem Befehl überprüft werden:

# netstat -tulpen | grep dhcpd
udp        0      0 0.0.0.0:67              0.0.0.0:*           0          57051      10227/dhcpd         
udp        0      0 0.0.0.0:33597           0.0.0.0:*           0          57027      10227/dhcpd         

:!: HINWEIS - Auch bei der Konfiguration nur ein Netzwerk-Interface für eingehende Broadcast-Anfragen zu nutzen, wird immer 0.0.0.0:67 als „Listener“ IP-Adresse angezeigt.

IP-Adressvergabe Überprüfung

Um die Vergabe einer IP-Adresse zu überprüfen, kann ein Blick in die LOG-Datei /var/log/messages geworfen werden, was mit nachfolgendem Befehl durchgeführt werden kann (nur relevanter Auszug):

# cat /var/log/messages | grep dhcpd
...
Oct 15 13:00:25 server20 dhcpd: DHCPDISCOVER from 00:50:0d:b4:6f:37 via 192.168.2.1
Oct 15 13:00:25 server20 dhcpd: DHCPOFFER on 192.168.2.10 to 00:50:0d:b4:6f:37 via 192.168.2.1
Oct 15 13:00:25 server20 dhcpd: DHCPREQUEST for 192.168.2.10 (192.168.1.20) from 00:50:0d:b4:6f:37 via 192.168.2.1
Oct 15 13:00:25 server20 dhcpd: DHCPACK on 192.168.2.10 to 00:50:0d:b4:6f:37 via 192.168.2.1
...

Lease-Datei

Mit nachfolgendem Befehl, kann die sogenannte Lease-Datei eingesehene werden, welche sich standardmäßig in nachfolgenden Verzeichnis mit nachfolgendem Namen befindet, inklusive Backup-Datei, welche am Namensende mit einem ~-Zeichen gekennzeichnet ist

# The format of this file is documented in the dhcpd.leases(5) manual page.
# This lease file was written by isc-dhcp-4.2.5

lease 192.168.2.10 {
  starts epoch 1413175371; # Mon Oct 14 13:00:26 2014
  ends epoch 1413178971; # Mon Oct 14 13:00:26 2014
  tstp epoch 1413178971; # Mon Oct 14 13:00:26 2014
  cltt epoch 1413175371; # Mon Oct 14 13:00:26 2014
  binding state free;
  hardware ethernet 00:50:0d:b4:6f:37;
}
server-duid "\000\001\000\001\033\317\326YRT\000\007\001\024";

:!: HINWEIS - In dem vorhergehenden Beispiel ist die Lease-Datei leer!!!

DHCP-Relay

Falls mehrere Netzsegmente, hier die nachfolgenden Netzsegmente

von einem DHCP-Server mit IP-Adressen versorgt werden sollen, gibt es zwei Möglichkeiten:

  1. der DHCP-Server ist in beiden Netzsegmenten present
  2. es wird auf dem Router/Gateway mit DHCP-Relaying gearbeitet.

:!: HINWEIS - Im nachfolgend dargestellten Fall, soll kein Hardware-Router als DHCP-Relay zum Einsatz kommen, sondern das Gateway, für das entsprechende Netzsegment, hier 192.168.1.0/24, was ebenfalls ein Server unter CentOS ist!

Installation

Um eine DHCP-Relay unter Linux, hier im speziellen unter CentOS zu realisieren, wird ein Programm mit dem Namen

benötigt.

Dieses Programm mit dem Namen dhcrelay befindet sich ebenfalls im Paket

:!: WICHTIG - Die Installation des Paketes dhcp erfolgt auf dem GATEWAY, welches als Router in z.B. das Netz 192.168.2.0/24 - intra.tachtler.net fungiert !!!

Mit nachfolgendem Befehl, wird das Pakete dhcp installiert:

# yum install dhcp
Loaded plugins: changelog, priorities
39 packages excluded due to repository priority protections
Resolving Dependencies
--> Running transaction check
---> Package dhcp.x86_64 12:4.2.5-27.el7.centos.2 will be installed
--> Finished Dependency Resolution

Changes in packages about to be updated:


Dependencies Resolved

================================================================================
 Package     Arch          Version                         Repository      Size
================================================================================
Installing:
 dhcp        x86_64        12:4.2.5-27.el7.centos.2        updates        507 k

Transaction Summary
================================================================================
Install  1 Package

Total download size: 507 k
Installed size: 1.4 M
Is this ok [y/d/N]: y
Downloading packages:
dhcp-4.2.5-27.el7.centos.2.x86_64.rpm                      | 507 kB   00:00     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : 12:dhcp-4.2.5-27.el7.centos.2.x86_64                         1/1 
  Verifying  : 12:dhcp-4.2.5-27.el7.centos.2.x86_64                         1/1 

Installed:
  dhcp.x86_64 12:4.2.5-27.el7.centos.2                                          

Complete!

Mit nachfolgendem Befehl kann überprüft werden, welche Inhalte mit den Paket dhcp installiert wurden.

# rpm -qil dhcp
Name        : dhcp
Epoch       : 12
Version     : 4.2.5
Release     : 27.el7.centos.2
Architecture: x86_64
Install Date: Tue 14 Oct 2014 12:05:50 PM CEST
Group       : System Environment/Daemons
Size        : 1444029
License     : ISC
Signature   : RSA/SHA256, Mon 06 Oct 2014 06:33:43 PM CEST, Key ID 24c6a8a7f4a80eb5
Source RPM  : dhcp-4.2.5-27.el7.centos.2.src.rpm
Build Date  : Mon 06 Oct 2014 03:45:35 PM CEST
Build Host  : worker1.bsys.centos.org
Relocations : (not relocatable)
Packager    : CentOS BuildSystem <http://bugs.centos.org>
Vendor      : CentOS
URL         : http://isc.org/products/DHCP/
Summary     : Dynamic host configuration protocol software
Description :
DHCP (Dynamic Host Configuration Protocol) is a protocol which allows
individual devices on an IP network to get their own network
configuration information (IP address, subnetmask, broadcast address,
etc.) from a DHCP server. The overall purpose of DHCP is to make it
easier to administer a large network.

To use DHCP on your network, install a DHCP service (or relay agent),
and on clients run a DHCP client daemon.  The dhcp package provides
the ISC DHCP service and relay agent.
/etc/NetworkManager
/etc/NetworkManager/dispatcher.d
/etc/NetworkManager/dispatcher.d/12-dhcpd
/etc/dhcp
/etc/dhcp/dhcpd.conf
/etc/dhcp/dhcpd6.conf
/etc/openldap/schema/dhcp.schema
/etc/sysconfig/dhcpd
/usr/bin/omshell
/usr/lib/systemd/system/dhcpd.service
/usr/lib/systemd/system/dhcpd6.service
/usr/lib/systemd/system/dhcrelay.service
/usr/sbin/dhcpd
/usr/sbin/dhcrelay
/usr/share/doc/dhcp-4.2.5
/usr/share/doc/dhcp-4.2.5/dhcpd.conf.example
/usr/share/doc/dhcp-4.2.5/dhcpd6.conf.example
/usr/share/doc/dhcp-4.2.5/ldap
/usr/share/doc/dhcp-4.2.5/ldap/README.ldap
/usr/share/doc/dhcp-4.2.5/ldap/dhcp.schema
/usr/share/doc/dhcp-4.2.5/ldap/dhcpd-conf-to-ldap
/usr/share/man/man1/omshell.1.gz
/usr/share/man/man5/dhcpd.conf.5.gz
/usr/share/man/man5/dhcpd.leases.5.gz
/usr/share/man/man8/dhcpd.8.gz
/usr/share/man/man8/dhcrelay.8.gz
/usr/share/systemtap/tapset/dhcpd.stp
/var/lib/dhcpd
/var/lib/dhcpd/dhcpd.leases
/var/lib/dhcpd/dhcpd6.leases

Dienst/Deamon-Start einrichten

Um einen DHCP-Relay, welcher als Dienst/Deamon als Hintergrundprozess läuft, auch nach einem Neustart des Servers zur Verfügung zu haben, soll der Dienst/Daemon mit dem Server mit gestartet werden, was mit nachfolgendem Befehl realisiert werden kann:

# systemctl enable dhcrelay.service
ln -s '/usr/lib/systemd/system/dhcrelay.service' '/etc/systemd/system/multi-user.target.wants/dhcrelay.service'

Eine Überprüfung, ob beim Neustart des Server der dhcrelay-Dienst/Deamon wirklich mit gestartet wird, kann mit nachfolgendem Befehl erfolgen und sollte eine Anzeige, wie ebenfalls nachfolgend dargestellt ausgeben:

# systemctl list-unit-files --type=service | grep dhcrelay.service
dhcrelay.service                        enabled

bzw.

# systemctl is-enabled dhcrelay.service
enabled

IPv6 deaktivieren

Der Dienst/Daemon lauscht dhcrelay standardmäßig nicht auf IPv6, jedoch kann explizit für den für den DHCP-Dienst/Daemon dhcrelay IPv6 zu deaktivieren für eine klare Konfiguration sorgen.

:!: HINWEIS - Dies wird NICHT mehr in der Konfigurationsdatei /etc/sysconfig/dhcrelay durchgeführt !!!

Zuerst sollte mit nachfolgendem Befehl die Standard Start Datei von systemd für den DHCP-Dienst/Daemon dhcrelay in das Verzeichnis

mit nachfolgendem Befehl kopiert werden:

# cp -a /usr/lib/systemd/system/dhcrelay.service /etc/systemd/system/

:!: WICHTIG - Im Verzeichnis /etc/systemd/system befinden sich modifizierte - systemd Start Dateien !!!

Anschließend kann die kopierte systemd Start Datei

wie nachfolgend beschrieben, anpasst werden:

[Unit]
Description=DHCP Relay Agent Daemon
Documentation=man:dhcrelay(8)
After=network.target
 
[Service]
Type=notify
# Tachtler
# default: ExecStart=/usr/sbin/dhcrelay -d --no-pid
ExecStart=/usr/sbin/dhcrelay -d --no-pid -4
 
[Install]
WantedBy=multi-user.target

Abschließend muss die systemd Start Datei noch systemd bekannt gemacht werden, was mit nachfolgendem Befehl durchgeführt werden kann:

# systemctl --system daemon-reload

iptables Regel

Damit der DHCP-Server auch erreichbar ist und nicht die Weitergabe der IP-Address Informationen vom Paketfilter iptables blockiert wird, muss nachfolgende Regel zum iptables-Regelwerk hinzugefügt werden.

Um die aktuellen iptables-Regeln erweitern zu können, sollten diese erst einmal aufgelistet werden, was mit nachfolgendem Befehl durchgeführt werden kann:

# iptables -L -nv --line-numbers
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source       destination         
1    34716   43M ACCEPT     all  --  *      *       0.0.0.0/0    0.0.0.0/0    state RELATED,ESTABLISHED
2        0     0 ACCEPT     icmp --  *      *       0.0.0.0/0    0.0.0.0/0           
3        0     0 ACCEPT     all  --  lo     *       0.0.0.0/0    0.0.0.0/0           
4        6   360 ACCEPT     tcp  --  *      *       0.0.0.0/0    0.0.0.0/0    state NEW tcp dpt:22
6     1003  238K REJECT     all  --  *      *       0.0.0.0/0    0.0.0.0/0    reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source       destination         
1        0     0 REJECT     all  --  *      *       0.0.0.0/0    0.0.0.0/0    reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT 329 packets, 45404 bytes)
num   pkts bytes target     prot opt in     out     source       destination         

Nachfolgende Befehle, fügen folgende iptables-Regeln dem iptables-Regelwerk nach der Position 4 hinzu, ohne das der Paketfilter angehalten werden muss:

und hier die Befehle:

# iptables -I INPUT 5 -p udp --dport 67 -j ACCEPT
# iptables -I OUTPUT 1 -p udp --dport 68 -j ACCEPT

Ein erneute Abfrage des iptables-Regelwerts, sollte dann nachfolgend dargestellte Ausgabe ergeben, was mit folgendem Befehl durchgeführt werden kann:

# iptables -L -nv --line-numbers
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source       destination         
1    34716   43M ACCEPT     all  --  *      *       0.0.0.0/0    0.0.0.0/0    state RELATED,ESTABLISHED
2        0     0 ACCEPT     icmp --  *      *       0.0.0.0/0    0.0.0.0/0           
3        0     0 ACCEPT     all  --  lo     *       0.0.0.0/0    0.0.0.0/0           
4        6   360 ACCEPT     tcp  --  *      *       0.0.0.0/0    0.0.0.0/0    state NEW tcp dpt:22
5        0     0 ACCEPT     udp  --  *      *       0.0.0.0/0    0.0.0.0/0    udp dpt:67
6     1003  238K REJECT     all  --  *      *       0.0.0.0/0    0.0.0.0/0    reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source       destination         
1        0     0 REJECT     all  --  *      *       0.0.0.0/0    0.0.0.0/0    reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT 329 packets, 45404 bytes)
num   pkts bytes target     prot opt in     out     source       destination         
1        0     0 ACCEPT     udp  --  *      *       0.0.0.0/0    0.0.0.0/0    udp dpt:68

Die neuen Zeilen sind an Position 9 (INPUT) und Postition 1 (OUTPUT) zu sehen, hier nachfolgend zur Verdeutlichung noch einmal dargestellt (nur relevanter Ausschnitt):

...
5        0     0 ACCEPT     udp  --  *      *       0.0.0.0/0    0.0.0.0/0    udp dpt:67 
...
1        0     0 ACCEPT     udp  --  *      *       0.0.0.0/0    0.0.0.0/0    udp dpt:68
...

Um diese iptables-Regel dauerhaft, auch nach einem Neustart des Server, weiterhin im iptables-Regelwerk zu speichern, muss nachfolgend dargestellter Befehl abschließend noch ausgeführt werden:

# /usr/sbin/iptables-save > /etc/sysconfig/iptables 

Nachfolgender Befehl kann dazu verwendet werden, um zu überprüfen, ob das iptables-Regelwerk auch korrekt gespeichert wurde:

# cat /etc/sysconfig/iptables
# Generated by iptables-save v1.4.21 on Tue Oct 15 09:05:12 2014
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [296:41040]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p udp -m udp --dport 67 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
-A OUTPUT -p udp -m udp --dport 68 -j ACCEPT
COMMIT
# Completed on Tue Oct 15 09:05:12 2014

Nach der Installation, ist die Konfigurationsdatei des DHCP-Servers, welche im nachfolgendem Verzeichnis mit dem Namen

steht, erst einmal leer.

Basis-Konfiguration

Nach der Installation, ist die Konfigurationsdatei des DHCP-Servers, welche im nachfolgendem Verzeichnis mit dem Namen

steht, erst einmal leer - dies soll auch ZWINGEND so bleiben.

:!: WICHTIG - Die Konfiguration eines DHCP-Relay erfolgt NICHT in /etc/dhcp/dhcpd.conf !!!

Die Konfiguration eines DHCP-Relays gestaltet sich jedoch im Vergleich zum Einrichten eines DCHP-Servers einfacher.

Wie ggf. unter der Konfiguration

durchgeführt, muss die systemd-Start Datei kopiert und angepasst werden.

Hier nachfolgend noch einmal die Schritte, falls diese nicht bereits durchgeführt wurden:

Zuerst sollte mit nachfolgendem Befehl die Standard Start Datei von systemd für den DHCP-Dienst/Daemon dhcrelay in das Verzeichnis

mit nachfolgendem Befehl kopiert werden:

# cp -a /usr/lib/systemd/system/dhcrelay.service /etc/systemd/system/

:!: WICHTIG - Im Verzeichnis /etc/systemd/system befinden sich modifizierte - systemd Start Dateien !!!

Anschließend kann die kopierte systemd Start Datei

wie nachfolgend beschrieben, weiter anpasst werden:

[Unit]
Description=DHCP Relay Agent Daemon
Documentation=man:dhcrelay(8)
After=network.target
 
[Service]
Type=notify
# Tachtler
# default: ExecStart=/usr/sbin/dhcrelay -d --no-pid
ExecStart=/usr/sbin/dhcrelay -d --no-pid -4 -i eth0 -i eth1 192.168.1.20
 
[Install]
WantedBy=multi-user.target
Option Beschreibung
-i eth0 Lauscht auf DHCPREQUEST auf dem Interface eth0
-i eth1 Lauscht auf DHCPREQUEST auf dem Interface eth1
192.168.0.20 DHCP-Server an den die DHCPREQUEST-Anfragen weitergeleitet werden

Abschließend muss die systemd Start Datei noch systemd bekannt gemacht werden, was mit nachfolgendem Befehl durchgeführt werden kann:

# systemctl --system daemon-reload

DHCP-Relay starten

Falls alle voranstehenden Schritte wie beschrieben durchgeführt wurden, Installation, IPv6 deaktivieren, iptables, sollte dem ersten Start nichts im Wege stehen und dies mit nachfolgendem Befehl durchgeführt werden:

# systemctl start dhcrelay.service

DHCP-Relay Überprüfung

Ob der DHCP-Server, sprich der dhcrelay-Dienst/Deamon auch tatsächlich als Hintergrundprozess läuft, kann mit nachfolgendem Befehl überprüft werden (Es sollte eine Ausgabe wie nachfolgend dargestellt, erfolgen - es kommt auf die zweite Zeile an!):

# ps auxwwwf | grep dhcrelay
root      2257  0.0  0.0 112640   928 pts/0    S+   09:46   0:00                      \_ grep --color=auto dhcrelay
root      2233  0.0  1.4 103672 15044 ?        Ss   09:40   0:00 /usr/sbin/dhcrelay -d --no-pid -4 -i eth0 -i eth1 192.168.1.20

Eine weitere Überprüfung, ob der erste Start erfolgreich war, kann durch Einsicht der LOG-Dateien

durchgeführt werden.

Ausgabe der LOG-Datei /var/log/messages mit nachfolgendem Befehl, die Ausgabe sollte wie nachfolgend dargestellt aussehen:

# tail -n 24 /var/log/messages
Oct 15 09:40:41 server10 systemd: Starting DHCP Relay Agent Daemon...
Oct 15 09:40:41 server10 dhcrelay: Dropped all unnecessary capabilities.
Oct 15 09:40:41 server10 dhcrelay: Internet Systems Consortium DHCP Relay Agent 4.2.5
Oct 15 09:40:41 server10 dhcrelay: Copyright 2004-2013 Internet Systems Consortium.
Oct 15 09:40:41 server10 dhcrelay: All rights reserved.
Oct 15 09:40:41 server10 dhcrelay: For info, please visit https://www.isc.org/software/dhcp/
Oct 15 09:40:41 server10 dhcrelay: Dropped all unnecessary capabilities.
Oct 15 09:40:41 server10 dhcrelay: Internet Systems Consortium DHCP Relay Agent 4.2.5
Oct 15 09:40:41 server10 dhcrelay: Copyright 2004-2013 Internet Systems Consortium.
Oct 15 09:40:41 server10 dhcrelay: All rights reserved.
Oct 15 09:40:41 server10 dhcrelay: For info, please visit https://www.isc.org/software/dhcp/
Oct 15 09:40:41 server10 dhcrelay: Listening on LPF/eth1/52:54:00:a8:00:01
Oct 15 09:40:41 server10 dhcrelay: Sending on   LPF/eth1/52:54:00:a8:00:01
Oct 15 09:40:41 server10 dhcrelay: Listening on LPF/eth1/52:54:00:a8:00:01
Oct 15 09:40:41 server10 dhcrelay: Sending on   LPF/eth1/52:54:00:a8:00:01
Oct 15 09:40:41 server10 dhcrelay: Listening on LPF/eth0/52:54:00:00:00:10
Oct 15 09:40:41 server10 dhcrelay: Sending on   LPF/eth0/52:54:00:00:00:10
Oct 15 09:40:41 server10 dhcrelay: Sending on   Socket/fallback
Oct 15 09:40:41 server10 dhcrelay: Dropped all capabilities.
Oct 15 09:40:41 server10 dhcrelay: Listening on LPF/eth0/52:54:00:00:00:10
Oct 15 09:40:41 server10 dhcrelay: Sending on   LPF/eth0/52:54:00:00:00:10
Oct 15 09:40:41 server10 dhcrelay: Sending on   Socket/fallback
Oct 15 09:40:41 server10 dhcrelay: Dropped all capabilities.
Oct 15 09:40:41 server10 systemd: Started DHCP Relay Agent Daemon.

Interface Überprüfung

Ob und an welchen Interface das DHCP-Relay „lauscht“, bzw. DHCP-Requests weitergeleitet werden, kann mit nachfolgendem Befehl überprüft werden:

# netstat -tulpen | grep dhcrelay
udp        0      0 0.0.0.0:67              0.0.0.0:*           0          24421      2233/dhcrelay       
udp        0      0 0.0.0.0:38475           0.0.0.0:*           0          24411      2233/dhcrelay

:!: HINWEIS - Auch bei der Konfiguration nur ein Netzwerk-Interface für eingehende Broadcast-Anfragen zu nutzen, wird immer 0.0.0.0:67 als „Listener“ IP-Adresse angezeigt.

IP-Adressanfrage Überprüfung

Um die Anfrage einer IP-Adresse zu überprüfen, kann ein Blick in die LOG-Datei /var/log/messages geworfen werden, was mit nachfolgendem Befehl durchgeführt werden kann (nur relevanter Auszug):

# cat /var/log/messages | grep dhcrelay
...
Oct 15 13:00:33 server10 dhcrelay: Forwarded BOOTREQUEST for 00:50:0d:b4:6f:37 to 192.168.1.20
Oct 15 13:00:33 Server10 dhcrelay: Forwarded BOOTREPLY for 00:50:0d:b4:6f:37 to 192.168.2.10
...