ot Ivo Gelov(26-01-2008)

reiting (24)   [ dobre ]  [ zle ]

Printer Friendly Variant za otpechatvane

Survurut, koito administriram predostavia DNS i DHCP uslugi na potrebitelite. Razbira se, tova stava s pomoshtta na
BIND (NAMED) i DHCPD - kakto pri pochti vsichki Linux distributsii, te se klasika. BIND igrae roliata na keshirasht DNS
survur, za da namalia natovarvaneto kum dostavchika si - a sushto i obrabotva lokalnite zaiavki ot NetBIOS (WINS).
DHCPD ot edna strana predostavia udobstvo na potrebitelite, koito sa s laptop i chesto se mestiat ot mrezha v mrezha,
a ot druga osiguriava postoianno suotvetstvie mezhdu razdavanite IP adresi i poznatite mu MAC-adresi (kato pozvoliava
rabotata i na potrebiteli s nepoznat MAC-adres). Taka za nuzhdite na razlichni statistiki se osiguriava postoianstvo na
IP-adresite na potrebitelite.
Taka opisanata konfiguratsiia raboti bezproblemno, no poradi tekuchestvo i drugi prichini se nalaga vse po-chesto da
pravia promeni po nastroikite kakto na DHCPD, taka i na BIND - a puk taka i ne uspiah da podkaram DDNS (Dynamis DNS,
pri koito DHCPD informira BIND po RNDC protokol za novopoiavili se potrebiteli, taka che da budat dobaveni v DNS
listata). Porazrovih se iz GOOGLE i popadnah na 2 interesni neshta:

1. MyDNS (http://mydns.bboy.net/) - maluk DNS survur, napisan ot nulata, koito vmesto ot tekstov fail vzima DNS
zapisite si ot SQL baza danni (MySQL ili PostgreSQL). Ne e rekursiven - tova oznachava, che ako turseniiat zapis go
niama v bazata danni, niama da bude napraveno zapitvane do DNS survura na dostavchika, ili puk kum ROOT survurite,
a shte se vurne suobshtenie, che niama takuv adres. Taka che iavno prilozhenieto mu e samo za golemi organizatsii s goliam
broi lokalni adresi, koito chesto se promeniat. Vsushtnost, mozhe da se izpolzva v kombinatsiia s DNScache
(http://cr.yp.to/djbdns/dnscache.html) - tova e rekursiven keshirasht DNS klient, chast ot paketa "djbdns" (po-izvesten
kato TinyDNS) na profesor D. J. Bernstein (avtor na Qmail) - na adres http://cr.yp.to/djbdns.html
Struva si da bude razgledan, i veroiatno dori instaliran. Lichno na men tochno v tozi moment mi lipsva dostatuchno vreme,
no opredeleno bih posuvetval vsichki, koito imat seriozni interesi v mrezhovoto administrirane da poglednat tozi
proekt.

2. DNSmasq (http://www.thekelleys.org.uk/dnsmasq/do...) - mnogo apetitna kombinatsiia ot tipa 2-v-1 (DNS + DHCP).
Izpolzva se v niakoi firmueri (firmware) za spetsializirani (dedicated ili embedded) ruteri - naprimer v OpenWRT
(http://openwrt.org/). Tova e keshirasht rekursiven (po-skoro termina e forwarder, zashtoto preprashta zaiavkite kum
DNS survura na dostavchika, a ne direktno kum ROOT DNS survurite) DNS survur s modul za DHCP/BOOTP - tiasno integrirani
edin s drug.

Reshih da si napravia "upgrade" - da premina ot BIND + DHCPD kum DNSmasq. Hem po-maluk i po-burz survur, hem DDNS shte
si se pravi avtomatichno :-) Recheno-storeno - svalih si poslednata versiia 2.40 i zapochnah da razuchavam parametrite
v konfiguratsiiata. Napisah si elementaren skript na PHP, s koito prez WEB-interfeis da obnoviavam spisuka s IP adresi
i tiahnoto suotvetstvie s MAC-adresi i imena na hostove. Purvo shte pokazha moiat konfiguratsionen fail, a sled tova shte
go obiasnia zaedno s 1-2 podvodni kamuka, na koito se natuknah.

addn-hosts = /etc/dnsmasq/dns_host
expand-hosts
log-facility = /var/log/dnsmasq.log
group = nobody
listen-address = 127.0.0.1
listen-address = 192.168.0.1
listen-address = 192.168.2.1
bind-interfaces
localise-queries
bogus-priv
filterwin2k
no-resolv
no-poll
domain-needed
server = xx.xx.xx.xx
cache-size = 9000
dhcp-range=net0,192.168.0.2,192.168.0.100,10h
dhcp-range=net2,192.168.2.150,192.168.2.220,10h
#dhcp-hostsfile = /etc/dnsmasq/dhcp_host
read-ethers
domain = my-domain.com
dhcp-ignore-names
dhcp-authoritative
#log-dhcp

# This tells M$ to release their lease when they shutdown
dhcp-option=vendor:MSFT,2,1i
# Router
dhcp-option=net0,3,192.168.0.1
dhcp-option=net2,3,192.168.2.1
# DNS
dhcp-option=net0,6,192.168.0.1
dhcp-option=net2,6,192.168.2.1
# WINS server
dhcp-option=net0,44,192.168.0.1
dhcp-option=net2,44,192.168.2.1
# NetBIOS over TCP/IP Datagram Distribution Server Option
dhcp-option=net0,45,192.168.0.1
dhcp-option=net2,45,192.168.2.1
# Node type - P (Point-to-Point UDP, not generate and not accept broadcasts)
dhcp-option=net0,46,2
dhcp-option=net2,46,2
# NetBIOS over TCP/IP Scope Option (probably domain - they usually leave empty)
dhcp-option=net0,47
dhcp-option=net2,47

OPISANIE

addn-hosts = /etc/dnsmasq/dns_host - dobavia sudurzhanieto na tozi fail kum informatsiiata, prochetena ot "/etc/hosts".
Tozi fail (/etc/dnsmasq/dns_host) se generira chrez moia PHP skript i sudurzha DNS informatsiia za lokalnite potrebiteli.
Formatut mu e sushtiia kakto na "/etc/hosts"

expand-hosts - avtomatichno dobavia domein-ime kum imenata ot "/etc/hosts" i faila ot "addn-hosts", ako lipsva

group = nobody - grupata, s chiito prava da se startira DNSmasq. Po defolt e "dip", koeto men ne me ustroiva

listen-address - izbroiavat se adresite na survura, prez koito shte poluchava zaiavki. Po defolt sluhti na vsichki
dostupni interfeisi (0.0.0.0)

bind-interfaces - po defolt, dori ako se ukazhe "listen-address", DNSmasq pak sluhti na 0.0.0.0, i ignorira
zaiavkite, koito ne sa ot izbroenite interfeisi. Tova e "udobstvo", taka che ako interfeisite dinamichno si smeniat
adresite, tova ne prechi na rabotata na DNSmasq (pri men niama takava opasnost, zatova i bind-interfaces)

localise-queries - ako edno i sushto DNS ime e obiaveno za niakolko IP adresa v "/etc/hosts" (ili "addn-hosts"),
DNSmasq se opitva da vurne samo adresa, koito otgovaria na sushtata podmrezha, ot koiato idva zapitvaneto

bogus-priv - vsichki obratni zapitvaniia (toest ot IP kum domein ime) za chastni adresi (10, 172.16-31, 192.168) se
obrabotvat samo lokalno bez da se preprashtat kum DNS survura na dostavchika (ako gi niama opisani v "/etc/hosts" se
vrushta suobshtenie, che niama takuv adres)

filterwin2k - eliminira LDAP zaiavkite (tui kato potrebitelite mi ne sa v Windows-domain, a v Workgroup-i)

no-resolv - ne vzima avtomatichno adresite za DNS survurite na Internet dostavchika ot "/etc/resolv.conf", a
samo izrichno ukazanite v konfiguratsionniia fail

no-poll - ne proveriava periodichno "/etc/resolv.conf" za promeni (prilozhimo samo pri PPP i PPPoE)

domain-needed - zabraniava da se preprashtat kum DNS survura na dostavchika zaiavki za imena, koito ne sudurzhat tochka "."
Tova sa lokalni imena - ako gi niama opisani v "/etc/hosts" ili nastroikite na DHCP modula, se vrushta greshka "Not found"

server = xx.xx.xx.xx - tova e adresut na DNS survura na Internet dostavchika

cache-size = 9000 - kolko DNS otgovora ot survura na dostavchika da se keshirat (maksimuma e ustanoven na 10000
v izhodniia kod na DNSmasq)

dhcp-range=net0,192.168.0.2,192.168.0.100,10h - tazi komanda razreshava obrabotvaneto na DHCP zaiavki za suotvetnata
podmrezha, dava i ime (net0) koeto mozhe da se izpolzva sled tova v "dhcp-option" i ustanoviava vremetraeneto po podrazbirane
na razdavanite IP adresi da bude 10 chasa

#dhcp-hostsfile = /etc/dnsmasq/dhcp_host - tova beshe osnovniia prepuni-kamuk. Tozi fail se generirashe ot moia PHP
skript, v nego se opisvashe suotvetsvieto mezhdu IP i MAC adresi i se zadavaha imena na hostovete. DNSmasq uporito otkazva
da priznae tova, i pri poluchavane na zaiavka DHCPREQUEST s IP, koeto e opisano v tozi fail - vrushta otgovor DHCPNAK sus
suobshtenie "address reserved", sled koeto klienta izprashta otnovo DHCPREQUEST (tozi put bez IP) i poluchava IP-adres - samo
che NE TOZI, koito sum opisal vuv faila, a niakoi svoboden ot obhvata na "dhcp-range". Borih se niakolko dni, rovih se
v izhodniia kod - i ne mozhah da shvana zashto e napraveno taka. V dokumentatsiiata na DNSmasq e ukazano, che ako v "dhcp-range"
vmesto kraen adres se napishe klyuchovata duma "static", toi prestava da razdava dinamichno adresi - toest IP adres shte poluchat
samo klientite, chiito MAC adresi sa opisani v "dhcp-hostsfile" ili "dhcp-host" direktivi. Kogato obache go izprobvah,
poluchih greshka za DHCPDISCOVER "no address available in the range". Nakraia, absolyutno sluchaino, reshih da izprobvam kakvo
shte stane s direktivata "read-ethers". Tia e podobna na "dhcp-hostsfile" - prochita ot "/etc/ethers" suotvetstvieto mezhdu
MAC i IP adresite, no ne pozvoliava nikakvi drugi optsii (naprimer vremetraene na IP adresa, identifikator na mrezhata, na
hosta i t.n.). Formatut na faila e MAC-adres, 1 ili poveche shpatsii (ili tabulatsii) i sled tova ili IP-adres, ili ime na hosta
(no ne i dvete). I o, chudo ! Vsichko se poluchi - DNSmasq zapochna da razdava tochno posochenite IP adresi za vseki MAC adres.
Ne uspiah da otkriia nikakva informatsiia v GOOGLE za tazi ili podobna situatsiia, skoro shte pisha do avtora na DNSmasq, i pri
nuzhda shte napisha komentar kum statiiata.

read-ethers - kakto napisah po-gore, tova reshava problema za statichnoto privurzvane na MAC kum IP adres. V moia sluchai
"/etc/ethers" e simvolichna vruzka kum "/etc/dnsmasq/ethers", koito se generira ot moia PHP skript

domain = my-domain.com - fiktiven lokalen domein, mozhe da si izmislite sobstven

dhcp-ignore-names - vinagi ignorira imeto na hosta, koeto toi sam predlaga v DHCP zaiavkata, i go registrira v DNS
spisuka s imeto, koeto e zadadeno v konfiguratsionnite failove ("/etc/hosts", "/etc/ethers" ili "dhcp-hostsfile")

dhcp-authoritative - izpolzva se, kogato DNSmasq sus sigurnost e edinstveniia DHCP survur v mrezhata. Togava toi veche
ne ignorira zaiavki, koito ne e razdal toi samiia. Po tozi nachin ako se razvali faila s opisanie na razdadenite adresi
(/var/lib/misc/dnsmasq.leases) - toi se suzdava dinamichno po informatsiiata ot klientskite zaiavki. Az lichno go izpolzvam, za
da namalia vremeto za time-out pri prehod ot DHCPD kum DNSmasq (ili puk ako v mrezhata se vklyuchi laptop, koito ima lease ot
druga DHCP survur v druga mrezha)

#log-dhcp - ukazva na DNSmasq da zapisva informatsiia za DHCP zaiavkite i otgovorite v log-faila (log-queries se izpolzva
da zapisva informatsiia za DNS zaiavkite i otgovorite)

dhcp-option - izpolzvat se za ukazvane na optsii kum tsiala grupa ot klienti. Formatut e
"dhcp-option=net-id,option-id,option-value". NET-ID triabva da suvpada s tozi, zadaden v "dhcp-range" ili "dhcp-host", tova e
naimenovanieto na grupata klienti. Optsiite sa opisani v RFC2132 (http://www.faqs.org/rfcs/rfc2132.html), tochka 3. Nai-chesto
izpolzvanite sa kato tezi v moia konfiguratsionen fail (ot komentarite se vizhda prednaznachenieto im)

Makar i opisano nai-nakraia, vsushtnost tova e neshtoto, koeto triabva da proverite nai-napred - stava duma za nastroikite na
zashtitnata stena (IPtables). DHCPD e taka napisan, che v povecheto sluchai uspiava da zaobikoli IPtables vutre v samoto iadro.
Taka che, dori DHCPD da e rabotil vuv vashata mrezha - tova ne znachi, che i DNSmasq shte zaraboti. Po-konkretno, triava da ste
uvereni, che za vsichki interfeisi, na koito sluhti DNSmasq e razresheno poluchavaneto na paketi s iztochnik 0.0.0.0 i
poluchatel 255.255.255.255. Inache shte se chudite zashto DHCPD si razdava adresi s kef, a puk DNSmasq siakash izobshto ne useshta
zaiavkite :-)

Dokumentatsiiata na DNSmasq e dosta pesteliva, a i v meiling-listite ne zabeliazah dostatuchno spetsialisti - taka che puskaneto
mu v deistvie e edno malko predizvikatelstvo. No puk spored men za ne osobeno natovareni mrezhi uspeshno mozhe da zameni
BIND i DHCPD.

Iskashe mi se da publikuvam i PHP skripta za elementarniia WEB interfeis, no mozhe bi e po-dobre napravo da dam link. Slozhil
sum go na bezplaten survur - taka che sled 30-ina dni linka shte bude neaktiven. No vseki zhelaesht mozhe da mi prati PM s emaila
si, i shte mu go izpratia. A linkut e
http://rapidshare.com/files/86787611/dn...
http://www.zshare.net/download/68957842...
http://www.uploading.com/files/G92VLP4M...


Tablitsite v bazata danni imat sledniia format:

DROP TABLE IF EXISTS `host`;

CREATE TABLE `host` (
 `NET` tinyint(3) unsigned NOT NULL default '0',
 `IP` tinyint(3) unsigned NOT NULL default '0',
 `MAC` varchar(12) NOT NULL,
 `PERSON` varchar(24) NOT NULL,
 PRIMARY KEY  (`NET`,`IP`),
 UNIQUE KEY `MAC` (`MAC`),
 UNIQUE KEY `PERSON` (`PERSON`)
) ENGINE=MyISAM /*!40100 DEFAULT CHARSET=cp1251*/;

DROP TABLE IF EXISTS `mreza`;

CREATE TABLE `mreza` (
 `ID` tinyint(3) unsigned NOT NULL default '0',
 `MREZA` varchar(20) NOT NULL,
 PRIMARY KEY  (`MREZA`,`ID`)
) ENGINE=MyISAM /*!40100 DEFAULT CHARSET=cp1251*/;


<< | >>