Debian DHCP-DNS-LDAP
Allgemein
Sowohl die DHCP-Konfiguration als auch die Bind9 DNS-Konfiguration kann zentral im LDAP-Directory abgelegt werden. Dies hat den Vorteil, dass neu angelegte Hosts ohne einen Neustart der Serverdiesnte unmittelbar übernommen werden. Desweiteren kann die Administration mit dem webbasierten LDAP-Account-Manager komfortabel vorgenommen werden. Die Konfiguration kann entweder für beide Dienste, oder auch einer der beiden isoliert, ins LDAP Directory transferiert werden.
Voraussetzungen:
- LDAP Server
- DHCP-Server installiert und konfiguriert
- DNS-Server installiert und konfiguriert
LDAP basierende DHCP-Server Konfig
Paketinstallation
apt-get install isc-dhcp-server-ldap
DHCP-Schema
LDAP-Schema einbinden:
cp /usr/share/doc/isc-dhcp-server-ldap/dhcp.schema.gz /etc/ldap/schema/ gzip -d /etc/ldap/schema/dhcp.schema.gz /usr/local/bin/schema2ldif dhcp
DHCP-Schema in's LDAP-Directory einbinden:
ldapadd -cxWD cn=admin,cn=config -f /etc/ldap/schema/dhcp.ldif
DHCP-Konfig in LDAP importieren
cp /usr/share/doc/isc-dhcp-server-ldap/dhcpd-conf-to-ldap.pl.gz /usr/local/bin/ gzip -d /usr/local/bin/dhcpd-conf-to-ldap.pl.gz chmod +x /usr/local/bin/dhcpd-conf-to-ldap.pl dhcpd-conf-to-ldap.pl --basedn "ou=dhcp,dc=test,dc=lan" --dhcpdn "cn=dhcp_config,ou=dhcp,dc=test,dc=lan" --conf "/etc/dhcp/dhcpd.conf" > /root/ldap_ldif/dhcpd.ldif vi /root/ldap_ldif/dhcp.ldif
Folgende Zeilen am Anfang der Datei einfügen, um eine eigene Organisationseinheit (OU) innerhalb des LDAP-Trees für den DHCP anzulegen:
dn: ou=dhcp,dc=test,dc=lan ou: dhcp objectClass: organizationalUnit dn: cn=...
Einbinden in den LDAP-Tree:
ldapadd -cxWD cn=admin,dc=test,dc=lan -f /root/ldap_ldif/dhcpd.ldif
Konfiguration DHCP-Server
Damit der DHCP-Server die Konfigurationsdaten aus dem LDAP-Directory abruft, sind lediglich ein paar Zeilen erforderlich.
Sichern der originalen DHCP Konfiguration:
mv /etc/dhcp/dhcpd.conf /etc/dhcp/dhcpd.conf.noldap vi /etc/dhcp/dhcpd.conf
Folgende Zeilen einfügen (Kein SSL):
ldap-server "IP_LDAP_SERVER"; ldap-port 389; ldap-ssl off; ldap-base-dn "ou=dhcp,dc=test,dc=lan"; ldap-method dynamic; ldap-debug-file "/var/log/dhcp-ldap.log";
Um SSL-Verbindung zu nutzen:
ldap-port 636; ldap-ssl on;
Neustarten:
/etc/init.d/isc-dhcp-server restart
LAM-Konfiguration
Konfiguration
- Webbrowser öffnen und http://IP_DES_SERVER/lam eingeben
- Links oben auf den Link LAM configuration" klicken
- Edit server profiles anwählen
- Passwort eingeben (LAM_MASTER_PWD)
- Account Types:
- DHCP mit + Symbol im oberen Bereich hinzufügen.
- Im Bereich DHCP (unten) LDAP Suffix: cn=dhcp_config,ou=dhcp,dc=test,dc=lan
- Save anklicken
- Modules
- Im Bereich DHCP folgende Module aktivieren: DHCP settings, Hosts(fixed_ip), Ranges(range), DDNS(ddns), General information(generalInformation)
- Save anklicken
LDAP basierende DNS-Server Konfig
Bind9-Paket neu erstellen
Die Debian Version von Bind9 enthält nicht die Erweiterungen zum laden der Zoneninformationen aus einem LDAP-Directory (DLZ: Dynamic Loadable Zones). Bind9 muss daher neu übersetzt werden.
Installation notwendiger Pakete:
apt-get install devscripts build-essential fakeroot apt-get install libkrb5-dev debhelper libssl-dev libtool bison libdb-dev libldap2-dev libxml2-dev libcap-dev libpcap-dev hardening-wrapper libgeoip-dev dpkg-dev
Vorbereitung:
cd /usr/local/src mkdir bind9 cd bind9 apt-get source bind9 apt-get build-dep bind9 dpkg-source -x bind9_9*.dsc cd bind9-9* vi debian/rules
Folgendermaßen ergänzen:
./configure --prefix=/usr \ --mandir=\$${prefix}/share/man \ --infodir=\$${prefix}/share/info \ --sysconfdir=/etc/bind \ --localstatedir=/var \ --enable-threads \ --enable-largefile \ --with-libtool \ --enable-shared \ --enable-static \ --with-openssl=/usr \ --with-gssapi=/usr \ --with-gnu-ld \ --with-geoip=/usr \ --enable-ipv6 \ --with-dlz-filesystem=yes \ --with-dlz-ldap=yes \ --with-dlz-stub=yes \ --with-dlz-dlopen=yes \ $(EXTRA_FEATURES)
Versionsstring erhöhen, damit das selbst kompilierte Bind9-Paket später nicht von der Version aus den Debian Repositories ersetzt wird, das keinen LDAP-Support bietet:
vi debian/changelog
Die erste Zeile sieht z.B. folgendermaßen aus:
bind9 (1:9.8.4.dfsg.P1-6+nmu2) unstable; urgency=medium
Folgende Zeilen davor einfügen (an Versionsnummer .1 angehängt):
bind9 (1:9.8.4.dfsg.P1-6+nmu2.1) unstable; urgency=medium * activate dlz support
Debian Paket neu erstellen:
fakeroot debian/rules binary
Im übergeordneten Ordner sollten zahlreiche Pakete erstellt worden sein.
ls ../
Bind9 mit DLZ support installieren
Falls Bind9 bereits installiert sein sollte, muss dieses nun deinstalliert werden. Vorher evtl. noch die Konfigfiles sichern:
cp /etc/bind/named.conf.local /root/ apt-get remove bind9
Selbst kompiiertes Debian Bind9- Paket, incl. der ebenfalls ertellten abhängigen Pakete, installieren:
dpkg -i ../bind9*.deb ../dnsutils*.deb ../lib*.deb
DNS Schema
Um die DNS-Zonen im LDAP Directory zu verwalten, ist ein Schema erforderlich. Das Schema ist im DLZ-Paket (Dynamic Loadable Zones) enthalten, das nun heruntergeladen und entpackt wird:
cd /usr/local/src mkdir bind-dlz cd bind-dlz wget http://downloads.sourceforge.net/project/bind-dlz/Bind%20DLZ/DLZ-0.7.0/DLZ-0.7.0.tar.gz tar xvf DLZ-0.7.0.tar.gz vi dlz.schema
alle Leerzeilen am Ende des Schema-files entfernen, da die Leerzeilen Fehler beim konvertieren Fehler verursachen würden.
cp dlz.schema /etc/ldap/schema/
Schema in LDAP einbinden:
/usr/local/bin/schema2ldif dlz ldapadd -cxWD cn=admin,cn=config -f /etc/ldap/schema/dlz.ldif
DLZ Zonen im LDAP erstellen
Organisational Unit für DNS-Einträge:
vi /root/ldap_ldif/dns_ou.ldif
Folgende Zeilen einfügen:
dn: ou=dns,dc=test,dc=lan ou: dns objectClass: organizationalUnit
ldapadd -cxWD cn=admin,dc=test,dc=lan -f /root/ldap_ldif/dns_ou.ldif
DNS-Zone und Nameserverdefinition:
vi /root/ldap_ldif/dns_zone.ldif
Folgenden Inhalt einfügen und anpassen (Zone: test.lan, Reverse Zone 178.168.192.in-addr.arpa: Erste drei Stellen der IP-Adress in umgekehrter Reihenfolge, LDAP Base dn dc=test,dc=lan, dlzAdminEmail: root@test.org => root.test.org.):
dn: dlzZoneName=test.lan,ou=dns,dc=test,dc=lan objectClass: dlzZone objectClass: top dlzZoneName: test.lan dn: dlzHostName=@,dlzZoneName=test.lan,ou=dns,dc=test,dc=lan objectclass: dlzHost dlzHostName: @ dn: dlzRecordID=1,dlzHostName=@,dlzZoneName=test.lan,ou=dns,dc=test,dc=lan objectclass: dlzNSRecord dlzRecordID: 1 dlzHostName: @ dlzType: ns dlzData: ns1.test.lan. dlzTTL: 86400 dn: dlzRecordID=2,dlzHostName=@,dlzZoneName=test.lan,ou=dns,dc=test,dc=lan objectclass: dlzSOARecord dlzRecordID: 2 dlzHostName: @ dlzType: soa dlzSerial: 2 dlzRefresh: 2800 dlzRetry: 7200 dlzExpire: 604800 dlzMinimum: 86400 dlzAdminEmail: root.test.org. dlzPrimaryns: ns1.test.lan. dlzTTL: 86400 dn: dlzZoneName=178.168.192.in-addr.arpa,ou=dns,dc=test,dc=lan objectClass: dlzZone dlzZoneName: 178.168.192.in-addr.arpa
Zonendaten ins LDAP Directory aufnehmen:
ldapadd -cxWD cn=admin,dc=test,dc=lan -f /root/ldap_ldif/dns_zone.ldif
DNS Server konfigurieren
vi /etc/bind/named.conf.local Evtl. existente Zoneneinträge, die ins LDAP transferiert werden, auskommentieren und evtl. basedn dc=test,dc=lan anpassen:
dlz "test.lan" {database "ldap 2 v3 simple {} {} {IP_LDAP_SERVER} ldap:///dlzZoneName=$zone$,ou=dns,dc=test,dc=lan???objectclass=dlzZone ldap:///dlzHostName=$record$,dlzZoneName=$zone$,ou=dns,dc=test,dc=lan?dlzTTL,dlzType,dlzPreference,dlzData,dlzIPAddr ?sub?(&(objectclass=dlzAbstractRecord)(!(dlzType=soa))) ldap:///dlzHostName=@,dlzZoneName=$zone$,ou=dns,dc=test,dc=lan ?dlzTTL,dlzType,dlzData,dlzPrimaryNS,dlzAdminEmail,dlzSerial,dlzRefresh,dlzRetry,dlzExpire,dlzMinimum?sub?(&(objectclass=dlzAbstractRecord)(dlzType=soa)) ldap:///dlzZoneName=$zone$,ou=dns,dc=test,dc=lan ?dlzTTL,dlzType,dlzHostName,dlzPreference,dlzData,dlzIPAddr,dlzPrimaryNS,dlzAdminEmail,dlzSerial,dlzRefresh,dlzRetry,dlzExpire,dlzMinimum?sub ?(&(objectclass=dlzAbstractRecord)(!(dlzType=soa)))";};
Bind neu starten
/etc/init.d/bind9 restart
DNS Hosteinträge
Je nach Anforderung können A-Einträge (Forward-Zone), PTR-Einträge (Reverse-Zone) und CNAME-Einträge (ALias) durch Generierung von ldif-Files nach folgendem Muster generiert werden: z.B.:
- Hostname: mailserver
- IP-Adresse: 192.168.178.200
- Forward Zone: test.lan
- Reverse Zone: 178.168.192.in-addr.arpa
- LDAP Basedn: dc=test,dc=lan
- A-Eintrag in Forward Zone:
dn: dlzHostName=mailserver,dlzZoneName=test.lan,ou=dns,dc=test,dc=lan objectclass: dlzHost dlzHostName: mailserver dn: dlzRecordID=1,dlzHostName=mailserver,dlzZoneName=test.lan,ou=dns,dc=test,dc=lan objectclass: dlzARecord dlzRecordID: 1 dlzHostName: mailserver dlzType: a dlzIPAddr: 192.168.178.200 dlzTTL: 86400
- PTR-Eintrag in Reverse Zone (Als Hostname dient in der Reverse Zone die letzte Stelle der IP-Adresse => 200 im Beispiel):
dn: dlzHostName=200,dlzZoneName=178.168.192.in-addr.arpa,ou=dns,dc=test,dc=lan objectclass: dlzHost dlzHostName: 200 dn: dlzRecordID=1,dlzHostName=200,dlzZoneName=178.168.192.in-addr.arpa,ou=dns,dc=test,dc=lan objectclass: dlzPTRRecord dlzRecordID: 1 dlzHostName: 200 dlzType: ptr dlzData: mailserver.test.lan. dlzTTL: 86400
- CNAME-Eintrag (Alias imap für den host mailserver):
dn: dlzHostName=imap,dlzZoneName=schile.lan,ou=dns,dc=test,dc=lan objectclass: dlzHost dlzHostName: imap dn: dlzRecordID=1,dlzHostName=imap,dlzZoneName=test.lan,ou=dns,dc=test,dc=lan objectclass: dlzCNameRecord dlzRecordID: 1 dlzHostName: imap dlzType: cname dlzData: mailserver dlzTTL: 86400
Je nach Bedarf können auch mehrere Einträge in einem ldif-File zusammengefasst werden und ins LDAP Directory übernommen werden.
Script um LDAP-DHCP/DNS Host Einträge zu generieren
Das manuelle hinzufügen der Einträge in's LDAP Directory mittels ldif-Files ist nicht nur mühsam, sondern auch fehleranfällig. Die DHCP-Einträge können zwar sehr komfortabel mittels LDAP-Account-Manager verwaltet werden, aber er enthält keine Templates, um die DNS-Einträge zu verwalten. Stattdessen müssen die DNS-Einträge mittels Tree-View bearbeitet werden. Aus diesen Gründen wurde ein Script erstellt, das diese Aufgabe automatisiert. Das Script ermittelt automatisch die LDAP-BaseDN mit Hilfe von /etc/ldap/ldap.conf, validiert IP-Adressen und MAC-Adressen bzgl. korrekter Formatierung und generiert ein ldif File, das ins LDAP eingebunden werden kann.
Scritp herunerladen:
cd /usr/local/src wget ftp://download:download@schiele.homelinux.org/debian/dhcp-dns_host2ldif.sh
Script ausführbar machen:
chmod +x dhcp-dns_host2ldif.sh
Benutzung:
- Hilfe
dhcp-dns_host2ldif.sh -h für Hilfe:
- Ausgabe sieht folgendermaßen aus:
usage: /usr/local/bin/dhcp-dns_host2ldif.sh [OPTION] OPTION optional parameter: -h, --help Prints this help -m, --mac [MAC] MAC Adress -i, --ip [IP] IP-Adress -z, --zone[ZONE] Zone Name -H, --host [HOST] Host Name -a, --alias [ALIAS] Alias for Host -d, --dhcp Add DHCP Entry -f, --forward Add Forward DNS Entry -r, --reverse Add Reverse DNS Entry -t, --ttl DNS TTL (Default=86400) EXAMPLE: /usr/local/bin/dhcp-dns_host2ldif.sh -i 192.168.178.200 -m 00:23:54:c1:e7:76 -z test.lan -H mailserver -d -f -r
- angenommene Daten:
- Host: mailserver
- Alias: imap
- MAC-Adresse: 00:23:54:c1:e7:76
- IP-Adresse: 192.168.178.200
- Zone: test.lan
- DHCP-Host:
dhcp-dns_host2ldif.sh -m 00:23:54:c1:e7:76 -i 192.168.178.200 -H mailserver -d
- DNS-Forward Eintrag:
dhcp-dns_host2ldif.sh -i 192.168.0.200 -H mailserver -z test.lan -f
- DNS-Reverse Eintrag:
dhcp-dns_host2ldif.sh -i 192.168.0.200 -H mailserver -z test.lan -r
- DNS Alias:
dhcp-dns_host2ldif.sh -a imap -H mailserver -D test.lan
- DHCP, Forward und Reverse Eintrag kombiniert:
dhcp-dns_host2ldif.sh -m 00:23:54:c1:e7:76 -i 192.168.178.200 -H mailserver -z test.lan -d -f -r