= DnsMasq = Questa e` una configurazione "media" commentata per Dnsmasq di Debian 8, con funzione di dns proxy e di dhcp server. Se si usa il ppp per connettersi, e` possibile indicare come resolv-file il file {{{/etc/ppp/resolv.conf}}} che contiene i DNS passati dal provider al momento della connessione. Il file e` /etc/dnsmasq.conf {{{ # Configuration file for dnsmasq. # Non servire questa interfaccia, ma tutte le altre si. # Se non si imposta questa opzione in Debian 8 dnsmasq non risponde # alle query non locali alla LAN (vedi il paramentro local-service # che si trova dentro a /etc/init.d/dnsmasq. except-interface=eth1 # Never forward plain names (with a dot or domain part) domain-needed # Never forward addresses in the non-routed address spaces. bogus-priv # imposto un TTL per i record locali serviti dal dns ai client (vengono da /etc/hosts) local-ttl=5 # block win2k dns requests filterwin2k # resolv.conf alternativo (creare il file!) resolv-file=/etc/resolv.conf.dnsmasq # Add local-only domains here, queries in these domains are answered # from /etc/hosts or DHCP only. local=/dominio.locale/ # If you want dnsmasq to listen for requests only on specified interfaces # (and the loopback) give the name of the interface (eg eth0) here. # Repeat the line for more than one interface. #interface= # Aggiungi un dominio alle entry del file hosts che non hanno dominio (vedi "domain") expand-hosts # niente cache per i risultati negativi no-negcache # log log-queries # DHCP options # il dominio per gli host assegnati dal DHCP domain=dominio.locale # range delle macchine servite dhcp-range=192.168.3.10,192.168.3.100,240h # il server e` autoritativo dhcp-authoritative # Opzioni DHCP # 1- subnet mask # 3- default gateway # 6- dns server # 28- broadcast address # 44- wins server # 46- netbios node type dhcp-option=44,192.168.3.1 # host statici, uno per riga (mac,ip) #dhcp-host=11:22:33:44:55:66,192.168.0.60 # If this line is uncommented, dnsmasq will read /etc/ethers and act # on the ethernet-address/IP pairs found there just as if they had # been given as --dhcp-host options. Useful if you keep # MAC-address/host mappings there for other purposes. #read-ethers }}} == DHCP su piu` interfacce == Se si vuole servire il DHCP su piu` interfacce, e` possibile farlo, ed e` anche possibile dividere le configurazioni in modo che gli host su una interfaccia prendano impostazioni (dns, gateway, eccetera) diverse rispetto a quelli sull'altra interfaccia. {{{ dhcp-range=osimo,172.16.0.100,172.16.0.200,255.255.255.0,240h dhcp-range=kurgan,10.1.45.100,10.1.45.200,255.255.255.0,240h dhcp-option=osimo,44,10.0.0.251,172.16.0.1 dhcp-option=kurgan,44,10.1.42.254 }}} == Host sulla rete con gateway o dns o altre opzioni diverse == Se occorre per esempio dirigere alcuni host sulla rete a usare un gateway o un dns specifico, e` possibile farlo usando la direttiva "dhcp-host" e la direttiva dhcp-option con una indicazione di nome di una rete. In questo esempio la macchina indicata nel dhcp-host prende un ip dinamico dal pool generale, pero` prende come gateway un gateway speciale che non e` quello che usano tutti. {{{ # per i client del CED, che sono definiti in dhcp-host dopo, voglio un gateway diverso. dhcp-option=ced,3,10.3.0.10 # host del CED: prendono delle opzioni differenti per gateway e dns dhcp-host=00:19:99:35:8b:b8,net:ced }}} == Integrazione Bind - Dnsmasq == Puo` essere comodo installare bind per avere un resolver ricorsivo e anche dnsmasq per avere le sue funzioni accessorie (dhcp, ecc) sulla stessa macchina. Per farlo, e` sufficiente dire a Bind di ascoltare su una porta diversa dal default, e a Dnsmasq di interrogare Bind su quella porta. Su Debian, la configurazione e` la seguente: * File /etc/bind/named.conf.options {{{ // configurazione per interagire con dnsmasq // ascolto in locale su 127.0.0.1 porta 5353 (e in nessun altro posto) listen-on port 5353 { 127.0.0.1; }; // consento la ricorsione per dnsmasq che mi interroga allow-recursion { 127.0.0.1/8; }; }}} * File /etc/default/bind9 (per disattivare ipv6 in toto se non lo si usa) {{{ OPTIONS="-u bind -4" }}} * File /etc/dnsmasq.conf {{{ # non leggere il resolv.conf, usa solo il server indicato: no-resolv server=127.0.0.1#5353 }}} == Integrazione Unbound - Dnsmasq == Come sopra, si puo` usare unbound come resolver per Dnsmasq. Utile su openwrt per esempio dove lo spazio e` poco per installare bind. * Unbound va configurato per rispondere su una porta non standard, modificando unbound.conf come segue: {{{ interface: 127.0.0.1@5353 }}} * Dnsmasq si configura come sopra. * Su openwrt in particolare si configura con la sua sintassi, modificando il file {{{/etc/config/dhcp}}} con questi parametri: {{{ list server '127.0.0.1#5353' option noresolv '1' }}} == Integrazione Openvpn - Dnsmasq == Lo scopo di questa configurazione e` permettere una integrazione fra openvpn e dnsmasq, in modo che i nomi dei client che si connettono via Openvpn siano risolvibili a mezzo di Dnsmasq. Questa configurazione serve quando si usa openvpn in modalita` tunnel (device tun) e non in modalita` bridge (device tap) perche` nel secondo caso il client remoto prende comunque il suo IP dal DHCP server della rete locale, e quindi dnsmasq viene a conoscenza dell' ip ad esso assegnato banalmente tramite il suo stesso server DHCP. Nel primo caso, invece, Dnsmasq non ha idea di quali IP siano assegnati da openvpn ai client. Questa configurazione mira a risolvere questo problema. Nota bene: gli hostname assegnati sono uguali ai common name dei certificati openvpn, quindi questi vanno creati in modo da essere tipicamente uguali agli hostname. Per esempio, supponiamo di avere un portatile che si chiama "ghisa" come hostname e quindi viene visto, quando e` in rete LAN, come "ghisa.kurgan.locale" (dove il dominio "kurgan.locale" viene aggiunto da Dnsmasq ai nomi che non hanno dominio). Vogliamo che questo portatile si chiami allo stesso modo anche quando e` in VPN, in modo che quando noi risolviamo il nome "ghisa.kurgan.locale" vedremo l' IP della LAN se e` in LAN,e quello della VPN se e` in VPN. Per fare questo, dovremo creare il certificato per questo portatile con il common name "ghisa". * Configurare Dnsmasq: In dnsmasq.conf dobbiamo aggiungere queste righe {{{ # files host addizionale, da usarsi per il dns dinamico con i client openvpn addn-hosts=/etc/openvpn/hosts }}} * Configurare openvpn: nella config della nostra vpn dobbiamo aggiungere queste righe: {{{ # script per aggiornare il file hosts specifico dei client della vpn script-security 2 client-connect /etc/openvpn/update-hosts-file.sh client-disconnect /etc/openvpn/update-hosts-file.sh }}} * Creare lo script con nome {{{/etc/openvpn/update-hosts-file.sh}}} con dentro questo contenuto: {{{ #!/bin/bash # this script updates (creates or deletes rows) an hosts-like file # that will be read by dnsmasq. After each update, it sends a HUP signal to dnsmasq # environment variables in use: # script_type can be "client-disconnect" or "client-connect" # common_name is the certificate common name. I will use it as the hostname for dynamic DNS # ifconfig_pool_remote_ip is the remote client ip address. I will use it for dynamic DNS # configuration parameters: HOSTSFILE=/etc/openvpn/hosts/hostfile.txt # if I'm connecting: if [ "$script_type" == "client-connect" ]; then # delete any row that ends in " common_name" # regardless of ip address. # There can be only one unique host name anyway sed -i "/ $common_name$/d" $HOSTSFILE # insert a row with our client ip address and common name echo "$ifconfig_pool_remote_ip $common_name" > $HOSTSFILE fi # if I'm disconnecting: if [ "$script_type" == "client-disconnect" ]; then # delete any row that ends in " common_name" # regardless of ip address. # There can be only one unique host name anyway sed -i "/ $common_name$/d" $HOSTSFILE fi # send HUP signal to dnsmasq # requires proper sudoers config sudo /usr/bin/killall -HUP dnsmasq # always exit zero, or openvpn will fail to connect. exit 0 }}} * Rendere lo script eseguibile per chiunque (dovra` girare con l'utente di openvpn, che nella mia config standard e` "nobody") {{{ chmod ugo+x /etc/openvpn/update-hosts-file.sh }}} * Creare la directory che conterra` il file hosts (come indicata nello script e nella config di dnsmasq) e darle i permessi giusti per "nobody" {{{ mkdir /etc/openvpn/hosts chown nobody. /etc/openvpn/hosts }}} * Installare "sudo" se non l'avete (e killall) * Configurare sudo per permettere a nobody di dare un "killall -HUP dnsmasq", eseguendo {{{visudo}}} e inserendo questa riga nella configurazione: {{{ # nobody puo` sighuppare dnsmasq nobody ALL=(root) NOPASSWD: /usr/bin/killall -HUP dnsmasq }}} * Riavviare dnsmasq e openvpn per ricaricare le configurazioni.