ISC-DHCP
Innhold
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 DHCP-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. Konfigurasjonsfilene 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. Database- og loggfilene kan vises med en editor eller med noe som less, more, most, cat, tail eller tilsvarende.
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 fra originalfila 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; } # Alternativt kan man, med tanke på brukere på Bitraf, bruke ei større # nettmaske. Dette vil gjøre at færre får de fine 13.37-adressene, men likevel # kunne hjelpe flere på nett. # subnet 10.13.36.0 netmask 255.255.252.0 { # range 10.13.36.2 10.13.37.255; # range 10.13.37.50 10.13.37.240; # range 10.13.38.1 10.13.39.254; # option routers 10.13.37.1; # } # 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, blockinfile 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.
- hosts: dhcp_server strategy: free remote_user: root 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.