Forskjell mellom versjoner av «ISC-DHCP»

Fra Bitraf
Hopp til navigering Hopp til søk
(Med ansible-maler ("templates"))
 
(5 mellomliggende revisjoner av samme bruker vises ikke)
Linje 1: Linje 1:
{| class="wikitable" style="margin:auto"
 
! <s>Uferdig dokumentasjon</s>
 
|-
 
| <s>Dette oppdateres jevnlig (2022-06-08) - det er ikke ferdig.</s> Denne er nok ganske ferdig nå.
 
|}
 
 
 
== Innledning ==
 
== Innledning ==
  
Linje 124: Linje 118:
 
# nettmaske. Dette vil gjøre at færre får de fine 13.37-adressene, men likevel
 
# nettmaske. Dette vil gjøre at færre får de fine 13.37-adressene, men likevel
 
# kunne hjelpe flere på nett.
 
# kunne hjelpe flere på nett.
 +
# Husk i så fall å sette dette i /etc/network/interfaces eller tilsvarende
 +
# i nettverksoppsettet.
 +
#
 
# subnet 10.13.36.0 netmask 255.255.252.0 {
 
# subnet 10.13.36.0 netmask 255.255.252.0 {
#    range 10.13.36.2 10.13.37.255;
+
#    range 10.13.36.2 10.13.36.255;
 
#    range 10.13.37.50 10.13.37.240;
 
#    range 10.13.37.50 10.13.37.240;
 
#    range 10.13.38.1 10.13.39.254;
 
#    range 10.13.38.1 10.13.39.254;
Linje 182: Linje 179:
 
     - restart isc-dhcp-server
 
     - restart isc-dhcp-server
 
   - name: Kopiere inn /etc/rsyslog.d/30-dhcpd.conf
 
   - name: Kopiere inn /etc/rsyslog.d/30-dhcpd.conf
     ansible.buil in.copy:
+
     ansible.builin.copy:
 
       src: files/dhcp/30-dhcpd.conf
 
       src: files/dhcp/30-dhcpd.conf
 
       dest: /etc/rsyslog.d/30-dhcpd.conf
 
       dest: /etc/rsyslog.d/30-dhcpd.conf
Linje 191: Linje 188:
 
     - restart rsyslog
 
     - restart rsyslog
 
   - name: Kopiere inn /etc/dhcp/dhcpd.conf
 
   - name: Kopiere inn /etc/dhcp/dhcpd.conf
     ansible.buil in.copy:
+
     ansible.builin.copy:
 
       src: files/dhcp/dhcpd.conf
 
       src: files/dhcp/dhcpd.conf
 
       dest: /etc/dhcp/dhcpd.conf
 
       dest: /etc/dhcp/dhcpd.conf
Linje 211: Linje 208:
 
         name: rsyslog
 
         name: rsyslog
 
         state: restarted
 
         state: restarted
 +
</pre>
 +
 +
=== Med ansible-maler ("templates") ===
 +
 +
Som over, men i stedet for å bruke ansible.builtin.copy, bruker vi ansible.builtin.template. Her kopieres konfigfila til dhcpcd.conf til dhcpcd.j2 og innholdet beholdes, bortsett fra angivelsen av klienter. Dette angis i stedet med variabler
 +
 +
<pre>
 +
{% for lease in dhcp_leases %}
 +
host {{ lease.name }} {
 +
    hardware ethernet    {{ lease.mac }};
 +
    fixed-address        {{ lease.ip }};
 +
}
 +
 +
{% endfor %}
 +
</pre>
 +
 +
I Ansible-playbook endres copy-delen av dhcpcd.conf til å inneholde variabler for maskinene i DHCP. Legg disse til over '''tasks:''' med samme innrykk.
 +
 +
<pre>
 +
vars:
 +
  dhcp_leases:
 +
  - name: dhcp-client03
 +
    mac: 52:54:00:68:37:03
 +
    ip: 10.13.37.48
 +
  - name: dhcp-client04
 +
    mac: 52:54:00:68:37:04
 +
    ip: 10.13.37.123
 +
</pre>
 +
 +
Så endrer vi til '''ansible.builtin.template'''
 +
 +
<pre>
 +
  - name: Kopiere inn /etc/dhcp/dhcpd.conf
 +
    ansible.builtin.template:
 +
      src: files/dhcp/dhcpd.j2
 +
      dest: /etc/dhcp/dhcpd.conf
 +
      owner: root
 +
      group: root
 +
      mode: 0644
 +
    notify:
 +
    - restart isc-dhcp-server
 
</pre>
 
</pre>
  

Nåværende revisjon fra 9. jun. 2022 kl. 16:45

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.
# Husk i så fall å sette dette i /etc/network/interfaces eller tilsvarende
# i nettverksoppsettet.
#
# subnet 10.13.36.0 netmask 255.255.252.0 {
#     range 10.13.36.2 10.13.36.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.builin.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.builin.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

Med ansible-maler ("templates")

Som over, men i stedet for å bruke ansible.builtin.copy, bruker vi ansible.builtin.template. Her kopieres konfigfila til dhcpcd.conf til dhcpcd.j2 og innholdet beholdes, bortsett fra angivelsen av klienter. Dette angis i stedet med variabler

{% for lease in dhcp_leases %}
host {{ lease.name }} {
    hardware ethernet    {{ lease.mac }};
    fixed-address        {{ lease.ip }};
}

{% endfor %}

I Ansible-playbook endres copy-delen av dhcpcd.conf til å inneholde variabler for maskinene i DHCP. Legg disse til over tasks: med samme innrykk.

vars:
  dhcp_leases:
  - name: dhcp-client03
    mac: 52:54:00:68:37:03
    ip: 10.13.37.48
  - name: dhcp-client04
    mac: 52:54:00:68:37:04
    ip: 10.13.37.123

Så endrer vi til ansible.builtin.template

  - name: Kopiere inn /etc/dhcp/dhcpd.conf
    ansible.builtin.template:
      src: files/dhcp/dhcpd.j2
      dest: /etc/dhcp/dhcpd.conf
      owner: root
      group: root
      mode: 0644
    notify:
    - restart isc-dhcp-server

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.