ISC-DHCP

Fra Bitraf
Revisjon per 8. jun. 2022 kl. 14:17 av Royk (diskusjon | bidrag) (Ansible)
Hopp til navigering Hopp til søk
Uferdig dokumentasjon
Dette oppdateres jevnlig (2022-06-08) - det er ikke ferdig. Denne er nok ganske ferdig nå.

Innledning

ISC DHCP er en utbredt DHCP-server utvikla på Unix/Linux. Denne kommer ferdigpakka i de fleste linux-distroer og BSD-varianter. Den ligger også i Homebrew for mac. For Windows, er DHCP-serevren som kommer med Windows Server ei bedre løsning.

Merk at dette ikke er relatert til enheters DHP-klient eller hvilket operativsystem som denne kjører på. En dhcp-server deler like godt ut IP-adresser til en klient på Linux, HP/UX eller Android, som den gjør til ei maskin med Windows 11, macOS eller MS/DOS.

Dokumentasjonen under legger til grunn at du er pålogga som en bruker med administratorrettigheter og enten legger til en "sudo" foran hver kommando som redigerer ei fil eller starter om en prosess eller tilsvarende, eller går inn med sudo -i eller tilsvarende for å få et aktivt root-skall.

Filer

Oppsettet beskrevet her er for Debian og relaterte distroer. For RHEL og varianter, samt SuSE eller BSD, vil oppsettet være noe forskjellig. Hovedprinsippene og programvaren er imidlertid de samme. Filene som nevnes her, er vanlige tekstfiler og redigeres fra Linux-kommandolinja med en editor som nano, vim, emacs, jed, pico, ed eller noe annet og enda mer obskrurt.

Filnavn Beskrivelse Type
/etc/default/isc-dhcp-server Parametre for å starte selve prosessen, dhcpd Konfig
/etc/rsyslog.d/30-dhcpd.conf Oppsett av logging av dhcp-greier til egen fil Konfig
/etc/dhcp/dhcpd.conf Konfigurasjon av DHCP-serveren med detaljer av hva som skal deles ut Konfig
/var/lib/dhcp/dhcpd.leases "Database" for allokerte IP-adresser med tilhørende data Data
/var/log/dhcp.log Logg Data

Videre følger konfigurasjonsfilene hver for seg med dokumentasjon sydd inn som kommentarer i filene. Ubrukte eller irrelevante linjer er fjerna.

/etc/default/isc-dhcp-server

# Vi lytter bare på enp7s0 for IPv4. IPv6 håndeteres av Neighbour Discovery (ND)
# og Router Advertisement (RA).
INTERFACESv4="enp7s0"
INTERFACESv6=""

Merk at navnet på grensesnittet over, må settes til det som bruker på den faktiske maskina. Dette er fra det jeg hadde i lab.

/etc/rsyslog.d/30-dhcpd.conf

# Logg alt av local3 (normalt bare isc-dhcp) til egen fil
# Bindestrek foran filnavnet betyr async, dvs at alle skrivinger bufres i
# motsetning til å skrive dem rett til disk (sync). Async avlaster systemet
# vesentlig når det ikke er påkrevet at dataene skal rett til disk i
# sanntid.
# & stop betyr "ikke logg dette til noen annen fil"

local3.*        -/var/log/dhcpd.log
& stop

/etc/dhcp/dhcpd.conf

# vim:ts=4:sw=4:sts=4:et:ai:tw=80
#
# dhcpd.conf
#
# Eksempelkonfig for DHCP-server på Bitraf
#
# Merk at alt dette er for IPv4 og ikke relevant for IPv6.
#

# Domenenavn - sendes ut og settes på klientene
option domain-name "bitraf.no";

# Domenesøk - sånn at hvis noen prøver "ping p2k16", så slår pc-en
# automatisk opp p2k16.bitraf.no.
option domain-search "bitraf.no";

# DNS-server(e)
option domain-name-servers 1.1.1.1, 1.0.0.1;

# 1 time normal leietid, 4 timers maks leietid
default-lease-time 3600;
max-lease-time 14400;

# Ikke noe dyndns
ddns-update-style none;

# Vi er DHCP-sjef på dette nettet!
authoritative;

# Logg til local3, slik at loggene sendes til egen fil (se oppsett av rsyslogd
# over)
log-facility local3;

# Dette er nettet der vi skal dele ut adresser. Her kan vi også overstyre de
# globale versiene satt over for DNS-servere, domenenavn etc. Dette er
# kommentert ut under, siden vi ikke trenger det slike konfigfila er skrevet nå.
# For å se hva som ellers kan deles ut av parametre på DCHP, se man dhcp-options
subnet 10.13.37.0 netmask 255.255.255.0 {
    range 10.13.37.50 10.13.37.240;
    option routers 10.13.37.1;
#   option domain-name-servers one.one.one.one.
#   option domain-name "bitraf.no";
#   option domain-search "bitraf.no";
#   option routers 10.13.37.1;
#   option broadcast-address 10.13.37.255;
#   option ntp-servers 158.36.0.91, 129.240.2.6;
#   default-lease-time 600;
#   max-lease-time 7200;
}

# Her lister vi opp klienter med statiske adresser. De navngis og angis med
# MAC-adresse (hardware ethernet) og IPv4-adresse (fixed-address). Disse kan
# være definert innafor eller utafor 'range' satt i subnettet, men husk at hvis
# man tildeler noe innafor, kan det være en klient som har denne adressa
# allerede, kan det medføre IP-konflikt.

# Maskin dhcp-client01, plassert utafor 'range' over.
host dhcp-client01 {
    hardware ethernet    52:54:00:68:37:02;
    fixed-address        10.13.37.45;
}

# Maskin dhcp-client02, plassert innafor 'range' over.
host dhcp-client02 {
    hardware ethernet    52:54:00:68:37:01;
    fixed-address        10.13.37.55;
}

/var/lib/dhcp/dhcpd.leases

DHCP-database for DHCP-serveren i tekstformat. Denne kan lett brukes for å sjekke hvilke MAC-adresser som er tilordna hvilke IP-adresser.

/var/log/dhcp.log

Prosesslog fra dhcpd-prosessen. Hovedsystemloggen, /var/log/syslog blir brukt av systemd sammen med journald for å logge oppstarten av dhcpd, mens denne brukes for info om hvilke maskiner som får hvilke adresser og tilsvarende ting.

Ansible

Utrulling av konfigurasjonen over med Ansible kan gjøres på flere måter, med alt fra lineinfile, linesinfile eller tilsvarende for å redigere filene til å bare kopiere inn nye konfigfiler når de er endra i adminrepoet. Siden vi her antar at Ansible skal være autoritativ og filene ikke skal endres direkte, er nok det beste å bare kopiere ut filene for så å ta en omstart av de relaterte prosessene.

Det er som kjent flere måter å flå en katt, men her er ei enkel playbook for ansible for å gjøre jobben. Filene som skal kopieres ut, er lagret under files/dhcp/ under arbeidskatalogen til Ansible.

  tasks:
  - name: Installere ISC DHCP-server
    ansible.builtin.apt:
      update_cache: yes
      name: isc-dhcp-server
      state: latest
  - name: Kopiere inn /etc/default/isc-dhcp-server
    ansible.builtin.copy:
      src: files/dhcp/isc-dhcp-server
      dest: /etc/default/isc-dhcp-server
      owner: root
      group: root
      mode: 0644
    notify:
    - restart isc-dhcp-server
  - name: Kopiere inn /etc/rsyslog.d/30-dhcpd.conf
    ansible.buil in.copy:
      src: files/dhcp/30-dhcpd.conf
      dest: /etc/rsyslog.d/30-dhcpd.conf
      owner: root
      group: root
      mode: 0644
    notify:
    - restart rsyslog
  - name: Kopiere inn /etc/dhcp/dhcpd.conf
    ansible.buil in.copy:
      src: files/dhcp/dhcpd.conf
      dest: /etc/dhcp/dhcpd.conf
      owner: root
      group: root
      mode: 0644
    notify:
    - restart isc-dhcp-server

  handlers:
    - name: restart isc-dhcp-server
      ansible.builtin.systemd:
        daemon_reload: yes
        name: isc-dhcp-server
        state: restarted
    - name: restart rsyslog
      ansible.builtin.systemd:
        daemon_reload: yes
        name: rsyslog
        state: restarted

Tjenestesjekk

Etter at Ansible er ferdig, burde det i prinsippet fungere. Hvis det er en skrivefeil i ei konfigfil og omstart av prosessen mislykkes, burde Ansible melde ifra om dette. Uansett - det kan være en fordel å sjekke manuelt. Dette gjøres på samme måte som andre systemprosesser. Under er kommandoene angitt direkte, uten sudo, men sleng på en hvis du er en vanlig bruker.

Sjekk DHCP-serveren

root@dhcp-server:~# systemctl status rsyslog.service
● rsyslog.service - System Logging Service
     Loaded: loaded (/lib/systemd/system/rsyslog.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2022-06-08 14:03:38 CEST; 17s ago
TriggeredBy: ● syslog.socket
       Docs: man:rsyslogd(8)
             man:rsyslog.conf(5)
             https://www.rsyslog.com/doc/
   Main PID: 500 (rsyslogd)
      Tasks: 4 (limit: 525)
     Memory: 2.8M
        CPU: 16ms
     CGroup: /system.slice/rsyslog.service
             └─500 /usr/sbin/rsyslogd -n -iNONE

Hvis denne ikke viser loaded/active, sjekk loggene. Normalt vil oppstarten av prosessen logges til /var/log/syslog og alt av prosessrelaterte greier logges til /var/log/dhcpd.log, som konfigurert over. Tilsvarende sjekk gjøres for rsyslog med systemctl status rsyslog.service.

Oppsummering

Oppsettet er skrevet og testet i et testmiljø på kvm/libvirt av Roy Sigurd Karlsbakk for Bitraf og er ikke underlagt noen som helst lisens, dvs, kanskje BSD eller Apache eller noe, da, for å ha noe, men alt er åpent og fritt.