DHCP

A HupWiki-ből...

A rövidítés a Dynamic Host Configuration Protocolból ered. A DHCP egy kliens-szerver protokoll. A protokoll lehetővé teszi a hálózaton levő számítógépek számára, hogy a DHCP szervertől (vagy szerverektől) kérjenek és kapjanak meg minden olyan szükséges hálózati beállítást, amely az adott hálózaton való biztonságos működéshez szükséges.

A DHCP protokolt a Dynamic Host Configuration Working Group hozta létre (Internet Engineering Task Force (IETF) - egy önkéntes csoport, amely feladatának érzi, hogy az internet működéséhez szükséges protokollokat dolgozzon ki).

A DHCP alkalmazásának több előnye is van. Az egyik, hogy nem szükséges a rendszergazdának minden egyes gépen egyenként kézzel elvégeznie a szükséges hálózati beállításokat. A másik nagy előnye az, hogy egy jól beállított DHCP szerver megkönnyíti a rendszergazda IP címekkel kapcsolatos adminisztrációját. A kiosztott, de bizonyos beállított időn belül fel nem használt IP címek bejegyzései törlésre kerülnek, és azok másik gépek számára kioszthatóak.


Milyen adatokat szolgáltathat a DHCP szerver?

  • IP címet,
  • alapértelmezett átjárót
  • DNS szerver IP címeket
  • stb.


Mire jó a DHCP?

Ha olyan hálózatot üzemeltetünk, amelyben több gép van annál, mint amennyit az ujjainkon meg tudunk számolni, érdemes az IP-címek és az alapvető hálózati konfiguráció beállításának hosszadalmas feladatát az erre kitalált protokollokra bízni. Egy hálózati kliens többféle módon is hozzájuthat a TCP/IP hálózatokban a kommunikációhoz nélkülözhetetlen IP-címhez, például RARP vagy a DHCP elődjének számító BOOTP segítségével is, e cikkünkben azonban a legnépszerűbb megoldást, a DHCP-t fogjuk közelebbről megvizsgálni, és utánajárunk, hogyan állíthatunk föl Linux alatt DHCP-szervert.

A DHCP az egyéb protokollelnevezésekhez hasonlóan mozaikszó, jelentése: Dinamikus Állomáskonfiguráló Protokoll (Dynamic Host Configuration Protocol). Ebből esetleg már az is kiderülhet számunkra, hogy DHCP-n keresztül a hálózati állomások nemcsak az IP, hanem egyéb protokollokkal kapcsolatos információkat is megkaphatnak.

A DHCP kliens-szerver modell alapján működik, egy hálózatban csak egy DHCP-szerverre van szükség, míg a hálózat többi gépe DHCP-kliens lesz, vagy legalábbis az lehet. Mivel a rendszer működése nem igényel olyan összeköttetés-alapú kapcsolatokat, mint amilyeneket a TCP biztosít, a DHCP rendszerek az UDP szállítási rétegbeli protokollon keresztül kommunikálnak. Hogyan is működik egy ilyen rendszer?

A protokoll üzemeltetésének alapja a jól beállított DHCP-szerver. A szerver ismeri a saját hálózatát, előre beállított IP-címmel rendelkezik, tudja, hogy mi a hálózati maszk az adott hálózatban, ismeri az alapértelmezett átjáró címét, és persze azért sem kell a szomszédba mennie, hogy kiderítse, hol is van a hálózatot kiszolgáló DNS-szerver; ezen túl ismeri azt a címtartományt is, amit szétoszthat az igénylők között. Általában ennyi már elég a szerver működtetéséhez. Amennyiben a hálózat nem csatlakozik egyéb hálózatokhoz, internethez, a DNS-szerver és az alapértelmezett átjáró elhagyható.

A szerver feladata, hogy ezeket az információkat úgy juttassa el a DHCP-kliensekhez, hogy közben arra is ügyel, hogy a kiosztható címekből senkinek se utaljon ki már használatban lévő IP-címet. A TCP/IP-támogatással rendelkező modern operációs rendszerek mindenféle felhasználói közbeavatkozás nélkül, alapértelmezésben a telepítés utáni első indítás során, képesek hálózati beállításaikat a DHCP-szerverről lekérni, és később minden egyes rendszerindításkor, illetve a bérlet lejártakor ezt az információt újra és újra megerősíteni, így megkímélik a felhasználót a TCP/IP konfigurálásától.

A bérlet azt az időintervallumot jelenti, amíg egy DHCP-kliens használhat egy szerver által kiosztott IP-címet. Ha a bérleti idő lejár, a kliensnek újból el kell kérnie a a címet a szervertől. A szerver ekkor általában ugyanazt a címet ismét odaadja a kliensnek egy újabb bérletnyi ideig.


Hogyan működik?

A DHCP-forgalom a 67-es és a 68-as UDP portokon zajlik, a kliensek a 67-es portra küldik az üzeneteiket, a szerver pedig a 68-as portra kézbesíti a válaszokat, amelyek szórt üzenetek, vagyis a hálózat minden állomása megkapja őket. A konfiguráció lekérdezését a kliens kezdeményezi egy DHCPDISCOVER (DHCP-felfedezés) üzenettel. Mivel a kliens ekkor még nem rendelkezik hálózati rétegbeli címmel, a DHCP üzenetekben van egy xid nevű mező, ez szolgál a gépek megkülönböztetésére a DHCP-kommunikáció alatt.

Kliens (UDP 68):::::::::::::::::::::::::::::::Szerver (UDP 67)


DHCPDISCOVER >-----------------------------> 
             <_____________________________< DHCPOFFER
DHCPREQUEST  ------------------------------> 
             <_____________________________< DHCPACK
BOUND

A szerver a feltérképezésre használt DHCPDISCOVER üzenetre a DHCPOFFER (DHCP-ajánlat) üzenettel válaszol, megintcsak üzenetszórással. A kliens csak a saját xid-jével ellátott DHCPOFFER választ dolgozza fel. Az ajánlat nem más, mint a szerver által felkínált IP-cím, amit az ajánlattétel után a kliens még nem használhat azonnal, előtte el kell kérnie. A folyamat következő lépcsője tehát a DHCPREQUEST (DHCP-kérés), amelyben a felajánlott címet a kliens elkéri a szervertől, erre a nagyvonalú szerver megküldi a DHCPACK-et (DHCP-nyugta), ami minden fontos információt tartalmaz ahhoz, hogy a kliens a kézhezvétel után teljes értékű IP-állomásként működhessen. A DHCPACK kézhezvétele után a kliens kötött állapotba (BOUND) kerül, ez a bérleti idő lejártáig érvényben is marad. A folyamat annyira gyors, és olyan kis sávszélességet igényel, hogy az még a ma már elavultnak számító 10 Mb/s-os hálózatokban is szinte észrevehetetlen.

DHCP-nyomok a Linux rendszernaplóban (/var/log/messages):

dhcpd: DHCPDISCOVER from 00:40:f4:55:07:b2 via eth2
dhcpd: DHCPOFFER on 10.1.1.14 to 00:40:f4:55:07:b2 via eth2
dhcpd: DHCPREQUEST for 10.1.1.14 from 00:40:f4:55:07:b2 via eth2
dhcpd: DHCPACK on 10.1.1.14 to 00:40:f4:55:07:b2 via eth2

A Linux-disztribútorok a DHCP-vel kapcsolatos feladatokra általában az Internet Software Consortium (ISC) DHCP programjait használják, az ISCjegyzi egyébként a világ DNS-szervereinek túlnyomó többségén futó BIND programcsomagot is. A Linuxokban bevett gyakorlat, hogy külön csomagban kap helyet a DHCP-szerver (dhcp, dhcpd vagy dhcp-server néven) és a DHCP-kliens (dhcpcd, dhcp-client). A DHCP-szerver konfigurációját általában az /etc/dhcpd.conf állományban adhatjuk meg. Az egyszerű szöveges fájl alapvetően kétféle bejegyzést tartalmazhat: paramétereket és deklarációkat. A paraméterek tényleges információkat hordoznak, adatokat, amelyeket a klienseknek elküld a szerver, míg a deklarációk a hálózat topológiáját írják le.

A dhcpd.conf a globális paraméterekkel kezdődik. Az újabb ISC DHCP-szerverek (3.x) például igénylik a Dinamikus DNS szerverekkel való kommunikáció módjának megadását, ez legyen hát az első globális paraméterünk, még akkor is, ha hálózatban nincs DNS-szerver vagy az nem DDNS. A DDNS szerverekkel való kommunikációról a dhcpd.conf kézikönyvoldalában (man dhcpd.conf) hosszas leírást találhatunk, itt elég annyit megjegyeznünk, hogy ezt a paramétert "interim"-re kell állítanunk. Következő globális paraméterünk a már tárgyalt bérleti idő legyen, ezt másodpercben kell meghatároznunk. Eddig tehát így fest a készülő dhcpd.conf állomány:

ddns-update-style    interim;
default-lease-time   14400;
max-lease-time       14400;

A 14400 négy órát jelent, lehet ennél rövidebb és hosszabb is a bérlet, különösebb jelentősége nincs. A három paraméter után következzék egy deklaráció, adjuk meg, hogy milyen hálózathoz csatlakozik a szerver. A példánkban a 10.10.10.0 privát használatra fenntartott hálózatot fogjuk használni egy C osztályú hálózati maszkkal:

subnet 10.10.10.0 netmask 255.255.255.0 {
  ...
  ...
  ...
}

A kapcsos zárójelek közé ismét csak paraméterek kerülnek, ezek lesznek a legfontosabb beállítások. A range a dinamikusan kiosztható címteret adja meg a címtér első és utolsó elemével. Az option subnet-mask a hálózatban használt maszkot, a broadcast-address az üzenetszórási címet, a routers a hálózatot egyéb hálózatokhoz kötő forgalomirányítót (alapértelmezett átjáró), a domain-name a tartománynevet, a domain-name-servers pedig a DNS-szerver IP-címét definiálja. Ezeket az információkat a DHCP-lekérdezések során a kliensek természetesen megkapják.

subnet 10.10.10.0 netmask 255.255.255.0 {
  range           10.10.10.10 10.10.10.254;
  option subnet-mask          255.255.255.0;
  option broadcast-address    10.10.10.255;
  option routers              10.10.10.1;
  option domain-name          "tartomanynev";
  option domain-name-servers  10.10.10.2;
  option netbios-name-servers 10.10.10.4;
}

Ha több DNS-szerverünk is van a hálózatban, az option domain-name-servers után vesszővel elválasztva sorolhatjuk fel őket, pl.: "option domain-name-servers 10.10.10.2, 10.10.10.3;". A teljes konfigurációs állomány tehát egy egyszerűbb hálózat esetében így festhet:

ddns-update-style    interim;
default-lease-time   14400;
max-lease-time       14400;

subnet 10.10.10.0 netmask 255.255.255.0 {
  range           10.10.10.10 10.10.10.254;
  option subnet-mask          255.255.255.0;
  option broadcast-address    10.10.10.255;
  option routers              10.10.10.1;
  option domain-name          "tartomanynev";
  option domain-name-servers  10.10.10.2, 10.10.10.3;
  option netbios-name-servers 10.10.10.4;
}

Vagyis: a 10.10.10.0 hálózat 10-es címétől a 254-ig a DHCP-szerver fogja kiosztani a címeket, minden kliens megkapja a 10.10.10.1-es átjáró címét, valamint a 2-es és 3-as címen lévő DNS-szervereket. A bérletben lévő IP-kről a rendszer feljegyzéseket készít, ezeket a /var/lib/dhcp/dhcpd.leases fájlban találhatjuk meg. Már csak az a kérdés, hogy mi ez a netbios-name-servers? Amint azt korábban említettem, a DHCP-vel más protokollokat is beállíthatunk a klienseken, ez a paraméter szétküldi egy windowsos hálózatban a WINS-szerverünk (Windows Internet Name Service) IP-címét (ebben az esetben mondjuk a 10.10.10.4-es állomáson konfigurált Samba szerverét), így ezt sem kell kézzel beállítanunk a windowsos klienseken.

Két egyszerű tippet szeretnék még megosztani az olvasóval. Az első arra ad választ, hogy mi a teendő olyan esetekben, amikor a szerver egyszerre mondjuk három vagy négy hálózathoz is csatlakozik, azaz ennyi hálózati kártya van benne. Ilyenkor kicsit át kell szabnunk a dhcpd démont indító fájlt valahol az /etc/rc.d könyvtárszerkezetben. A szkriptben a démont indító parancs (pl.: /usr/sbin/dhcpd) után szóközökkel elválasztva fel kell sorolnunk azokat az interfészeket, amelyeken azt szeretnénk, hogy a DHCP-szerver figyeljen a kérésekre (pl.: /usr/sbin/dhcpd eth1 eth2). Ám ekkor még nem vagyunk készen, a dhcpd.conf fájlban az interfészeknek megfelelő subnet deklarációkat is létre kell hoznunk. Vagyis a konfigurációs fájlunk szerkezete a következőképp fog alakulni (a kettős kereszttel kezdődő sorok, ahogy az más esetekben is lenni szokott, kommentárok):

globális paraméterek;

# eth1
subnet 10.10.10.0 netmask 255.255.255.0 {
   egyéb paraméterek;
}

# eth2
subnet 10.30.30.0 netmask 255.255.255.0 {
   egyéb paraméterek;
}

A második tipp a DHCP dinamikus címkiosztási képességeinek előnyeit ötvözi a hagyományos statikus címbeállítási módszerrel. Megtehetjük ugyanis azt, hogy az egyes állomások hálózati kártyájának fizikai címéhez (MAC-cím) rendelünk IP-címeket. Ekkor a kliensek mindig ugyanazt az IP-címet fogják megkapni, így jobban nyomon követhető például a rendszernaplókban a felhasználók tevékenysége. Ehhez létre kell hoznunk a subnet deklaráción belül egy újabb, group deklarációt, majd abban az egyes állomásokat leíró host deklarációt. Figyeljünk arra, hogy a range által megadott címtérbe ne lógjanak bele az ilyen, MAC-címekhez kötött IP-címek. A példa, azt hiszem, beszédesebb minden egyéb magyarázatnál:

globális paraméterek;

subnet 10.10.10.0 netmask 255.255.255.0  {
  range 10.10.10.10 10.10.10.120;
  egyéb paraméterek;
  egyéb paraméterek;
  group
  {
      host gep_10_8 {
          fixed-address 10.10.10.8;
          hardware ethernet c0:4f:f4:55:06:7c;
      }
      host gep_10_9 {
          fixed-address 10.10.10.9;
          hardware ethernet c0:4f:f4:55:04:9f;
      }
  }
}

A MAC-címet windowsos kliens esetén az ipconfig /all paranccsal, Linux alatt pedig az ip link show paranccsal tudhatjuk meg, de ha már bejelentkeztünk a hálózatba az adott gépekről a group deklarációk megadása előtt is, akkor a MAC-címeket megtaláljuk összegyűjtve a szerveren is a dhcpd.leases fájlban.

A szoftver telepítésével kapcsolatban további hasznos információkat találhatunk az ISC DHCP weboldalán, a legfontosabb beállítások tekintetében eligazítást nyújthat a Red Hat Linux Customization Guide vonatkozó fejezete vagy a kissé már elavultnak számító DHCP mini HOWTO, illetve ennek magyar fordítása, a DHCP mini-HOGYAN. Magával a protokollal, a működési mechanizmussal a 2131-es RFC foglalkozik. E rövid útmutatóban csupán a szerver beállításait tárgyaltuk részletesebben. Mivel már hosszú évek óta alapértelmezett beállítás Windowson és Linuxon is a DHCP-használat, a kliensoldali konfigurációval aligha akadhat gondunk: a jó DHCP-klienst nem kell konfigurálni, épp ez a csipetnyi restség a lényege az egésznek.

Személyes eszközök