Sziasztok!
Egy (beismerem kissé kusza) DHCP/DHCP-RELAY egyveleg szivat, ebben kéne egy kis segítség vagy infó.
Ez egy főiskola hálózata, ahol van két Windows AP fa, és egy jópár vlan. A Windows domain-ben lévő gépek DHCP szervere a megfelelő Windows szerver. Ahol nem kapcsolódnak közvetlenül a kliensek, ott (általában) egy ProCurve 5406zl switch továbbítja a DHCP kéréseket, és a switch a router is.
Néhány VLAN-ban ahol a gépek nincsennek a domain-ben, ott a DHCP szerver (és a defaulr router/tőzfal-is) egy ubuntu szerver (8.04). Van egy VLAN (ez keverte meg a dolgokat), ahol a gépek Windows kliensek, beléptetve a domain-ba, de ezek egyébb okok miatt az Ubuntu tűzfal mögött vannak. Ennek néhány következméne:
Mivel ebben a VLAN-ban az 5406zl-nek nincs IP címe (nem ő rout-ol) nem lehet ő a DHCP-RELAY sem.
Egyébb okokból a tűzfal nem kapcsolódik ahhoz a VLAN-hoz amiben a DHCP SZERVER van:
(kliens gépek, VLAN3038)---[tűzfal ubuntu]---(VLAN3001)---[router 5406zl]---( DHCP szerver, VLAN3016 ).
A VLAN3001-ben is van ugye egy DHCP szerver, de az egy másik domain.
A felállás tulajdonképpen működik, csak van egy szépséghibája. A tűzfalon futó dhcp-relay szerver hallgatózik a vlan3038, és vlan3001-es interfészen is, ezért ha a vlan3001-ből jön egy DHCP kérés, akkor azt is továbbítja a vlan3016-ban lévő DHCP szerver felé, amit a DHCP szerver eldobb, mert a 3001-es vlan nem rá tartozik.
Úgy gondoltam, hogy ezt a kis szépséghibát tűzfal szabályokkal megszüntetem. Megírtam a tűzfalszabályokat, és nem működnek, csak annyi derült ki számomra, hogy valamit NAGYON NEM ÉRTEK.
A jelenség:
A tűzfal szabályok (input oldal, számlálókat töröltem, hogy ne legyenek tú hosszú sorok):
Chain INPUT (policy DROP 0 packets, 0 bytes)
target prot opt in out source destination
ACCEPT all -- lo any anywhere anywhere
internetioi all -- eth1 any anywhere anywhere
ACCEPT icmp -- any any anywhere anywhere
tunioi all -- tun+ any anywhere anywhere
dhcpdioi udp -- any any anywhere anywhere udp spts:bootps:bootpc dpts:bootps:bootpc
...
Az INPUT láncban (az eth1-az internet felé néz) a DHCP-vel kapcsolatba hozható csomagok mennek a dhcpdioi láncra:
Chain dhcpdioi (1 references)
target prot opt in out source destination
ACCEPT udp -- eth0 any anywhere anywhere udp spt:bootpc dpt:bootps
ACCEPT udp -- vlan3059 any anywhere anywhere udp spt:bootpc dpt:bootps
ACCEPT udp -- vlan3060 any anywhere anywhere udp spt:bootpc dpt:bootps
ACCEPT udp -- vlan3038 any anywhere anywhere udp spt:bootpc dpt:bootps
ACCEPT udp -- vlan3001 any anywhere anywhere udp spt:bootps dpt:bootps
LOG all -- any any anywhere anywhere LOG level warning prefix `DROP_DHCPi'
DROP all -- any any anywhere anywhere
Az eth0, vlan3059, vlan3060, vlan3038 -on fogadom a DHCP kéréseket a kliens felöl, a vlan3001-en fogadom a választ a DHCP szerver felől, minden mást loggolok, és eldobok. Ez alapján eldobom (el kellene dobni) a vlan3001-ből jövö DHCP kéréseket is.
Ehez képest a tcpdump eredménye, ha egy DHCP kérés érkezik a vlan3001-ből:
08:29:27.015699 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:0c:f1:e4:c9:70, length 300
08:29:27.016106 IP 172.20.1.253.67 > 255.255.255.255.68: BOOTP/DHCP, Reply, length 300
08:29:27.018611 IP 172.20.1.3.67 > 172.20.16.254.67: BOOTP/DHCP, Request from 00:0c:f1:e4:c9:70, length 300
A kliens kérésére (1.blokk) megjön a válasz az ottani dhcp szervertől (172.20.1.253), majd a harmadik blokkban látszik, hogy a dhcp-relay is továbbítja a kérést az általa ismert DHCP szervernek. Ha az első blokk el vagyon dobva, akkor mit keres a dump-ban, és miért válaszol rá bárki. A dhcpdioi láncban látszik is a találat az utolsó két szabályra, és ez a kernel log-ban is látszik:
Mar 20 08:51:33 mano kernel: [169919.075936] DROP_DHCPiIN=vlan3001 OUT= MAC=ff:ff:ff:ff:ff:ff:00:0c:f1:e4:c9:70:08:00 SRC=0.0.0.0 DST=255.255.255.255 LEN=328 TOS=0x10 PREC=0x00 TTL=16 ID=0 PROTO=UDP SPT=68 DPT=67 LEN=308
Bár ez a kis anomália nem okoz a kliensek szempontjából problémát, de engem nagyon elbizonytalanított.
Valaki homályosítson fel, mi a fene történik itt.
- 2417 megtekintés
Hozzászólások
A VLAN-ok Layer 2 szinten vannak: ebtables-el tudod kiszűrni, hogy a DHCP az adott VLAN-ba maradjon. Az iptables egy réteggel följebb van, ezért hatástalan.
- A hozzászóláshoz be kell jelentkezni
Bevallom őszíntén én a válaszodat nem nagyon értem.
Nekem eddig úgy tűnt, és úgy gondoltam hogy ezt a részt értem is, hogy a DHCP mindíg az adot VLAN-ban marad, ezért kell a DHCP-RELAY, hogy az egyik VLAN-bol áttegye a kérést a másikba.
Eddig én úgy gondoltam, az hogy jelenleg VLAN-ok vannak, az csak annyit jelent, a jelenlegi probléma szempontjából, hogy a különbözö szegmensekhez (amik most VLAN-ok) nem kellenek fizikailag különböző switch-ek és interfészek. Az eth0-hoz rendelt vlan3001 és vlan3038 interfészek az iptables-ben logikai szemponból egyedi interfészek.
Rosszul tudom ?
- A hozzászóláshoz be kell jelentkezni
A dhcp-relay-el az egyik VLAN DHCP forgalma belekeveredik a másikéba, nem ez a probléma?
Az iptables számára IP szinten a vlan3001 és vlan3038 egyedi interfészek, persze. De a DHCP Layer 2 szinten van és a dhcp-relay már az előtt elkapta a csomagot, hogy az iptables láthatta és kiszűrhette volna.
- A hozzászóláshoz be kell jelentkezni
Nem áll szándékomban vitatkozni, de itt most az lenne a cél, hogy én is értsem, bár ez jelentősen megnehezíti a feladatot :). Javíts ki ha tévedek, de a DHCP az UDP csomagokkal kommunikál, számomra ebből nem következik, hogy Layer 2 lenne.
Amúgy logikusan hangzik, hogy a dhcp-relay még a iptables elött megkapj a csomagot.
Egy kicsit gugliztam is, többen állítják, hogy a DHCP layer 2, és többen azt is hogy nem, már ahol ez szóbakerül (csak a magyar nyelvűeket néztem egyenlőre).
- A hozzászóláshoz be kell jelentkezni
kadlec kollégával nem mernék iptables terén vitába szállni! :-)
Nézegetem a hálózatod leírását de sehogysem értem, hogy egy kliensnek miért kell 3 vlanon keresztülmennie mire eljut a dhcp-ig? Ez szerintem 1 db vlannal is menne, bár a windows vlan kezelését nem ismerem...
- A hozzászóláshoz be kell jelentkezni
Alapvető tévedésben éltek, én nem vontam kétségbe egyetlen állítást sem, meg szerettem volna érteni a dolgot, amiben néhány (vélt) ellentmondás megakadályozott, és amiről eddig a válaszokban nem sok szó esett.
Végeztem néhány tesztett, és ebbő arra a következtetésre jutottam, hogy a dhcpd és a dhcp-relay az iptables-től függetlenül működik, de azt továbbra sem értem, hogy miért.
Azt, hogy nincs a kliensnek IP címe, azt elvi kérdésnek tartom, elvei embereknek vannak, programoknak nincs ojanjuk. A DHCP protokol általam olvasott "népszerű tudományos" leírásai arra utalnak, hogy az IP cím hiányát azzal hidalják át, hogy broadcast csomagokat küldenek, layer-ekről pedig nem esik szó. Persze születhetett olyan döntés, hogy elvi okokból a DHCP-t layer2-ként kell kezeli, de ezzel engem jól megkavartak (ez persze nem szempont, csak nekem kellemetlen). És kezelhetik a DHCP-t layer2 ként olyan okból is amit én nem ismerek, és amiről eddig nem volt szó.
Ha lerövidítem a DHCP kérés útját, akkor egyébb helyen és egyébb szempontból ütközöm olyan problémába, amit jelenleg nem tudok orvosolni, és amivel nem akartam terhelni senkit. Induljunk ki abból, hogy oka van.
- A hozzászóláshoz be kell jelentkezni
OK, de számomra rejtély, hogy a 5406zl egyik oldalán vlan3001 van másik oldalán meg vlan3016. Legalább az egyik felesleges.
Anélkül, hogy ismerném a hálózatod én így csinálnám ill. részben csinálom is:
- alapfeltétel, minden eszköz vlan képes
- 5406zl-ben a kliensek felé untagged módban a vlan3001 néz.
- 5406zl-ben a dhcp szerver felé tagged módban a vlan3001 néz.
- a dhcp szerverben van vlan3001 megfelelő ip címmel, kiosztható tartománnyal stb.
- az ubuntu tűzfalat a 5406zl egy üres portjára rádugnám, belelógatnám a vlan3001-be meg valami másik vlanba és aztmondanám, hogy mostantól a klienseknek ez az átjárójuk. Tűzfalconfig, routing config. Késsz. (a 5406zl-nek nem is kell ip-nek lennie a vlan3001-ben)
De mégszer mondom, kívülrűl könnyű okosnak lenni, nehéz átlátni.
Mik
- A hozzászóláshoz be kell jelentkezni
A hálózatban van 2db Windows AD fa, az egyikhez tartozik a vlan3001, a másikhoz a 3016, a hálózat egy része független a windows rendszertől. A routing-ot azon vlan-ok között, ahol nem létszükséglet a tűzfal, ott az 5406zl végzi, mert nincs olyan linux vasam, amelyik birná a forgalmat (végpontok száma 1000 felett, kb 30 kiszolgáló, 3 tűzfal, kb. 60 vlan).
Három lehetőségem van:
Az ominózus linux tűzfal a 3016-ra csatlakozik, más szempontok alapján viszont jobb a 3001-es vlan.
A tűzfal a 3001 és 3016-ra is csatlakozik, ekkor a routing lessz egy kicsit áttekinthetetlen a redundáns utak miatt.
Két tűzfalat használok, de kétlem, hogy ettől egyszerűbb lenne az életem. És a "fűtőtestek" száma már így elég nagy.
Biztos lehet javítani a logikai topológián, de nem hiszem, hogy ennek megtérgyalása/kitalálása ide tartozik. Persze ha sok a szabadidőd, szivesen megmutatom a rendszert, és tanácsokat is szivesen fogadok :).
- A hozzászóláshoz be kell jelentkezni
Egy ekkora hálózat megérdemelne egy Cisco 6500-at... TIOP-ból mondjuk. Hasonló hálózatunk van, de kb. fele a tiednek. Melyik egyetem/fősuli? Szívesen eldiskurálok a hálózatodról, de azt nem garantálom, hogy tudok segíteni :-)
- A hozzászóláshoz be kell jelentkezni
Alapvetően az a problémám, hogy a DHCP arról szól, hogy a gép elkéri a DHCP szervertől, hogy milyen beállításokkal is fusson. Addíg, amíg nincs értékelhető válasz, addíg a gépnek nincs IP címe.
Innen kezdve mit akarunk szűrni iptables beállításokkal? Az csak IP alapú forgalom szűrésére/manipulálására szolgál.
Tehát vagy ahogy fentebb is írták: ebtables, vagy a dhcp-relay-t úgy belőni, hogy csak az egyik szegmensből a másikba dolgozik, nem pedig bárhonnan tol tovább.
- A hozzászóláshoz be kell jelentkezni
A DHCP csomagokban van IP cím: 0.0.0.0 vagy 255.255.255.255, ha az IP cím még nem ismert (látszik a dump-ban is, és eljut a csomagszűrőhöz is ld. log, de el mégsem dobja).
A DHCP protokol UDP alapú (az UDP meg IP alapú), van portja is, ez alapján pedig layer 4.
Guglin a "dhcp layer"-re rákeresve az összes dukumentáció szerű iromány a DHCP-t layer 3-as protokolként pozicionálja. Néhány forumon pedig layer 2-nek gondolják, mivel az ip cím ismeretlen.
Én a fentiekben több ellentmondást is vélek felfedezni, ez pedig erősen akadályoz a megvilágosodásban.
Ha ismételten kinyilatkozzuk, hogy a DHCP az layer 2, az megmagyarázza az iptables fura működését (a megfigyeléssel nem ellentétes), de nem oldja fel az ellentmondásokat, és nem visz előrébb a probléma megértésében.
A dhcp-relay-t szivesen beállítanám, ahogy mondtad, de eddigi tudásom szerint nem lehet. Ha Te tudsz rá módszert ne kímélj.
- A hozzászóláshoz be kell jelentkezni
Az, hogy a DHCP protokollt UDP-ben, IP fölött valósították meg, szerintem pusztán azért van, mert (nagyon helyesen) a Layer 2 rétegtől akarták függetleníteni: lehessen használni Etherneten, PPP-n, WLAN-on, bármin, ami IP továbbítására képes.
De ez nem jelenti azt (megint csak szerintem), hogy ténylegesen nem Layer 2 szinten működő protokoll: a DHCP "kliensnek" még nincs IP címe, tehát IP szinten csomagot sem tud fogadni. Kénytelen a link rétegben elfogadni és kezelni a megfelelő formátumú csomagot. Ez már onnan is látszik, hogy a dhcp szerver/kliens raw socketet nyit és nem INET socketet (ahogy az IP/UDP-ből következne). És ezért - amit a tapasztalataid is megerősítenek - az iptables nem tud hatással lenni a DHCP-re. Talán segít még, ha megnézed a http://jengelh.medozas.de/images/nf-packet-flow.png rajzot: a DHCP a kék színű rétegben zajlik, míg az iptables a zöld rétegben.
- A hozzászóláshoz be kell jelentkezni
Jó, akkor ezt a megértés témát most feladom.
Egy kérdésem viszont lenne:
Milyen iptables szabályok kellenek a DHCP-hez. El kell/lehet dobni a csomagokat?
Eddig mindig beírtam a szabályok közé a DHCP forgalom engedélyezését, próbaképpen kikommenteztem, és a log tele van azzal, hogy dobálja a csomagokat, de eddig nem látszik más hatás.
- A hozzászóláshoz be kell jelentkezni